mybatis-plus

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还有其他配置。

    值得注意的一点是:mybatismybatis-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_timeupdate_time

单表的create_timeupdate_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()); //获取记录总数
    }
    

以上就是我所学习的部分内容。

参考,或者说转载:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值