1、介绍
1、概述
是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率
2、官网
https://www.baomidou.com/
3、特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
2、MP基本使用
1、增加
insert
动态SQL,字段为空,则不插入该字段
自动主键回填
User user = User.builder()
.name("张三")
.age(15)
.tel("17853698745")
.password("123456")
.build();
int insert = userMapper.insert(user);
System.out.println(insert);
System.out.println(user.getId());
2、删除
deleteById
根据ID删除
deleteBatchIds
根据ID列表删除
delete
根据条件删除
int row = userMapper.deleteById(12);
System.out.println(row);
row = userMapper.deleteBatchIds(Arrays.asList(15,18,21));
System.out.println(row);
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name","张三");
row = userMapper.delete(wrapper);
System.out.println(row);
3、更新
updateById
根据ID更新
update
根据条件更新
User user = User.builder()
//.id(7L)
//.name("update")
.build();
//int row = userMapper.updateById(user);
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.set("name","张大炮");
wrapper.eq("id",7L);
int row = userMapper.update(user,wrapper);
System.out.println(row);
4、查询
selectById
根据ID更新
selectBatchIds
根据ID列表查询
selectOne
根据条件查询一个
selectCount
根据条件计数
selectList
根据条件查询
selectPage
根据条件分页
User user = userMapper.selectById(1);
System.out.println(user);
List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 5, 7));
users.forEach(System.out::println);
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getName,"jack");
user = userMapper.selectOne(lambdaQueryWrapper);
System.out.println(user);
Integer count = userMapper.selectCount(lambdaQueryWrapper);
System.out.println(count);
List<User> userList = userMapper.selectList(lambdaQueryWrapper);
userList.forEach(System.out::println);
IPage<User> ipage = new Page<>(1,3);
userMapper.selectPage(ipage,null);
System.out.println(ipage);
5、显示日志【包括SQL】
# 开启mp的日志(输出到控制台)
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
6、分页
1、配置分页拦截器
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor interceptor(){
//mybatisplus的拦截器
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//增加分页拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
3、DQL
1、条件查询
核心接口:Wrapper
QueryWrapper
根据数据库字段名查询
LambdaQueryWrapper
使用Lambda表达式查询
不需要自己写列名,是通过方法引用来获取列名
LambdaUpdateWrapper
使用Lambda表达式更新
多条件关系
and
or
Lambda链式编程
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.like(User::getName,"张三")//name like '%name%'
.ge(User::getAge,10)//where age>=10
.lt(User::getAge,100)//age<100
.likeRight(User::getPassword,"123");//Password like '123%'
List<User> userList = userMapper.selectList(lambdaQueryWrapper);
userList.forEach(System.out::println);
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
String name="张三";
Integer age = 20;
lambdaQueryWrapper.between(age!=null,User::getAge,10,100)
.like(name!=null,User::getName,name)
.or()
.like(User::getPassword,"123");
List<User> userList = userMapper.selectList(lambdaQueryWrapper);
userList.forEach(System.out::println);
2、投影查询
指定查询字段
分组
groupBy
排序
orderBy
orderByAsc
orderByDesc
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
/*lambdaQueryWrapper.select(User::getPassword);
lambdaQueryWrapper.groupBy(User::getPassword);*/
String name=null;
lambdaQueryWrapper.orderBy(name!=null,true,User::getAge);
lambdaQueryWrapper.orderByDesc(User::getAge,User::getName);
List<User> userList = userMapper.selectList(lambdaQueryWrapper);
userList.forEach(System.out::println);
4、注解
1、@TableName
映射表名
当表名与实体类名不相同时,需要手动指定表名
配置文件可以指定全局配置
2、@TableId
映射主键
属性type
指定主键生成策略。IdType这个枚举控制
AUTO:数据库自增
ASSIGN_ID:雪花算法
通过5位机器ID,5位工作ID,在1ms之内可以生成连续的长整型数字 4095 个
局部配置
优先于 全局配置
配置文件可以指定全局配置
3、@TableField
映射普通字段
属性 fill
要配置 MetaObjectHandler 处理