MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。(摘自官网介绍)
为了更方便的使用Mybatis这个持久层框架,本文介绍如何在 SpringBoot 集成Mybatis-plus。
新建SpringBoot工程
首先我们创建一个 SpringBoot 项目(本文以 SpringBoot 2.0.6.RELEASE为例),jdk版本 1.8,这里不再赘述创建过程。
数据库准备
CREATE TABLE `tbl_user` (
`user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_name` varchar(30) DEFAULT NULL COMMENT '姓名',
`user_age` int(11) DEFAULT NULL COMMENT '年龄',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
随便录入几条用户数据,用于测试接口。
pom.xml添加相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<!-- druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
<!-- mysql连接 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
application.yml 项目配置
# *Mapper.xml位置
mybatis-plus:
mapper-locations: classpath:/mapper/*Mapper.xml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/demo?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=GMT%2B8
username: root
password: 123456
# Druid连接池配置
druid:
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1
#申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
testWhileIdle: true
#配置从连接池获取连接时,是否检查连接有效性,true每次都检查;false不检查。做了这个配置会降低性能。
testOnBorrow: false
#配置向连接池归还连接时,是否检查连接有效性,true每次都检查;false不检查。做了这个配置会降低性能。
testOnReturn: false
#打开PsCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
#合并多个DruidDatasource的监控数据
useGlobalDataSourceStat: true
#通过connectProperties属性来打开mergesql功能;慢sQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;
这里我使用的 druid 连接池,单论使用Mybatis-Plus来说,druid连接池不是必要的。
编写测试代码
以用户信息的增删改查为例。
User实体类
@Data //lombok简化样板代码
@TableName("tbl_user") //指定数据库表名
public class User{
//指定表主键,数据库ID自增
@TableId(value = "user_id",type = IdType.AUTO )
private Long userId;
private String userName;
private Integer userAge;
}
UserMapper
@Repository
public interface UserMapper extends BaseMapper<User> {
User getUserByName(@Param("userName") String userName);
}
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="com.abiao.demo.mapper.UserMapper">
<select id="getUserByName" resultType="com.abiao.demo.domain.User">
select user_id,user_age,user_name from tbl_user where user_name=#{userName}
</select>
</mapper>
UserService
public interface UserService extends IService<User> {
int insertUser(User user);
int updateUser(User user);
int deleteUser(User user);
User findUserByName(String userName);
User getUserById(Long id);
}
UserServiceImpl
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public int insertUser(User user) {
return baseMapper.insert(user);
}
@Override
public int updateUser(User user) {
return baseMapper.updateById(user);
}
@Override
public int deleteUser(User user) {
return baseMapper.deleteById(user.getUserId());
}
@Override
public User findUserByName(String userName) {
return userMapper.getUserByName(userName);
}
@Override
public User getUserById(Long id) {
return baseMapper.selectById(id);
}
}
UserController
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/insert")
public Object insert(@RequestBody User user){
return userService.insertUser(user);
}
@PostMapping("/update")
public Object update(@RequestBody User user){
return userService.updateUser(user);
}
@PostMapping("/delete")
public Object delete(@RequestBody User user){
return userService.deleteUser(user);
}
@GetMapping("/getUserByName")
public Object getUserByName(@RequestParam String userName){
return userService.findUserByName(userName);
}
}
测试效果
至此,Mybatis-Plus集成成功。
有关分页的东西,Mybatis-Plus也有封装插件 PaginationInnerInterceptor ,这里不赘述了。
笔者比较习惯使用PageHelper分页插件,可参考我另一篇文章 集成PageHelper分页插件 实现分页。
(完)
纸上得来终觉浅,绝知此事要躬行。