mybatis-plus and mysql
持续更新中 。。。。。。
1. 乐观锁和悲观锁的介绍
2. mybatis(乐观锁)
注意:mybatis-plus的版本3.5.1
主要类: OptimisticLockerInnerInterceptor
-
配置插件: spring.xml格式 <bean class="com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor" id="optimisticLockerInnerInterceptor"/>
<bean id="mybatisPlusInterceptor" class="com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor">
<property name="interceptors">
<list>
<ref bean="optimisticLockerInnerInterceptor"/>
</list>
</property>
</bean>
? springboot 注解方式
@Configuration
public class BeanConfig {
@Bean
public IKeyGenerator myKeyGenerator(){
return new H2KeyGenerator();
}
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
-
添加字段 @Version
private Integer version;
3. 分页插件
主要类PaginationInnerInterceptor
-
配置插件 @Configuration
public class BeanConfig {
@Bean
public IKeyGenerator myKeyGenerator(){
return new H2KeyGenerator();
}
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
- 测试分页插件效果
@Test
public void testPagination(){
Page<User> page = new Page<>(1, 5);
userMapper.selectPage(page, null);
page.getRecords().forEach(System.out::println);
System.out.println("====================");
System.out.println(page.getCurrent());
System.out.println(page.getPages());
System.out.println(page.getSize());
System.out.println(page.getTotal());
System.out.println(page.hasNext());
System.out.println(page.hasPrevious());
}
4. 代码生成器
-
添加依赖 <dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.2</version>
</dependency>
-
创建一个方法,方法体如下 :
package com.biienu;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Collections;
@SpringBootTest
public class AutoGenearteCode {
@Test
public void testAuto(){
FastAutoGenerator.create("jdbc:mysql://localhost:3306/online_education?characterEncoding=UTF-8&serverTimezone=GMT%2B8","root", "shangke6")
.globalConfig(builder -> {
builder.author("biienu")
.enableSwagger()
.fileOverride()
.outputDir("E:\\ProcessDocuments\\项目测试\\online-education\\service\\service-edu\\src\\main\\java\\com\\biienu");
})
.packageConfig(builder -> {
builder.parent("")
.moduleName("")
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, "E:\\ProcessDocuments\\项目测试\\online-education\\service\\service-edu\\src\\main\\resources\\mappers"));
})
.strategyConfig(builder -> {
builder.addInclude("edu_teacher");
})
.templateEngine(new VelocityTemplateEngine())
.execute();
}
}
5. 逻辑删除
使用说明
只对自动注入的 sql 起效:
-
插入: 不作限制 -
查找: 追加 where 条件过滤掉已删除数据,且使用 wrapper.entity 生成的 where 条件会忽略该字段 -
更新: 追加 where 条件防止更新到已删除数据,且使用 wrapper.entity 生成的 where 条件会忽略该字段 -
删除: 转变为 更新
例如:
- 删除:
update user set deleted=1 where id = 1 and deleted=0 - 查找:
select id,name,deleted from user where deleted=0
字段类型支持说明:
-
支持所有数据类型(推荐使用 Integer ,Boolean ,LocalDateTime ) -
如果数据库字段使用datetime ,逻辑未删除值和已删除值支持配置为字符串null ,另一个值支持配置为函数来获取值如now()
附录:
- 逻辑删除是为了方便数据恢复和保护数据本身价值等等的一种方案,但实际就是删除。
- 如果你需要频繁查出来看就不应使用逻辑删除,而是以一个状态去表示。
使用步骤 :
-
yaml配置文件修改 mybatis-plus:
global-config:
db-config:
logic-delete-field: flag
logic-delete-value: 1
logic-not-delete-value: 0
-
实体类字段上添加注解 @TableLogic
private Integer deleted;
6. 条件构造器
主要通过QueryWrapper 类
如果想进行复杂条件查询,那么需要使用条件构造器 Wapper,涉及到如下方法
1、delete
2、selectOne
3、selectCount
4、selectList
5、selectMaps
6、selectObjs
7、update
7. 自动填充
实现步骤 :
-
创建一个类,实现MetaObjectHandler 类, 重写两个方法,如下 : public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("gmtCreate",LocalDateTime.now(), metaObject);
this.setFieldValByName("gmtModified",LocalDateTime.now(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("gmtModified", LocalDateTime.now(), metaObject);
}
}
-
在实体类属性上添加这个注解@TableField , 实现如下 : @TableField(fill = FieldFill.INSERT)
private LocalDateTime gmtCreate;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime gmtModified;
|