• MyBatisPlus学习笔记


    MyBatisPlus

    快速入门案例

    简介

    MybatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提供效率

    特点

    • 无侵入:只做增强不做改变,不会对现有工程产生影响
    • 强大的 CRUD 操作:内置通用 Mapper,少量配置即可实现单表CRUD 操作
    • 支持 Lambda:编写查询条件无需担心字段写错
    • 支持主键自动生成
    • 内置分页插件

    1.创建新模块
    在这里插入图片描述2.勾选依赖
    在这里插入图片描述
    3.在pom.xml添加依赖

    		<dependency>
    			<groupId>com.baomidougroupId>
    			<artifactId>mybatis-plus-boot-starterartifactId>
    			<version>3.4.1version>
    		dependency>
    		<dependency>
    			<groupId>com.alibabagroupId>
    			<artifactId>druidartifactId>
    			<version>1.1.16version>
    		dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4.设置JDBC参数
    在这里插入图片描述

    spring:
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
        username: root
        password: root
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5.制作实体类和表名

    在这里插入图片描述

    package com.itheima.domain;
    
    public class User {
        private int id;
        private String name;
        private String password;
        private String age;
        private String tel;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    6.定义数据库接口,继承BaseMapper< User >

    @Mapper
    public interface UserDao extends BaseMapper<User> {
    }
    
    • 1
    • 2
    • 3

    7.测试类注入dao接口,简单测试

    @SpringBootTest
    class MpDemoApplicationTests {
        @Autowired
        private UserDao userDao;
        @Test
        void testGetAll() {
            System.out.println(userDao.selectList(null));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    测试结果:
    在这里插入图片描述
    整体目录结构:
    在这里插入图片描述
    注意:BUG
    问题:intellij idea配置自己安装的Maven home directory后会自动变C:/Users/xxx/.m2/wrapper/dists/…
    解决方案:
    原因是从2020.2版本开始,IDE支持Maven包装器,如果项目配置了Maven包装器,则IDEA会将其用于项目,如果不想从包装器中使用Maven,可以将项目中.mvn/wrapper/下的maven-wrapper.properties从项目中删除即可解决。简言之,删除项目中.mvn即可。
    参考博客:此BUG修改博客

    标准数据层开发

    标准CRUD使用

    在这里插入图片描述
    示例:

    @SpringBootTest
    class MpDemoApplicationTests {
        @Autowired
        private UserDao userDao;
        @Test
        void testSave(){
            User user=new User();
            user.setAge("13");
            user.setId(666);
            user.setName("xiaohei");
            user.setTel("1008686");
            user.setPassword("666666");
            userDao.insert(user);
        }
        @Test
        void testGetAll() {
            System.out.println(userDao.selectList(null));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    Tips lombok依赖简化实体类编写Getter 、Setter 、ToString等。
    pom.xml添加依赖

            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4

    实体类User.java用@Data代替Getter 、Setter 、ToString等方法。

    @Data
    public class User {
        private int id;
        private String name;
        private String password;
        private String age;
        private String tel;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    分页功能

    在这里插入图片描述

    @Configuration
    public class MpConfig {
        @Bean
        public MybatisPlusInterceptor mpInterceptor(){
            //1 创建MybatisPlusInterceptor拦截器对象
            MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
            //2 添加分页拦截器
            mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
            return mybatisPlusInterceptor;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    MpDemoApplicationTests.java中编写测试代码

        @Test
        void testGetByPage(){
            //1 创建IPage分页对象,设置分页参数,1为当前页码,3为每页显示的记录数
            IPage page = new Page(1,2);
            //2 执行分页查询
            userDao.selectPage(page,null);
            //3 获取分页结果
            System.out.println("当前页码值:"+page.getCurrent());
            System.out.println("每页显示数:"+page.getSize());
            System.out.println("一共多少页:"+page.getPages());
            System.out.println("一共多少条数据:"+page.getTotal());
            System.out.println("数据:"+page.getRecords());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    开启日志
    application.yml

    mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    
    • 1
    • 2
    • 3

    DQL编程控制

    条件查询

    • MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合

    • 格式一:常规格式

        @Test
        void testGetAll() {
            //方式一: 条件查询
            QueryWrapper qw = new QueryWrapper();
            qw.lt("age",13);//小于13
    //        qw.ge("age",65);//大于等于65
            System.out.println(userDao.selectList(qw));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 格式二:Lambda条件查询
        @Test
        void testGetAll() {
            //方式二: Lambda条件查询
            QueryWrapper<User> qw = new QueryWrapper<User>();
            qw.lambda().lt(User::getAge,13);
            System.out.println(userDao.selectList(qw));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 格式三:Lambda条件查询(※)
        @Test
        void testGetAll() {
            //方式三: Lambda条件查询
            LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
            lqw.lt(User::getAge,13);
            List<User> userList = userDao.selectList(lqw);
            System.out.println(userDao.selectList(lqw));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 组合查询条件
      在这里插入图片描述

    null值处理

    可能null值产生的场景
    例如我们查询价格区间【A,B】,单我们设置为100元时候,可能就不会设置A的值。我们通常就默认了A的值。
    在这里插入图片描述

     //模拟页面传递过来的查询数据
            UserQuery uq = new UserQuery();
           // uq.setAge(10);
            uq.setAge2(30);
    
            LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
    //        lqw.lt(User::getAge,uq.getAge2());
            lqw.lt(null != uq.getAge2(),User::getAge,uq.getAge2());
            lqw.gt(null != uq.getAge(),User::getAge,uq.getAge());
    //        lqw.gt(User::getAge,uq.getAge());
            List<User> userList = userDao.selectList(lqw);
            System.out.println(userList);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    查询投影

    • 查询结果包含模型类中部分属性(即列名)
    	   //查询投影
           LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
           lqw.select(User::getId,User::getName,User::getAge);
           List<User> userList = userDao.selectList(lqw);
           System.out.println(userList);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    OR

           QueryWrapper<User> qw = new QueryWrapper<User>();
           qw.select("id","name","age");
           List<User> userList1 = userDao.selectList(qw);
           System.out.println(userList1);
    
    • 1
    • 2
    • 3
    • 4
    • 查询结果包含模型类中为定义的属性
        @Test
        void testGetAll() {
            QueryWrapper<User> qw = new QueryWrapper<User>();
            //计数
            qw.select("count(*) as count, tel");
            //分组
            qw.groupBy("tel");
            List<Map<String,Object>> userList2 = userDao.selectMaps(qw);
            System.out.println(userList2);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    查询条件

    1.等值查询 AND 范围查询

    gt():大于(>)
    ge():大于等于(>=)
    lt():小于(<)
    lte():小于等于(<=)
    between():between? and ?
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.模糊查询

    like():前后加百分号,%J%
    likeLeft():前面加百分号,%J
    likeRight():后面加百分号,J%
    
    • 1
    • 2
    • 3

    映射匹配兼容性

    • 问题一
      在这里插入图片描述
      在这里插入图片描述
    • 问题二
      在这里插入图片描述
      在这里插入图片描述
    • 问题三
      在这里插入图片描述
      在这里插入图片描述
    • 问题四
      在这里插入图片描述
      在这里插入图片描述

    DML编程控制

    id生成策略控制

    在这里插入图片描述
    在这里插入图片描述

    多记录操作

    在这里插入图片描述

    逻辑删除

    在这里插入图片描述
    1.修改数据库,增加删除标记
    2.实体类中添加对应字段,并设定当前字段为逻辑删除标记字段

       //逻辑删除字段,标记当前记录是否删除
        @TableLogic(value = "0",delval = "1")
        private Integer deleted;
    
    • 1
    • 2
    • 3

    3.配置逻辑删除字面值

        logic-delete-field: deleted
        logic-delete-value: 1
        logic-not-delete-value: 0
    
    • 1
    • 2
    • 3

    乐观锁

    待填坑。。。

    代码生成器

    待填坑。。。

  • 相关阅读:
    21.支持向量机—核函数的介绍
    SpringCloud微服务实践之七 网关(Gateway)
    测试网线的仪器叫什么?
    图片引用功能导致的XSS漏洞
    关于原型交互设计文档的一些建议
    鸿蒙系统的开发与学习:一、安装工具与处理报错
    辅助驾驶功能开发-功能对标篇(14)-NOA领航辅助系统-集度
    MQ高级-服务异步通信
    2022年中职组网络安全B模块新题目web应用程序漏洞
    Python使用Mechanize库完成自动化爬虫程序
  • 原文地址:https://blog.csdn.net/weixin_42888638/article/details/125820250