SpringBoot-集成Mybatis-Plus

120 阅读3分钟

image.png

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);
    }

}

测试效果

image.png

至此,Mybatis-Plus集成成功。

有关分页的东西,Mybatis-Plus也有封装插件 PaginationInnerInterceptor ,这里不赘述了。

笔者比较习惯使用PageHelper分页插件,可参考我另一篇文章 集成PageHelper分页插件 实现分页。


(完)

纸上得来终觉浅,绝知此事要躬行。