MyBatisPlus学习笔记

MybatisPlus

目录

  • MyBatisPlus简介
  • 标准数据层开发
  • DQL控制
  • DML控制
  • 快速开发

MybatisPlus简介

MybatisPlus入门案例

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

  • 官网:https://mybaits.plus/ https://mp.baomidou.com/

  • 特性

    • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
    • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
    • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
    • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
    • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
    • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
    • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
    • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
    • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
    • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
    • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
    • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

  • 开发方式

    • 基于MyBatis使用MyBatisPlus
    • 基于Spring使用MyBatisPlus
    • 基于SpringBoot使用MyBatisPlus
  • SpringBoot整合MyBatis开发过程(复习)

    • 创建SpringBoot工程
    • 勾选配置使用的技术
    • 设置dataSource相关属性(JDBC参数)
    • 定义数据层接口映射配置

  • SpringBoot整合MyBatisPlus入门程序

    1. 创建新模块,选择Spring初始化,并配置模块相关基础信息

    2. 选择当前模块需要用的技术集(仅保留JDBC)

    3. 手动添加起步依赖

      <dependency>
          <groupId>com.baomidou</groupId>
          <artifactId>mybatis-plus-boot-starter</artifactId>
          <version>3.4.1</version>
      </dependency>
      

      注意事项:

      由于mp并未被收录到idea的系统内置配置,无法直接选择加入

    4. 设置jdbc参数(application.yml)

      注意事项:

      如果type使用Druid数据源,需要导入对应坐标

    5. 制作实体类和表结构(类名与表名对应,属性名与字段名对应)

    6. 定义数据接口,继承BaseMapper

      @Mapper
      public interface UserDao extends BaseMapper<User>{
      }
      
    7. 测试类中注入dao接口,测试功能

      @SpringBootTest
      class MybatisplusApplicationTests{
      	@Autowired
          private UserDao userDao;
          @Test
          public void testGetAll(){
              List<User> userList = userDao.selectList(null);
              userList.forEach(System.out::println);
          }
      }
      

标准数据层开发

![img](file:///C:\Users\86183\Documents\Tencent Files\1749886464\Image\C2C\7348D8C74C5EBA2CD60E5DD6698BA7FC.jpg)

MP标准分页查询功能

  1. 设置分页拦截器作为Spring管理的bean

    @Configuration
    public class MpConfig {
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor(){
            //1.定义Mp拦截器
            MybatisPlusInterceptor mybatisPlusInterceptor=new MybatisPlusInterceptor();
            //2.添加具体拦截器
            mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
            return mybatisPlusInterceptor;
        }
    }
    
    
  2. 执行分页查询

    @Test
        void testByPage(){
            IPage page = new Page(1,4);
            bookDao.selectPage(page,null);
            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());
        }
    
  3. 开启日志

    # 开启mp的日志(输出到控制台)
    mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    

    一般用来调试程序,出来问题再去看

DQL编程控制

目录

  • 条件查询方式
  • 查询投影
  • 查询条件设定
  • 字段映射与表名映射
条件查询
  • MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合
设置查询条件
  • 格式一:常规格式
QueryWapper<User> qw = new QueryWrapper<User>();
//查询年龄大于等于18岁,小于65岁的用户
qw.lt("age",65);
qw.ge("age",18);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);
  • 格式二:链式编程格式

    QueryWapper<User> qw = new QueryWrapper<User>();
    //查询年龄大于等于18岁,小于65岁的用户
    qw.lt("age",65).ge("age",18);
    List<User> userList = userDao.selectList(qw);
    System.out.println(userList);
    
  • 格式三:lambda格式(推荐)

    QueryWapper<User> qw = new QueryWrapper<User>();
    //查询年龄大于等于18岁,小于65岁的用户
    qw.lambda().lt(User::getAge,65).ge(User::getAge,18);
    List<User> userList = userDao.selectList(qw);
    System.out.println(userList);
    
  • 格式四:lambda格式(推荐)

    LambdaQueryWapper<User> lqw = new LambdaQueryWrapper<User>();
    //查询年龄大于等于18岁,小于65岁的用户
    lqw.lt(User::getAge,65).ge(User::getAge,18);
    List<User> userList = userDao.selectListl(lqw);
    System.out.println(userList);
    
null值处理
  • 首先在domain内创建一个query文件夹,在里面编写一个UserQuery类并继承User类,并在里面编写新的对应属性

    @Data
    public class UserQuery extends User{
    	private Integer age2;
    }
    
  • if语句控制条件追加

    LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
    if(null != userQuery.getAge()){
    	lqw.ge(User::getAge,userQuery.getAge());
    }
    if(null != userQuery.getAge2()){
    	lqw.lt(User::getAge,userQuery,getAge2());
    }
    List<User> userList = userDao.selectList(lqw);
    System.out.println(userList);
    
  • 条件参数控制

    LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
    lqw.ge(null != userQuery.getAge(),User::getAge,userQuery.getAge());
    lqw.lt(null != userQuery.getAge2(),User::getAhe,UserQuery.getAge2());
    List<User> userList = userDao.selectList(lqw);
    System.out.println(userList);
    
  • 条件参数控制

    LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
    lqw.ge(null != userQuery.getAge,User::getAge,userQuery.getAge()).lt(
    null != userQuery.getAge2(),User::getAge,userQuery.getAge2());
    System.out.println(userList);
    
查询投影
  • 查询结果包含模型类中部分属性

    LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
    lqw.select(User::getId,User::getName,User::getAge);
    List<User> userList = userDao.selectList(lqw);
    System.out.println(userList);
    
  • 查询结果包含模型类中未定义的属性

    QueryWrapper<User> qm = new QueryWrapper<User>();
    qm.select("count(*) as nums,gender");
    qm.groupBy("gender");
    List<Map<String,Object>> maps = userDao.selectMaps(qm);
    System.out.println(maps);
    
posted @ 2022-12-09 22:22  筝弈  阅读(43)  评论(0编辑  收藏  举报
2 3
4