(建议这些共用的字段放到BaseBean.java)
本文章描述的仅乐观锁,逻辑删除,自动填充,分页查询,代码自动生成,wrapper条件构造器
在使用这些功能时,要先把环境配置好。
全部功能,都可以在mybatis-plus官网看到,上面几乎包括了全部讲解。
依赖
<!--mybatis-plus--Spring boot加载使用-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
<!--mybatis-plus的一些插件使用 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.0</version>
</dependency>
application.yml配置
mybatis-plus:
global-config: #逻辑删除配置
db-config:
logic-delete-value: 0 # 逻辑已删除值(默认为 0)
logic-not-delete-value: 1 # 逻辑未删除值(默认为 1)
type-aliases-package: com.example.mapper #mapper包的地址
mapper-locations: mapper/*.xml #mapper.xml在resources的包下地址
configuration:
#这个配置会将执行的sql打印出来,在开发或测试的时候可以用
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
数据库设计
?插件推荐:mybatisX,有好用的功能,可以在mybatis-plus官网查看功能
?插件功能之一,代码自动生成器。
IDEA连接数据库,选择我们要操作的表,点这个功能
生成结果展示
注意生成的mapper没有@Mapper注解,要自己加注解,将mapper添加到ioc容器?
?自动填充使用
?User.java,注意时间的类型时LocalDateTime
@TableField(value = "creat_time",fill = FieldFill.INSERT)
private LocalDateTime creatTime;
@TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
MyMetaObjectHandler.java?
package com.example.config;
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.time.LocalDateTime;
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
this.strictInsertFill(metaObject, "creatTime", LocalDateTime.class, LocalDateTime.now());
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
测试使用
@SpringBootTest
class Test2ApplicationTests {
@Autowired
private UserService userService;
@Test
void contextLoads() {
//自动填充使用
User x = new User();
x.setName("自动填充测试");
x.setAge(20);
userService.save(x);
}
}
结果
?逻辑删除使用,根据自己设置0还是1删除,要和数据库对应。
?yml里的配置
?User.java
@TableField(value = "staus")
@TableLogic //逻辑删除注解
private Integer staus;
?测试使用(我的数据库id设置了double型)
@SpringBootTest
class Test2ApplicationTests {
@Autowired
private UserService userService;
@Test
void contextLoads() {
//逻辑删除测试使用
userService.removeById(1d);
}
}
结果
?
乐观锁使用
?User.java
@TableField(value = "version")
@Version
private Integer version;
配置,添加插件
package com.example.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
}
测试使用
不知道为什么用不了,可能是版本的问题,不过这个乐观锁也没必要配置,后期学习会用别的方法替代。乐观锁会影响效率。
结果
条件构造器的使用,只讲query和update两种构造器的区别
建议使用Lambda的构造器,区别
LambadQueryWrapper的使用
.select()方法,只查寻我需要的字段
@Autowired
private UserService userService;
@Test
void contextLoads() {
//LambdaQueryWrapper的特别方法
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.select(User::getId, User::getName, User::getAge).eq(User::getName, "测试使用");
List<User> users = userService.list(queryWrapper);
users.forEach(System.out::println);
}
结果
?LambadUpdateWrapper的使用
.set()方法
@Autowired
private UserService userService;
@Test
void contextLoads() {
//LambdaQueryWrapper的特别方法
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(User::getName, "update测试").set(User::getAge, 99);
userService.update(updateWrapper);
}
结果
?分页插件的使用
配置,添加插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return mybatisPlusInterceptor;
}
mybatis-plus自带的分页方法
测试使用
@Autowired
private UserService userService;
@Test
void contextLoads() {
IPage<User> userIPage=new Page<>(2,2);
userService.page(userIPage);
}
结果
?自定义分页mapper方法,目前自己没懂!!!无例子?
总结
package com.example.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class BaseBean {
@TableField(value = "staus")
@TableLogic
private Integer staus;
@TableField(value = "creat_time", fill = FieldFill.INSERT)
private LocalDateTime creatTime;
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableField(value = "version")
@Version
private Integer version;
}
|