参考:
http://www.ityouknow.com/springboot/2016/11/06/spring-boo-mybatis.html
https://github.com/pagehelper/pagehelper-spring-boot
1 无xml整合
无xml
整合就是不使用*.xml
文件,全部都是用注解来绑定SQL
。
1.1 引入mybatis-spring-boot-starter
SpringBoot
整合Mybatis
,首先需要引入mybatis-spring-boot-starter
依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
mybatis-spring-boot-starter
将会:
- 自动检测存在的
DataSource
。 - 将会使用
SqlSessionFactoryBean
创建并注册一个SqlSessionFactory
实例,并配置DataSource
。 - 将会基于
SqlSessionFactory
创建并注册一个SqlSessionTemplate
实例。 - 自动扫描
@Mapper
注解类,并关联SqlSessionTemplate
,将它们注册到Spring Context
中。
1.2 数据源和mybatis配置
这里以postgresql
为例。
首先,需要在pom.xml
中引入postgresql
驱动:
<!-- postgresql驱动 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
然后,需要在application.properties
配置文件中配置数据源:
# 配置数据源
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/springbootstarter?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=postgres
spring.datasource.password=password
进行简单的Mybatis
配置,所有可配置属性请查看 这里 和 这里:
# Mybatis基本配置
# 自动驼峰命名转换
mybatis.configuration.map-underscore-to-camel-case=true
# 设置驱动等待数据库返回response的超时时间,单位(秒)
mybatis.configuration.default-statement-timeout=30
1.3 使用@MapperScan
有两种方法可以让Mybatis
检测到mapper
,也就是Dao
。一种是在每个mapper
上面添加@Mapper
注解,一种是通过在启动类(配置类)上添加@MapperScan
注解来指定mapper
的位置。推荐使用第二种:
可以在启动类Application
上添加@MapperScan
:
@SpringBootApplication
@MapperScan({"com.tao.springbootstarter.web.dao", "com.tao.springbootstarter.core.dao"})
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
// 执行run方法
app.run(args);
}
}
@MapperScan
支持指定一个或多个package
路径。
1.4 编写Dao
在@MapperScan
指定的package
路径下编写Dao
。
以UserDao
为例:
public interface UserDao {
/**
* 获得所有的用户
*
* @return
*/
@Select("select user_id, username, password, create_time from tb_user")
@Results(id = "baseResultMap", value = {
@Result(column = "user_id", property = "userId", jdbcType = JdbcType.VARCHAR, javaType = String.class),
@Result(column = "username", property = "username", jdbcType = JdbcType.VARCHAR, javaType = String.class),
@Result(column = "password", property = "password", jdbcType = JdbcType.VARCHAR, javaType = String.class),
@Result(column = "create_time", property = "createTime", jdbcType = JdbcType.TIMESTAMP, javaType = Timestamp.class)
})
List<User> list();
/**
* 根据username获取User对象
*
* @param username
* @return
*/
@Select("select user_id, username, password, create_time from tb_user where username = #{username}")
@ResultMap("baseResultMap")
User queryUserByUsername(@Param("username") String username);
}
这里使用了注解来绑定SQL
语句:
@Select
是查询类的注解,所有的查询均使用这个。@Result
修饰返回的结果集,关联实体类属性和数据库字段一一对应,如果实体类属性和数据库属性名保持一致,就不需要这个属性来修饰。@Insert
插入数据库使用,直接传入实体类会自动解析属性到对应的值。@Update
负责修改,也可以直接传入对象。@Delete
负责删除。
为了简化代码,减少不必要的重复编写@Results
,可以给@Results
设置一个id
,然后就可以使用@ResultMap
来引用它。
注意,使用#符号和$符号的不同:
// This example creates a prepared statement, something like select * from teacher where name = ?;
@Select("Select * from teacher where name = #{name}")
Teacher selectTeachForGivenName(@Param("name") String name);
// This example creates n inlined statement, something like select * from teacher where name = 'someName';
@Select("Select * from teacher where name = '${name}'")
Teacher selectTeachForGivenName(@Param("name") String name);
User
类的编写不再赘述。
1.5 使用
这里省略Service
层的编写,直接在Controller
注入UserDao
:
@RestController
@RequestMapping("/userService")
public class UserController {
@Resource
private UserDao userDao;
@GetMapping("/users")
public List<User> getAllUsers() {
return userDao.list();
}
@GetMapping("/users/username/{username}")
public User getUserByUsername(@PathVariable("username") String username) {
return userDao.queryUserByUsername(username);
}
}
2 基于xml整合
基于xml
就是不使用注解来绑定SQL
,而是用*.xml
文件来管理SQL
。
2.1 引入mybatis-spring-boot-starter
SpringBoot
整合Mybatis
,首先需要引入mybatis-spring-boot-starter
依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
2.2 数据源和mybatis配置
这里以postgresql
为例。
首先,需要在pom.xml
中引入postgresql
驱动:
<!-- postgresql驱动 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
然后,需要在application.properties
配置文件中配置数据源:
# 配置数据源
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/springbootstarter?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=postgres
spring.datasource.password=password
基于
xml
整合,需要配置*.xml
的位置。
在application.properties
文件中添加两行:
# 指定mybatis的配置文件的位置
mybatis.config-location=classpath:mybatis/mybatis-config.xml
# 指定mapper文件的位置
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
在mybatis-config.xml
文件中可以进行mybatis
的一些基础配置,例如:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置全局属性 -->
<settings>
<!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 -->
<setting name="useGeneratedKeys" value="true"/>
<!-- 使用列别名替换列名 默认:true -->
<setting name="useColumnLabel" value="true"/>
<!-- 开启驼峰命名自动转换 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 打开延迟加载的开关,默认为true -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 设置驱动等待数据库返回response的超时时间,单位(秒) -->
<setting name="defaultStatementTimeout" value="30"/>
</settings>
<!-- 配置类型别名 -->
<typeAliases>
<typeAlias type="java.lang.Integer" alias="Integer"/>
<typeAlias type="java.lang.String" alias="String"/>
<typeAlias type="java.lang.Long" alias="Long"/>
<typeAlias type="java.util.ArrayList" alias="ArrayList"/>
<typeAlias type="java.util.LinkedList" alias="LinkedList"/>
<typeAlias type="java.util.HashMap" alias="HashMap"/>
<typeAlias type="java.util.LinkedHashMap" alias="LinkedHashMap"/>
</typeAliases>
</configuration>
2.3 使用@MapperScan
和前边一样,可以在启动类Application
上添加@MapperScan
:
@SpringBootApplication
@MapperScan({"com.tao.springbootstarter.web.dao", "com.tao.springbootstarter.core.dao"})
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
// 执行run方法
app.run(args);
}
}
@MapperScan
支持指定一个或多个package
路径。
2.4 编写Dao
编写Dao
的时候不需要使用@Select
等注解。
以UserDao
为例:
public interface UserDao {
/**
* 获得所有的用户
*
* @return
*/
List<User> list();
/**
* 根据username获取User对象
*
* @param username
* @return
*/
User queryUserByUsername(@Param("username") String username);
}
2.5 编写mapper文件
每个Dao
需要编写一个对应的mapper
文件,需要放在mybatis.mapper-locations
指定的位置。
以UserDao.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="com.tao.springbootstarter.web.dao.UserDao">
<resultMap id="baseResultMap" type="com.tao.springbootstarter.web.entity.User">
<id column="user_id" property="userId" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result column="username" property="username" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result column="password" property="password" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" javaType="java.sql.Timestamp"/>
</resultMap>
<select id="list" resultMap="baseResultMap">
SELECT
user_id,
username,
password,
create_time
FROM tb_user
</select>
<select id="queryUserByUsername" parameterType="java.lang.String" resultMap="baseResultMap">
SELECT
user_id,
username,
password,
create_time
FROM tb_user
WHERE username = #{username}
</select>
</mapper>
2.6 使用
这里省略Service
层的编写,直接在Controller
注入UserDao
:
@RestController
@RequestMapping("/userService")
public class UserController {
@Resource
private UserDao userDao;
@GetMapping("/users")
public List<User> getAllUsers() {
return userDao.list();
}
@GetMapping("/users/username/{username}")
public User getUserByUsername(@PathVariable("username") String username) {
return userDao.queryUserByUsername(username);
}
}
3 整合PageHelper
3.1 添加pagehelper-spring-boot-starter依赖
需要在pom.xml
文件中添加pagehelper-spring-boot-starter
依赖:
<!-- 整合PageHelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.10</version>
</dependency>
3.2 配置
在application.properties
文件中对PaheHelper
进行基本配置:
# PageHelper基本配置
###########################################################
# 配置数据库类型
pagehelper.helperDialect=postgresql
# 分页合理化参数,默认值为false。
# 当该参数设置为 true 时,pageNum<=0 时会查询第一页; pageNum>pages(超过总数时),会查询最后一页.
# 默认false 时,直接根据参数进行查询。
pagehelper.reasonable=true
# 支持通过 Mapper 接口参数来传递分页参数,默认值false
pagehelper.supportMethodsArguments=true
完整参数说明请参考:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md
3.3 使用
经过以上配置,就可以使用PageHelper
了。