Mybatis-plus
1.定义
MyBatis-Plus 是一个 Mybatis 增强版工具,在 MyBatis 上扩充了其他功能没有改变其基本功能,为了简化开发提交效率而存在。
2.使用 SpringBoot 集成 MyBatis-Plus
详情可参考<https://www.cnblogs.com/l-y-h/p/12859477.html>
1.基础准备
需要 Java 开发环境(JDK)以及相应的开发工具(IDE)。
需要 maven(用来下载相关依赖的 jar 包)。
需要 SpringBoot。
可以使用 IDEA 安装一个 mybatis-plus 插件。(settings-Plugins-搜索MyBatisX 进行下载)
如果要使用lombok,也需要设置并且下载插件。
(settings-Plugins-搜索lombok 并找到settings-Build,Execution,Deployment-Compiler-Annotation Processors,勾选Enable Annotation Processors)
2.新建springboot项目
pom.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.wz</groupId>
<artifactId>wz</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>wz</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--JDBC 不导入不影响使用-->
<!--<dependency>-->
<!--<groupId>org.springframework.boot</groupId>-->
<!--<artifactId>spring-boot-starter-jdbc</artifactId>-->
<!--</dependency>-->
<!--MyBatisPlus 要指定版本-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<!--生成器,必备,且指定版本-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.1.tmp</version>
</dependency>
<!--模板引擎依赖,不导入不影响使用-->
<!--<dependency>-->
<!--<groupId>org.apache.velocity</groupId>-->
<!--<artifactId>velocity-engine-core</artifactId>-->
<!--<version>2.2</version>-->
<!--</dependency>-->
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--spring测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!--插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.数据库表结构与实体类
package com.wz.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.time.LocalDateTime; //此处使用的是更为安全的时间类
import java.util.Date; //使用date 要导入util包
@Data //基础get/set
@ToString //tostring
@AllArgsConstructor //有参构造
@NoArgsConstructor //无参构造
public class User {
@TableId(type = IdType.ID_WORKER) //使用雪花算法生成。
//此注解中type也有自增功能@TableId(type = IdType.AUTO)。
private Long id;
private String name;
private int age;
private String email;
//配置以下方案 要在数据库中存在对应字段,否则报错
// //逻辑删除 如果不设置此增强,删除数据则直接删除
@TableLogic//这个注解就代表这个表中的字段存在逻辑
@TableField(value = "`delete`")//处理数据库关键字
private Integer delete;
//在insert的时候插入
@TableField(fill = FieldFill.INSERT) //表示 在执行插入语句时,进行自动填充
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE) //表示 在执行插入和更新语句时,进行自动填充
private LocalDateTime updateTime;
// //版本
// @Version//代表这是一个乐观锁的注解
// @TableField(value = "`version`")//处理数据库关键字
// private Integer version;
}
4.yml配置文件
spring:
#数据源
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
url: jdbc:mysql://localhost:3306/testMyBatisPlus?MyBatisPlususeUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false # 设置东八区时间和字符编码
# 在执行对应方法时,将自动生成的语句显示在控制台
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#配置逻辑删除,可以使用默认值。直接删除
global-config:
db-config:
logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
5.启动类配置
package com.wz.wz;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@MapperScan("com.wz.dao") //dao层扫包
@ComponentScan("com.wz.dao") //必须要进行扫包 否则自动填充不生效!
//@ComponentScan("com.wz.entity")
public class WzApplication {
public static void main(String[] args) {
SpringApplication.run(WzApplication.class, args);
}
//注册乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
//配置分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
}
6.dao持久层
集成mybatis-plus之后就可以使用BaseMapper<泛型>来定义持久层,使用与JPA的通用Mapper类似
public interface UserMapper extends BaseMapper<User> {
//也可以在里面自己定义方法多表查询,纯注解方式
}
7.自动填充接口
想要实现自动填充功能,必须在实体类上方再添加注解。一同使用并且@ComponentScan扫包才会生效!
package com.wz.dao;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Date;
//注意要交给spring管理
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
setFieldValByName("create", LocalDateTime.now(),metaObject);
this.setFieldValByName("createTime",LocalDateTime.now(),metaObject);//使用安全时间类
this.setFieldValByName("updateTime",LocalDateTime.now(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
}
}