Mybatis—Plus
Mybatis-plus
- MyBtais Plus
- 开源框架 基于MyBatis
项目结构
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.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.southwind</groupId>
<artifactId>MyBatis-Plus</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>MyBatis-Plus</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-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- <dependency>-->
<!-- <groupId>junit</groupId>-->
<!-- <artifactId>junit</artifactId>-->
<!-- <version>4.13.1</version>-->
<!-- <scope>test</scope>-->
<!-- </dependency>-->
<!-- -->
<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>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.2.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.0.RELEASE</version>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
数据库表
实体类Account
@Data
@TableName(value = "user")
public class Account {
// 默认方式 是不需要给主键赋值的 自动生成一个随机数(雪花算法)
@TableId
// 雪花算法生成的随机数 必须要使用long 对应的数据库中的字段类型要使用 bigint 长度最好大一点
private Integer id;
@TableField(value = "name")
private String username;
private Integer age;
@TableField(exist =false)
// 表示实体类中有这个字段 但是数据库中没有 就可以这样使用
private String gender;
@TableField(fill = FieldFill.INSERT,value = "create_time")
private Date creatTime;
@TableField(fill = FieldFill.INSERT_UPDATE,value = "update_time")
private Date updateTime;
// 注解方式进行枚举
@Version
private Integer version;
private StatusEnum status;
@TableLogic(value = "0" , delval = "1")
private Integer deleted;
}
在application.yml中寻找成员变量的值进行配对
根据数据表 自动的逆向生成 所有的实体类 所有的Mapper 所有的Service 所有的controller接口
- 此处的接口 没有实例化的原因是 因为有动态代理
- 动态生成的(这个实现类 是看不到的) 程序运行 动态生成一个类
日志操作
application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/myabtisplus?useUnicode=true&characterEncoding=gbk&useSSL=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Hongkong
username: root
password: 密码
# 打印日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
type-enums-package:
com.southwind.mybatisplus.enums
# 逻辑没有删除 0 删除是 1
global-config:
db-config:
logic-not-delete-value: 0
logic-delete-value: 1
常用注解
@TableName
映射数据库的表名
@TableId
设置主键映射 value映射主键字段名字
type设置主键类型 主键的生成策略
public enum IdType {
/**
* 数据库ID自增
* <p>该类型请确保数据库设置了 ID自增 否则无效</p>
*/
AUTO(0),
/**
* 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
*/
NONE(1),
/**
* 用户输入ID
* <p>该类型可以通过自己注册自动填充插件进行填充</p>
*/
INPUT(2),
/* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
/**
* 分配ID (主键类型为number或string),
* 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(雪花算法)
*
* @since 3.3.0
*/
ASSIGN_ID(3),
/**
* 分配UUID (主键类型为 string)
* 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(UUID.replace("-",""))
*/
ASSIGN_UUID(4),
AUTO
数据库自增 (根据数据库当前最大值加一 就是最新的值)
NONE
MP Set主键 雪花算法实现
INPUT
需要开发者手动赋值
如果没有手动赋值 则数据库通过自增的方式给主键赋值,如果手动赋值,则存入该值。
ASSIGN_ID 自动赋值 (雪花算法)
MP 分配 ID Long、Integer、String
ASSIGN_UUID 主键的数据类型必须是String 会自动更生成UUID(是一个字符串)
分配UUID、String
@TableField
映射非主键字段 value映射字段名
- exist 表示是否为数据库字段 false 如果实体类中的成员变量在数据库中没有对应的字段
- 则可以用exist 、DTO、 VO对不同的实体类做一个二次封装 (将当前需要用的实体类和其他实体类 组装在一起 进行传入到前端调用 )
- Select 表示是否查询该字段
- Fill 表示是否自动填充 将对象存入数据库的时候 由MyBatis Plus自动给某些字段赋值
ceate_time、update_time。
@Version
- 标记乐观锁 ,通过一个version 字段来保证数据的安全性,当修改数据的时候,会以version作为条件,当条件成立的时候
才会修改成功。
设置时间修改值,进行操作的时候 进行设置当前的系统值
//交给spring管理
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//使用mp实现添加操作,这个方法会执行,metaObject元数据(表中的名字,表中的字段)
@Override
public void insertFill(MetaObject metaObject) {
//根据名称设置属性值
this.setFieldValByName("creatTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
//使用mp实现修改操作,这个方法会执行
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
配置Mybatis-plus对应的乐观锁和分页插件
@Configuration
@EnableTransactionManagement
public class MyBatisPlusConfig {
@Bean
public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor(){
return new OptimisticLockerInnerInterceptor();
}
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
// 插件
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
// 添加分页插件
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
}
分页插件中 需要考虑的就是
- 对应的版本兼容
- 导入插件依赖
- 对应的扫描类和配置类
问题集合
对应的在 mybatis-plus
分页操作的时候 出现的问题可能存在有
MybatisPlus和SPringboot存在版本的问题
SpringBoot和junit存在版本问题
Mybtaisplus配置分页插件
注意3.4.0之后的版本 会有新的配置方式 分页插件和乐观锁
枚举
@EnumValue
通用枚举类注解,将数据库字段映射成为实体类的枚举类型成员变量
实现接口枚举
实现接口 IEnum<?>
其中方法
Public Integer getValue(){
Return this.code;
}
@TableLogic
映射逻辑删除 (逻辑上已经删除了 但是数据库中还是存在)
1.注解配置
2.配置文件配置
动态sql其实已经进行封装了,实际上就是进行读取实体类的注解 自动判断是否需要添加某个sql,是否追加某个条件。
public interface UserMapper extends BaseMapper<Account> {
@Select("select p.*,u.name UserName from product p,user u where p.user_id=u.id and u.id=#{id}")
List<ProductVO> productList(Integer id);
}
多表来联查
查询整个数据库