Springboot插件集成(二)- MyBatis增强插件Mybatis-Plus

356 阅读3分钟

前言

MyBatis大家肯定都有所了解,那今天要讲的这个MyBatisPlus是什么呢?顾名思义,plus就是更强、更NB的意思,那有同学就要问了,我项目好好的,干嘛要用的这个。那回答来了,首先MyBatisPlus是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,内置基本常用的CRUD方法,支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,内置分页插件等。有兴趣的可以去MP官网查看详细文档-MyBatisPlus

闲话不说了,开始集成。

一、数据表创建

DROP TABLE IF EXISTS t_user;

CREATE TABLE t_user
(
  id      BIGINT (20) NOT NULL COMMENT '主键ID',
  name    VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
  age     INT (11) NULL DEFAULT NULL COMMENT '年龄',
  email   VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
 `create_time` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (id)
);

INSERT INTO t_user (id,`name`,age,email)
VALUE
(1,'test1',20,'test1@mp.com'),
(2,'test2',23,'test2@mp.com')

二、MP配置

1、引入依赖

在pom文件中引入

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-test</artifactId>
     <scope>test</scope>
 </dependency>
 <dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <optional>true</optional>
 </dependency>
<!-- 数据库驱动-->
 <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>8.0.26</version>
 </dependency>
 <!--mybatis-plus-->
 <dependency>
     <groupId>com.baomidou</groupId>
     <artifactId>mybatis-plus-boot-starter</artifactId>
     <version>3.5.0</version>
 </dependency>
 <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.12</version>
     <scope>test</scope>
 </dependency>

2、配置application

spring:
  profiles:
    active: dev
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/testdb?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
    username: root
    password: root
#日志输出  
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl    

3、添加业务代码

实体类

@Data
@TableName("t_user")
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

mapper接口

@Repository
public interface UserMapper  extends BaseMapper<User> {

}

注意!! 需要在启动类上去扫描我们的mapper包下的所有接口 @MapperScan(" com.springboot.mp.mapper") 根据你自己项目的mapper实际位置

4、测试

测试类

@RunWith(SpringRunner.class)
@SpringBootTest()
public  class MpApplicationTests {
    @Autowired
    UserMapper userMapper;
    @Test
   public void list() {
        List<User> users = userMapper.selectList(null);
        users.stream().forEach(item-> System.out.println(item.toString()));
    }

}

测试结果

image.png

三、扩展

1、字段自动填充

创建时间、修改时间这两个字段操作肯定都应该自动化完成。

(1) 在之前创建的User类中添加

@TableField(fill = FieldFill.INSERT)
private Data createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Data updateTime;

(2) 创建MpMetaObjectHandler类

@Slf4j
@Component
public class MpMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        try {
            //根据属性名字设置要填充的值
            if (metaObject.hasGetter("createTime")) {
                this.setFieldValByName("createTime", new Date(), metaObject);
            }
            if (metaObject.hasGetter("updateTime")) {
                this.setFieldValByName("updateTime", new Date(), metaObject);
            }

        } catch (Exception e) {
            log.warn("自动注入异常");

        }
        updateFill(metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        try {

            if (metaObject.hasGetter("updateTime")) {
                this.setFieldValByName("updateTime", new Date(), metaObject);
            }
        } catch (Exception e) {
            log.warn("自动注入异常");
        }
    }
}

(3) 测试

在刚才的测试类中新建添加的测试方法

@Test
public void insert() {
    User user = new User();
    user.setId(5L);
    user.setName("test3");
    user.setAge(26);
    user.setEmail("test3@mp.com");
    userMapper.insert(user);
}

运行结果

image.png

查看数据库发现新增的数据创建时间、修改时间已自动注入

image.png

2、条件构造器

MP内置了很多CRUD方法,但是如果这些方法都不满足你业务需求该什么办呢?来看看MP条件构造器吧。

测试方法

@Test
public void getUserByAge(){

    List<User> users = userMapper.selectList(new QueryWrapper<User>().lambda().eq(User::getAge, 26));
    users.stream().forEach(item-> System.out.println(item.toString()));
}

结果

image.png

可以看到已经查到了我们想要的结果,还有很多条件构造器,我就不一一演示了,有兴趣可以去官网查看。

3、分页插件

(1) 编写MP配置类

@Configuration
// 指定要扫描的Mapper类的包的路径
@MapperScan("com.springboot.mp.mapper")
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 分页插件
        interceptor.addInnerInterceptor(paginationInnerInterceptor());

        return interceptor;
    }

    /**
     * 分页插件,自动识别数据库类型
     */
    public PaginationInnerInterceptor paginationInnerInterceptor() {
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        // 设置数据库类型为mysql
        paginationInnerInterceptor.setDbType(DbType.MYSQL);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        paginationInnerInterceptor.setMaxLimit(-1L);
        return paginationInnerInterceptor;
    }

}

(2) 编写UserMapper,新增page方法

IPage<User> page(Page<User> page);

(3) 编写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.springboot.mp.mapper.UserMapper">
    <select id="page" resultType="com.springboot.mp.domain.User">
        select * from user
    </select>
</mapper>

(4) 测试

测试类

 @Test
public void list() {
     Page<User> page = new Page<>(1, 1);// 页数,每页条数
     IPage<User> iPage = userMapper.page(page);
     System.out.println(iPage);
     System.out.println("总页数:" + iPage.getPages());
     System.out.println("总记录数:" + iPage.getTotal());


 }

结果

image.png

到此为止,MP集成配置基本就完事了。其实MP还有很多可以扩展的地方,比如逻辑删除、通用枚举、乐观锁等,有兴趣大家可以去了解一下,或者评论下对那个感兴趣,我这边有时间可以更新一下内容。