MyBatis-Plus
Mybatis-Plus
Learning Sources:狂神说
入门
创建数据库
创建表
初始化spring boot项目
导入依赖
1
2
3
4
5
6
7
8
9
10
11<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>连接数据库
1
2
3
4
5spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/ssm_test?serverTimezone=UTC&userUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=000000使用mybatis-plus
enetiy
mapper接口
1
2
3
4//// 代表持久层
public interface UserMapper extends BaseMapper<User> {
//继承BaseMapper接口
}主启动类上去扫描我们的mapper包下的所有接口
1
测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MybatisPlus02ApplicationTests {
// 继承了BaseMapper,所有的方法都来自己父类
// 我们也可以编写自己的扩展方法!
private UserMapper userMapper;
void contextLoads() {
User user = userMapper.selectById(1);
System.out.println(user);
}
}
FileInputStream fis=new FileInputStream(“src\11.txt”);FileOutputStream fos=new FileOutputStream(“src\66.txt”);int by;while ((by=fis.read())!=-1){ fos.write(by);}java
配置日志
1 | #日志功能 |
CRUD扩展
主键生成策略
默认 ID_WORKER 全局唯一id
雪花算法:
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为 毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味 着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。可以保证几乎全球唯 一!
1 | public class User { |
type其与的源码解释
1 | public enum IdType { |
自动填充
创建时间、修改时间!这些个操作一遍都是自动化完成的,我们不希望手动更新!
阿里巴巴开发手册:所有的数据库表:gmt_create、gmt_modified几乎所有的表都要配置上!而且需 要自动化!
方式一:数据库级别(工作中不允许你修改数据库)
在表中新增字段 create_time, update_time
1
2
3
4
5alter table user
add create_time datetime default current_timestamp null comment '创建时间';
alter table user
add update_time datetime default current_timestamp null comment '更新时间';(设置自动更新)同步实体类
测试查看效果
方式二:代码级别
删除数据库的默认值、更新操作
实体类字段属性上需要增加注解
1
2
3
4
private Date createTime;
private Date updateTime;编写处理器来处理这个注解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29package com.mui.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
//注册到IOC
public class MyMetaObjectHandler implements MetaObjectHandler {
// 插入时的填充策略
public void insertFill(MetaObject metaObject) {
log.info("insert fill.......");
//MetaObjectHandler setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
//更新时的填充策略
public void updateFill(MetaObject metaObject) {
log.info("update fill.......");
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}测试
TableFile参数解释:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入填充字段
*/
INSERT,
/**
* 更新填充字段
*/
UPDATE,
/**
* 插入和更新填充字段
*/
INSERT_UPDATE
}
乐观锁
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
- 取出记录时,获取当前 version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
1 | 乐观锁:1、先查询,获得版本号 version = 1 |
https://baomidou.com/pages/0d93c0/#optimisticlockerinnerinterceptor
分页查询
配置拦截器组件
1 | // 分页插件 |
测试
1 | //分页查询 |
删除操作
1 | //删除 |
逻辑删除
物理删除 :从数据库中直接移除
逻辑删除 :再数据库中没有被移除,而是通过一个变量来让他失效! deleted = 0 => deleted = 1
在数据表中增加一个 deleted 字段
实体类中增加属性
1
2//逻辑删除
private Integer deleted配置
1
2
3
4
5
6mybatis-plus:
global-config:
db-config:
logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
逻辑删除走的是更新操作,查询时动态 AND deleted=0
1 | UPDATE user SET deleted=1 WHERE id=? AND deleted=0 |
1 | SELECT * FROM user WHERE id=? AND deleted=0 |
条件构造器
wrapper
1 |
|
数据安全保护
密钥加密:
1 | // 生成 16 位随机 AES 密钥 |
YML 配置:
1 | // 加密配置 mpw: 开头紧接加密内容( 非数据库配置专用 YML 中其它配置也是可以使用的 ) |
1 | public void testKey(){ |
注意!
- 加密配置必须以 mpw: 字符串开头
- 随机密钥请负责人妥善保管,当然越少人知道越好。
- 本地是不能连接数据库的,这个是用于生产环境的



