一:Mybatis-Plus特性
mybatis-plus是对mybatis的增强,只做了增强没有进行修改。mybatis-plus内置了分页插件、封装了单表的增删改查方法。使用mybatis-plus可以简化我们的开发、提高我们的效率。mybatis-plus具有一下几种特性
-
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
-
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
-
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
-
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错 JDK1.
-
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
-
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
-
支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
-
内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
-
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
-
分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
-
内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
-
内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
二:springboot整合mybatis-plus
springboot整合mybatis-plus只需要加入mybatis-plus依赖即可,其他连接数据库的配置与springboot整合mybatis一样。只不过不需要进行mapper包的扫描了。
1.加入依赖
<!-- mybatis-plus依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
2.删除配置文件中的扫描mapper包的配置
# 配置数据源
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis-plus
spring.datasource.username=root
spring.datasource.password=803929.0
# 打印日志
logging.level.com.hyn.springboot04.dao=debug
3.修改dao接口,因为mybatis-plus对单表的增删改查进行了封装,所以无需再编写mapper文件。
mybatis-plus中dao接口需要继承BaseMapper类,并且加上对应的实体类泛型,对哪个表进行的操作,泛型就是那个表的实体类。
package com.hyn.springboot04.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hyn.springboot04.entity.User;
import org.apache.ibatis.annotations.Mapper;
/**
* 创建接口,继承 BaseMapper 传入的泛型是对应表的实体类
*/
@Mapper
public interface UserDao extends BaseMapper<User> {
}
三:使用mybatis-plus实现增删改查
因为mybatis-plus已经对单表的增删改查操作进行了封装,所以我们不用再去编写mapper文件,不用写sql语句,直接创建service层,创建业务层de接口和对应的实现类即可。
mybatis-plus对于数据库表中的主键的自增进行了增强,在之前使用mybatis的时候,如果同一时间点上,两个用户同时进行注册操作,数据库表自带的新增就会同时创建两行主键值相同的数据。这样就会报错。mybatis-plus中,加入了四种主键自增策略,只需要在实体类中主键的字段上加上注解即可
1.实现新增,因为新增要添加用户的信息,所以新增还是传入User对象。
在service的实现类中,可以直接调用封装好的方法
controller层进行测试
2.实现删除,mybatis-plus支持进行逻辑删除。逻辑删除就是再数据库表的设计中新增一个用来表示状态类型的字段,用来表示当前行的数据是否已经处于删除状态。一般0表示未删除,1表示已经删除。如果添加这个字段,就需要在实体类中对应的属性上加入注解 @TableLogic,否则不会生效。如果加入了这个注解,则mybatis-plus在执行删除的方法的时候,其实执行的就是update语句,将设置的状态字段从0改为1,。如果没有进行声明,则默认执行的还是delete语句,进行的物理删除,将数据从数据库中删除。
实体类:
/**
* 逻辑删除字段,使用注解 @TableLogic
* 当调用删除的方法的时候,会执行update语句进行逻辑删除
* 当前行的数据还是存在,只是修改了状态,查询不到
*/
@TableLogic
private Integer del;
service层:
controller层测试:
@RequestMapping("/delete")
private Page<User> doDelete(Long id) {
userService.doDelete(id);
return doQueryAll();
}
3.实现修改,mybatis-plus支持自动填充功能。在数据库中的数据被修改以及新增一条数据的时候,支持将执行操作的时间存入数据库中,这样对于以后数据的维护起到重要的作用。要使用自动填充功能,需要现在数据库中设计两个字段,用来存放创建的时间以及修改的时间,然后再实体类对于的属性上加入注解 @TableField( fill = FieldFill.*),之后还需要创建一个配置类,来配置注解的生效。
数据库
实体类,因为update需要在当前行被新增的时候就加入修改的时间,并且在修改的时也要加入修改时间,所以使用 INSERT_UPDATE
/**
* 数据库中创建字段 createtime 创建时间 updatetime 修改时间
* 当执行新增操作的时候,将时间自动填充到数据库中。要同时填充两个字段
* 当执行修改操作的时候,将时间自动填充到updatetime字段中
* @TableField( fill = FieldFill.INSERT) 注解表示执行新增的时候进行字段的填充
* @TableField( fill = FieldFill.UPDATE) 注解表示执行修改的时候进行字段的填充
* @TableField( fill = FieldFill.INSERT_UPDATE) 注解表示执行修改和新增操作的时候进行字段的填充
*/
@TableField( fill = FieldFill.INSERT)
private LocalDateTime createtime;
@TableField( fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatetime;
配置文件
配置文件其实是给实体类的属性赋值使用的,当实体类上的属性加上注解之后,执行新增和修改操作的时候,就会进入这个配置类,然后将当前时间赋值给实体的属性。
package com.hyn.springboot04.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.LocalDateTime;
/**
* 创建执行字段自动填充的配置类
*/
@Configuration
public class MybatisPlusConfig implements MetaObjectHandler {
/**
* 执行新增的时候会触发的方法
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
/**
* 第二个参数表示为哪个字段做自动填充 填入的是实体类中的属性名。
* 在执行新增的时候要为两个参数都执行自动填充
*/
this.strictInsertFill(metaObject, "createtime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updatetime", LocalDateTime.class, LocalDateTime.now());
}
/**
* 执行修改的时候会触发的方法
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "updatetime", LocalDateTime.class, LocalDateTime.now());
}
4.实现查询。mybatis-plus支持多条件查询,同时也支持分页查询和不分页查询两种。之前使用mybatis时,想要进行分页查询,则必须加入pagehelper分页插件。使用mybatis-plus则无需加入插件依赖,只需在配置文件中进行配置即可。如果想要执行分页查询则需要使用 selectPage方法进行查询,并且返回的结果是一个Page对象,Page对象中的 Records属性是查询出来的数据。是一个List<>集合
配置文件:
/**
* mybatis-plus分页插件
* @return
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 指定数据库
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
执行查询的service实现类
@Override
public Page<User> doQueryAll() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
/**
* eq表示等值,相当于age=20
* between 表示 sql语句中的 between and 相当于 age between 10 and 20
* like 表示模糊查询
*/
queryWrapper.between("age",10,20);
queryWrapper.like("name","mitu");
// 在需要执行分页的操作前使用分页插件
// 创建Page对象 传入的参数是 当前页数、每页显示的条数
Page<User> page = new Page<>(1,2);
// 执行使用分页的查询方法
Page<User> selectPage = userDao.selectPage(page, queryWrapper);
System.out.println("当前的总页码:"+selectPage.getPages());
System.out.println("总条数:"+selectPage.getTotal());
System.out.println("当前页的记录:"+selectPage.getRecords());
return selectPage;
}