MyBatis-plus (MP) 使用
MyBatis-plus (MP) 使用
快速开始
导入依赖
1 | <dependency> |
Mapper方法
1 | // 继承 BaseMapper<T> 类 |
常用注解
@TableName
1 | 描述:表名注解 |
@TableField
1 | 描述:字段注解(非主键) |
PS: MP在于字段匹配过程中自动将表列名中的下划线-排除, 并将-后面单词的首字母大写
@TableId
1 | 描述:主键注解 |
@Version【拓展】
1 | 描述:乐观锁注解、标记 在字段上 |
通用Mapper接口
- 通用 CRUD 封装BaseMapper接口,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器
- 泛型 T 为任意实体对象
- 参数 Serializable 为任意类型主键 Mybatis-Plus 不推荐使用复合主键约定每一张表都有自己的唯一 id 主键
- 对象 Wrapper 为 条件构造器
日志 (yml文件)
1 | 第一种: |
insert
insert(T entity)
1 | /** |
update
1 | Wrapper: 是条件构造器, 用于构建各种where条件 |
updateById(id)
1 | /** |
update(entity, wrapper)
1 | /** |
使用建议
知道id,并且所有更新使用updateById
部分字段更新,使用update使用这种方式:wrapper.条件.set更新字段
**updateById: **全量更新, 只要传入对象属性不为null, 都可以进行update更新, 条件是通过id匹配
正确操作姿势(前提: 必须知道id):
1.查 2.替换 3.更新
- update+wrapper:部分字段更新, 通过wrapper对象拼接各种满足要求条件, 更新set的列由wrapper 决定
正确操作姿势:
1.设置更新条件 2.拼接更新列
delete
deleteById(id)
1 | /** |
deleteBatchIds(idList)
1 | /** |
deleteByMap(map)
1 | /** |
delete(wrapper)
1 | /** |
select
selectById(id)
1 | /** |
selectBatchIds(idList)
1 | /** |
selectByMap(map)
1 | /** |
selectCount(wrapper)
1 | /** |
selectList(wrapper)
1 | /** |
selectMaps(wrapper)
1 | /** |
PS: 当查询的数据是对象中没有的列时, 可调selectMaps(wrapper)方法
selectPage(page, wrapper)
1 | /** |
selectOne(wrapper)
1 | /** |
selectObjs(wrapper)【拓展】
1 | /** |
selectMapsPage(page, wrapper)【拓展】
1 | /** |
条件构造器
继承体系
Wrapper: 条件构造抽象类,最顶端父类
- AbstractWrapper: 用于查询条件封装,生成 sql 的 where 条件
- QueryWrapper: Entity 对象封装操作类,不是用lambda语法
- UpdateWrapper: Update 条件封装,用于Entity对象更新操作
- AbstractLambdaWrapper: Lambda 语法使用 Wrapper统一处理解析 lambda - 获取 column。
- LambdaQueryWrapper:看名称也能明白就是用于Lambda语法使用的查询- Wrapper
- LambdaUpdateWrapper: Lambda 更新封装Wrapper
更新操作
普通更新
1 | 需求:将id=1的员工name改为xiaowen |
UpdateWrapper更新
set
1 | set(String column, Object val) |
setSql
1 | setSql(String sql) |
LambdaUpdateWrapper更新 (推荐使用)
1 | 需求:将id=1的用户name改为xiaowen |
查询操作
QueryWrapper查询
1 | 需求:查询name=xiaowen, age=18的用户 |
LambdaQueryWrapper查询 (推荐使用)
1 | 需求:查询name=xiaowen, age=18的用户 |
工具类:Wrappers
1 | 用于创建各种类型的wrapper |
高级查询
QueryWrapper
LambdaQueryWrapper常用的条件查询,UpdateWrapper涉及到的条件同理可得即可。
列投影
select
1 | //参数:指定查询后返回的列 |
排序
orderByAsc/orderByDesc
1 | orderByAsc: 正序排序 |
orderBy
1 | orderBy:定制排序 |
分组查询
groupBy
1 | groupBy : 分组:GROUP BY 字段, ... |
having
1 | having : HAVING ( sql语句 ) |
条件查询
比较运算符
allEq/eq/ne
1 | allEq : 全等匹配 |
gt/ge/lt/le
1 | gt : 大于 > |
between/notBetween
1 | between : BETWEEN 值1 AND 值2 |
isNull/isNotNull
1 | isNull : 字段 IS NULL |
in/notIn/inSql/notInSql
1 | in : 字段 IN (value1, value2, ...) |
exists/notExists【拓展】
1 | exists: 拼接 EXISTS ( sql语句 ) |
模糊查询
like/notLike
1 | like: LIKE '%值%' |
likeLeft/likeRight
1 | likeLeft : LIKE '%值' |
逻辑运算符
or
1 | or : 拼接 OR |
and
1 | and : 默认是and操作 |
自定义SQL
注解方式【拓展】
单表查询
1 |
|
关联查询
1 |
|
PS: 在开发中,我们使用mybatis+mp搭配开发, 它们会发挥各自的优势,并弥补对方的短板,这就是最好的方式。
通用Service接口
通用方式
1 | 1:自定义服务接口集成IService接口 |
常用方法
getBaseMapper() : 获取引用的XxxxMapper对象
getOne(wrapper) : 指定条件查询单个, 结果数据超过1个报错
list(wrapper) : 指定条件查询多个
page(page, wrapper) : 分页+高级查询
1 | 步骤1:配置分页插件 |
PS : 分页信息封装对象,里面有各种分页相关信息, 等价于之前的PageInfo
事务
1 | 需求:在IEmployeeService 定义一个tran方法, 执行save2次, 在中间模拟事务 |





