zoukankan      html  css  js  c++  java
  • SpringBoot整合Mybatis-Plus

    SpringBoot整合Mybatis-Plus

    Mybatis-plus是Mybatis的增强工具,在Mybatis的基础上只做增强不做改变

    入门

    导入依赖,lombok依赖还需要下载插件,可以简化实体类,无需写get,set等方法

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>

    日志配置:在终端显示数据库执行的详细信息

    mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

    编写实体类与其mapper接口,mapper接口只需继承BaseMapper接口

    @Repository
    public interface UserMapper extends BaseMapper<User>{
    }

    测试增删查改

        @Autowired 
        private UserMapper userMapper;
        @Test
        void selecttest(){
            //查询列表
            List<User> user =  userMapper.selectList(null);
            System.out.println("user:" + user);
            //根据ID查询
            User user1 = userMapper.selectById(1L);
            System.out.println("user1:" + user1);
            //通过多个ID批量查询
            List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
            users.forEach(System.out::println);
            //简单的条件查询
            HashMap<String, Object> map = new HashMap<>();
            map.put("name", "dengwenxiong1");
            map.put("age",13);
            List<User> users2 = userMapper.selectByMap(map);
            users2.forEach(System.out::println);
        }
        //插入
        @Test
        void insertUser(){
            User user=new User();
            user.setName("dengwenxiong4");
            user.setAge(18);
            user.setEmail("4@qq.com");
            int insert=userMapper.insert(user);
            System.out.println(insert);
    
        }
        //修改
        @Test
        void updateTest(){
            User user=new User();
            user.setId(1L);
            user.setName("dengwenxiong5");
            int result=userMapper.updateById(user);
            System.out.println(result);
        }
        //删除
        @Test
        void deleteTest(){
            int result=userMapper.deleteById(2L);
            System.out.println(result);
        }

    提升

    Mp几个常用的知识点:分页查询,自动填充,乐观锁,逻辑删除和性能分析

    分页查询

    创建配置类,添加分页插件即可

    添加插件

    @Configuration
    public class MpConfig {
        @Bean
        public PaginationInterceptor paginationInterceptor(){
            return new PaginationInterceptor();
        }
    }

    分页测试

        //分页测试
        @Test
        void selectPage(){
            //创建page对象,指定当前页和每页记录数
            Page<User> page=new Page<>(1,3);
            //调用分页查询方法,将数据封装到page对象里
            userMapper.selectPage(page,null);
            //通过page对象获取数据
            System.out.println(page.getCurrent());//当前页
            System.out.println(page.getRecords());//每页数据的list集合
            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());//是否有上一页
        }

    自动填充

    自动填充创建时间和更新时间,添加字段和注解

     @TableField(fill= FieldFill.INSERT)
     private Date createTime;
     @TableField(fill=FieldFill.INSERT_UPDATE)
     private Date updateTime;

    实现元对象处理器接口

    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
        @Override
        public void insertFill(MetaObject metaObject) {
            this.setFieldValByName("createTime",new Date(),metaObject);
            this.setFieldValByName("updateTime",new Date(),metaObject);
        }
    
        @Override
        public void updateFill(MetaObject metaObject) {
            this.setFieldValByName("updateTime",new Date(),metaObject);
        }
    }

    乐观锁

    乐观锁:拿数据不会上锁,提交时会验证版本号,如版本号与拿到时的不匹配,则提交失败

    Mp的乐观锁实现原理:添加version字段,如果数据修改,version会加一

    添加字段

        @Version
        @TableField(fill = FieldFill.INSERT_UPDATE)
        private Integer version;

    自动填充值

    @Override
    public void insertFill(MetaObject metaObject) {
        ......
        this.setFieldValByName("version", 1, metaObject);
    }

    配置乐观锁插件

        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor(){
            return new OptimisticLockerInterceptor();
        }

    测试

        //乐观锁测试
        @Test
        void locktest(){
            User user=userMapper.selectById(7L);
            user.setAge(100);
            userMapper.updateById(user);
        }

    逻辑删除

    逻辑删除:通过标志位字段实现,删除后数据库还是有此条数据

    添加字段

        @TableLogic
        @TableField(fill = FieldFill.INSERT)
        private Integer deleted;

    自动添加初始化值

    @Override
    public void insertFill(MetaObject metaObject) {
        ......
        this.setFieldValByName("deleted", 0, metaObject);
    }

    配置逻辑删除插件

        @Bean
        public ISqlInjector sqlInjector(){
            return new LogicSqlInjector();
        }

    测试逻辑删除

        //逻辑删除
        @Test
        void logicDelTest(){
            userMapper.deleteById(8L);
        }

    性能分析

    性能分析是记录每条SQL语句执行的时间,配置插件即可完成

        @Bean
        @Profile({"dev","test"})//设置dev,test环境开启
        public PerformanceInterceptor performanceInterceptor(){
            PerformanceInterceptor performanceInterceptor=new PerformanceInterceptor();
            performanceInterceptor.setMaxTime(100);//ms,超过此最大值则sql不执行
            performanceInterceptor.setFormat(true);
            return performanceInterceptor;
        }
  • 相关阅读:
    请使用迭代查找一个list中最小和最大值,并返回一个tuple
    利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法
    软件测试中的43个功能测试点总结
    Linux下好用的简单实用命令
    小议堆栈
    使用mac的那些稀奇古怪的事
    探索TypeScript第一步之基础类型
    Markdown的基本使用方法
    React的生命周期
    React中的通讯组件
  • 原文地址:https://www.cnblogs.com/python-road/p/14261502.html
Copyright © 2011-2022 走看看