MyBatisPlus学习笔记
MybatisPlus
目录
- MyBatisPlus简介
- 标准数据层开发
- DQL控制
- DML控制
- 快速开发
MybatisPlus简介
MybatisPlus入门案例
-
MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,意在简化开发、提高效率
-
特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 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入门程序
-
创建新模块,选择Spring初始化,并配置模块相关基础信息
-
选择当前模块需要用的技术集(仅保留JDBC)
-
手动添加起步依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency>
注意事项:
由于mp并未被收录到idea的系统内置配置,无法直接选择加入
-
设置jdbc参数(application.yml)
注意事项:
如果
type
使用Druid数据源,需要导入对应坐标 -
制作实体类和表结构(类名与表名对应,属性名与字段名对应)
-
定义数据接口,继承BaseMapper
@Mapper public interface UserDao extends BaseMapper<User>{ }
-
测试类中注入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标准分页查询功能
-
设置分页拦截器作为Spring管理的bean
@Configuration public class MpConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ //1.定义Mp拦截器 MybatisPlusInterceptor mybatisPlusInterceptor=new MybatisPlusInterceptor(); //2.添加具体拦截器 mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return mybatisPlusInterceptor; } }
-
执行分页查询
@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()); }
-
开启日志
# 开启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);