mybatis-plus代码
贴一下简单mybatis-plus的简单代码,主要是确实面试问得多,之前也瞄过一眼,也就知道一点东西。今天就稍微看了一下,发现这玩意确实挺好用的。它对单表curd的封装是真的好,常用的字段像是create_time和update_time的使用也挺好的。还有就是乐观锁吧。也只是粗略看了,代码生成器也没有多少涉及。
我是结合这篇文章和官网一起学习的: Mybatis-Plus详解_mybits plus_有头发还能学的博客-CSDN博客
一、引入与简单配置
-
首先是依赖的引入:
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency>
-
mybatis-plus配置文件:
application.yaml
mybatis-plus: #开启别名 type-aliases-package: com.pojo #classpath代表resource目录 mapper-locations: classpath:mybatis/mapper/*.xml #日志 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
这部分配置其实跟
mybatis
的配置是一样的,当然mybatis-plus
还有其他配置。值得注意的一点是:
mybatis
和mybatis-plus
不能一起使用。 -
UserMapper.java
,记得加上@Mapper
注解@Mapper public interface UserMapper extends BaseMapper<User> { }
对的,它就是这么简单,继承一个
BaseMapper
就能搞定单表的crud -
单表crud的示例,我使用的就是官网的给出的数据库
//测试查询 @Test public void testSelect() { System.out.println(("----- selectAll method test ------")); List<User> userList = userMapper.selectList(null); userList.forEach(System.out::println); } //测试插入 @Test public void testInsert(){ User user = new User(); user.setName("小蒋"); user.setAge(3); user.setEmail("2474950959@qq.com"); //没有设置ID却自动生成的ID int result = userMapper.insert(user); System.out.println("result = " + result); System.out.println("user = " + user); } //更新测试 /** * 自动支持动态sql */ @Test public void testUpdateByID() { User user = new User(); user.setId(6L); user.setName("小小"); user.setAge(18);//这一行后加 int i = userMapper.updateById(user);//受影响的行数,参数是一个user不是id,点击看源码 System.out.println("i = " + i); } //删除测试 @Test public void testDeleteByID() { User user = new User(); user.setId(6L); int i = userMapper.deleteById(user);//受影响的行数,参数是一个user不是id,点击看源码 System.out.println("i = " + i); } //查询指定多用户 @Test public void testSelectBatchIds() { //Arrays.asList()创建了一个固定大小的集合 List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));//参数Collection的集合 users.forEach(System.out::println); } //条件查询,-- HashMap @Test public void testSelectByMap() { HashMap<String, Object> map = new HashMap<>(); //定义查询条件 map.put("name", "Jack"); //where k = v map.put("age",20); List<User> users = userMapper.selectByMap(map); users.forEach(System.out::println); }
二、单表的create_time
和update_time
单表的create_time
和update_time
自动插入需要往数据库中添加新字段,数据类型是datetime
。然后添加一个拦截器,在插入
时拦截器会起作用。
- 拦截器:
@Slf4j //日志
@Component//以组件的形式把这个处理器注册到IOC容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入时启动 第三个参数 LocalDateTime 一定要和 createTime成员变量的值的类型一致,不然是null 如果是date就都设置date
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ....");
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
}
//更新时候启动
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ....");
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
}
}
- User.java中也需要加入对应的注解,和拦截器对应,插入时启动、更新时启动。
//字段添加填充内容
@TableField(fill = FieldFill.INSERT ,value = "create_time")
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE ,value = "update_time")
private LocalDateTime updateTime;
此时执行添加、更新的语句,它就会自动把时间插入表中。
三、乐观锁插件
官网说明
OptimisticLockerInnerInterceptor
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
- 取出记录时,获取当前 version
- 更新时,带上这个 version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果 version 不对,就更新失败
- 首先得在数据库中添加新字段
version
关于字段的类型,官网是这样说明的:
- 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
- 整数类型下
newVersion = oldVersion + 1
newVersion
会回写到entity
中- 仅支持
updateById(id)
与update(entity, wrapper)
方法- 在
update(entity, wrapper)
方法下,wrapper
不能复用!!!
-
其次,配置文件
@EnableTransactionManagement //开启事务 @Configuration //配置类注解 public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());//乐观锁插件拦截器OptimisticLockerInnerInterceptor return mybatisPlusInterceptor; } }
-
@Version
注解:在User.java中添加字段,并在上面写上注解@Version //乐观锁注解 private int version;
-
测试
@Test public void testOptimisticLocker(){ //1、查询用户信息 User user = userMapper.selectById(1L); //2、修改用户信息 user.setEmail("123@qq.com"); user.setName("小垃圾"); //3、更新操作 userMapper.updateById(user); }
得注意的一点是,如果添加字段version
时,你设置的是默认为空,执行这段代码并不会有什么效果,你得在已经插入的记录中修改 对应的值为1。或者说,你在添加version
字段时,设置默认值为1。
官网也说了,整数类型下 newVersion = oldVersion + 1
,也就是说,旧值为空的情况下,newversion
也不会有值的。
四、分页
-
在
MybatisPlusConfig
中添加一行代码mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); //插件分页拦截器
-
MybatisPlusConfig.java
@EnableTransactionManagement //开启事务 @Configuration //配置类注解 public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());//乐观锁插件拦截器OptimisticLockerInnerInterceptor mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); //插件分页拦截器 return mybatisPlusInterceptor; } }
-
测试
//测试分页查询 @Test public void testPage() { Page<User> page = new Page<>(1,5); //开启拦截器后,会注册一个page对象 当前页,每页条数 //方法源码: <P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); userMapper.selectPage(page,null); //分页查询 page.getRecords().forEach(System.out::println); //获取分页后的数据 打印 System.out.println(page.getTotal()); //获取记录总数 }
以上就是我所学习的部分内容。
参考,或者说转载: