项目整体目录结构:
一、首先还是雷打不动的引入项目所需依赖Jar包(不涉及前文中已有的Jar包)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.1</version>
</dependency>
二、src\main\resources目录下创建mybatis目录,并新建mybatis-config.xml,可配置全局信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 开启二级缓存(myBatis默认开启一级缓存) -->
<setting name="cacheEnabled" value="true" />
<!-- 允许JDBC支持生成的键,需要适合的驱动,比如:SQL保存操作后可以返回数据库自动生成的主键ID -->
<setting name="useGeneratedKeys" value="true" />
<!-- SQL执行器设置(三种:SIMPLE、REUSE、BATCH) -->
<setting name="defaultExecutorType" value="REUSE" />
<!-- 映射map时,字段值为null也返回字段名称 -->
<setting name="callSettersOnNulls" value="true"/>
</settings>
<!-- 此处可以配置实体类信息 -->
<!--
<typeAliases>
<typeAlias type="com.example.demo.entity.User" alias="User"/>
</typeAliases>
-->
</configuration>
三、创建数据访问层DAO(DAO.java及DaoSupport.java文件)
数据访问接口类 DAO.java:
package com.example.demo.dao;
public interface Dao {
/**
* 保存对象
* @param str
* @param obj
* @return
* @throws Exception
*/
public Object save(String str, Object obj) throws Exception;
/**
* 修改对象
* @param str
* @param obj
* @return
* @throws Exception
*/
public Object update(String str, Object obj) throws Exception;
/**
* 删除对象
* @param str
* @param obj
* @return
* @throws Exception
*/
public Object delete(String str, Object obj) throws Exception;
/**
* 查找对象
* @param str
* @param obj
* @return
* @throws Exception
*/
public Object findForObject(String str, Object obj) throws Exception;
/**
* 查找对象
* @param str
* @param obj
* @return
* @throws Exception
*/
public Object findForList(String str, Object obj) throws Exception;
}
数据访问实现类DaoSupport.java:
package com.example.demo.dao;
import javax.annotation.Resource;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;
@Repository("daoSupport")
public class DaoSupport implements Dao {
@Resource(name = "demoSqlSessionTemplate")
private SqlSessionTemplate demoSqlSessionTemplate;
/**
* 保存对象
* @param str
* @param obj
* @return
* @throws Exception
*/
public Object save(String str, Object obj) throws Exception {
return demoSqlSessionTemplate.insert(str, obj);
}
/**
* 修改对象
* @param str
* @param obj
* @return
* @throws Exception
*/
public Object update(String str, Object obj) throws Exception {
return demoSqlSessionTemplate.update(str, obj);
}
/**
* 删除对象
* @param str
* @param obj
* @return
* @throws Exception
*/
public Object delete(String str, Object obj) throws Exception {
return demoSqlSessionTemplate.delete(str, obj);
}
/**
* 查找对象
* @param str
* @param obj
* @return
* @throws Exception
*/
public Object findForObject(String str, Object obj) throws Exception {
return demoSqlSessionTemplate.selectOne(str, obj);
}
/**
* 查找对象
* @param str
* @param obj
* @return
* @throws Exception
*/
public Object findForList(String str, Object obj) throws Exception {
return demoSqlSessionTemplate.selectList(str, obj);
}
}
四、src\main\java\com\example\demo目录下创建config目录,用以存放项目配置相关信息
SQLSettings.java:
package com.example.demo.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "spring.datasource")
public class SQLSettings {
private String driverClassName;
private String url;
private String username;
private String password;
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
DataSourceConfig.java:
package com.example.demo.config;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import com.alibaba.druid.pool.DruidDataSource;
@Configuration
//扫描注入数据访问层dao
@MapperScan(basePackages = "com.example.demo.dao", sqlSessionTemplateRef = "demoSqlSessionTemplate")
public class DataSourceConfig {
@Autowired
private SQLSettings sqlSettings;
@Bean(name = "demoDataSource")
@ConfigurationProperties("spring.datasource.*")
public DataSource DataSource(DataSourceProperties properties) throws Exception{
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(sqlSettings.getDriverClassName());
dataSource.setUrl(sqlSettings.getUrl());
dataSource.setUsername(sqlSettings.getUsername());
dataSource.setPassword(sqlSettings.getPassword());
return dataSource;
}
@Bean(name="demoSqlSessionFactroy")
public SqlSessionFactory yonSqlSessionFactroy(@Qualifier("demoDataSource") DataSource dataSource) throws Exception{
SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//注入mybatis配置信息
bean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml"));
//加载Mapper映射文件
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/*/*.xml"));
return bean.getObject();
}
@Primary
@Bean(name="demoSqlSessionTemplate")
public SqlSessionTemplate yonSqlSessionTemplate(@Qualifier("demoSqlSessionFactroy") SqlSessionFactory sqlSessionFactory) throws Exception{
return new SqlSessionTemplate(sqlSessionFactory);
}
}
以上,即是本框架一次性配置的文件信息,后期开发过程中可以一劳永逸,只需关注controller和service的业务实现即可。具体使用:
Controller:
package com.example.demo.controller;
import java.util.HashMap;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
@Controller
public class UserController {
@Resource(name="userService")
private UserService userService;
@RequestMapping("/getUser")
public String getUser(Model model){
try {
HashMap<String, Object> paramMap=new HashMap<>();
paramMap.put("userName", "王");
paramMap.put("userSex", "男");
List<User> userList = userService.getUserList(paramMap);
model.addAttribute("userList",userList);
} catch (Exception e) {
e.printStackTrace();
}
return "user/userHtm";
}
}
Service.java:
package com.example.demo.service;
import java.util.HashMap;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.example.demo.dao.Dao;
import com.example.demo.entity.User;
@Service
public class UserService {
@Resource(name = "daoSupport")
private Dao dao;
public List<User> getUserList(HashMap<String, Object> paramMap) throws Exception {
//UserMapper为mapper(xml)文件名,getUserList为SQL的id
return (List<User>) dao.findForList("UserMapper.getUserList", paramMap);
}
}
UserMapper.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="UserMapper">
<select id="getUserList" parameterType="map" resultType="map">
select
userName,
userSex,
userBirth
from user_info
where 1=1
<if test="userSex !=null and userSex !=''">
and userSex=#{userSex}
</if>
<if test="userName !=null and userName !=''">
and userName like CONCAT('%',#{userName},'%')
</if>
</select>
</mapper>
请求测试:
总结:每一种主流框架的项目结构都不是千篇一律的,每个人有每个人的设计思想,适合自己的就是最好的~