MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
了解 MyBatisPlus
MyBatisPlus 介绍
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
愿景
我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。
代码以及文档
特性
无侵入:
只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:
启动即会自动注入基本 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
进行 CRUD, 并且支持标准 SQL 的数据库,具体支持情况如下:
- mysql,oracle,db2,h2,hsql,sqlite,postgresql,sqlserver,Phoenix,Gauss ,clickhouse,Sybase,OceanBase,Firebird,cubrid,goldilocks,csiidb
- 达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库
框架结构
代码托管
整合 MyBatis-Plus
准备工作
MySQL 5.7 版本及以上。
JDK 8。
IDEA 2020+。
Sql 脚本:
1 | -- 创建数据库 |
1 | -- 创建测试表 |
1 | -- 插入测试数据 |
SpringBoot 整合 Mybatis-Plus
首先创建 springboot 项目。
导入相关依赖
1 |
|
编写 yml 配置文件
1 | # 服务器配置 |
编写 POJO
- User.java
1 | package com.itjing.entity; |
编写 Mapper
- UserMapper.java
1 | package com.itjing.mapper; |
编写启动类
1 |
|
编写测试用例
1 | package com.itjing; |
通用 CRUD
概述
- 通过上面的学习,我们知道通过继承
BaseMapper
可以实现各种各样的单表操作,下面将详细讲解这些操作。
插入操作
方法定义
1 | /** |
测试用例
1 |
|
测试
结果:
数据库记录:
可以看到,数据已经写入到数据库中了,但是,id 的值是不正确的,我们期望的是数据库自增长,实际是 MP 生成了 id 的值写入到数据库中。
MP 支持的 id 策略:
1 | package com.baomidou.mybatisplus.annotation; |
修改 User 对象:
1 |
|
再次测试,数据是自增长的了。
@TableField 注解
在 MP 中通过
@TableField
注解可以指定字段的一些属性,常常解决的问题有 2 个:①对象中的属性名和字段名不一致的问题(非驼峰)。
②对象中的属性字段在表中不存在的问题。
示例:
1 |
|
更新操作
概述
在 MyBatisPlus 中,更新操作有 2 种,一种是根据 id 更新,另一种是根据条件更新。
根据 id 更新
方法定义:
1 | /** |
测试:
1 |
|
根据条件更新
方法定义:
1 | /** |
测试:
1 |
|
删除操作
deleteById
方法定义:
1 | /** |
测试:
1 |
|
deleteByMap
方法定义:
1 | /** |
测试:
1 |
|
delete
方法定义:
1 | /** |
测试:
1 |
|
deleteBatchIds
方法定义:
1 | /** |
测试:
1 |
|
查询操作
概述
MyBatisPlus 提供了多种查询操作,包括根据 id 查询、批量查询、查询单条数据、查询列表、分页查询等操作。
selectById
方法定义:
1 | /** |
测试:
1 |
|
selectBatchIds
方法定义:
1 | /** |
测试:
1 |
|
selectOne
方法定义:
1 | /** |
测试:
1 |
|
selectList
方法定义:
1 | /** |
测试:
1 |
|
selectCount
方法定义:
1 | /** |
测试:
1 |
|
selectPage
方法定义:
1 | /** |
使用分页,首先要配置分页插件
1 | package com.itjing.config; |
测试:
1 |
|
Mybatis Plus 的配置
在 MyBatisPlus 中有大量的配置,其中有一部分是 Mybatis 原生的配置,另一部分是 MyBatisPlus 的配置。
基本配置
configLocation
MyBatis 配置文件位置,如果有单独的 MyBatis 配置,将其路径配置到 configLocation
中。
1 | mybatis-plus: |
mapperLocations
Mybatis Mapper 所对应的 XML 文件配置,如果在 Mapper 中有自定义方法(XML 中有自定义实现),需要进行该配置,告诉 Mapper 所对应的 XML 文件位置。
1 | mybatis-plus: |
typeAliasesPackage
Mybatis 别名包扫描路径,通过该属性可以给包中的类注册别名,注册后在 Mapper 对应的 XML 文件中可以直接使用类名,而不用使用全限定的类名(即 XML 中调用的时候不用包含包名)。
1 | mybatis-plus: |
进阶配置
mapUnderscoreToCamelCase
mapUnderscoreToCamelCase
- 类型:boolean。
- 默认值:true。
是否开启自动驼峰命名规则的映射,即从经典数据库列名 A_COLUMN(下划线命名)到经典的 Java 属性名 AColumn 的类似映射。
注意:
此属性在 Mybatis 中的原默认值为 false,在 MybatisPlux 中,此属性也将用于生成最终的 SQL 的 select body。
如果数据库命名符合规则则无需使用@TableField 注解指定数据库字段名。
1 | mybatis-plus: |
cacheEnabled
cacheEnabled:
- 类型:boolean。
- 默认值:true。
全局的开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为 true。
1 | mybatis-plus: |
DB 策略配置
idType
idType:
- 类型:com.baomidou.mybatisplus.annotation.IdType。
- 默认值:ASSIGN_ID。
全局设置主键类型,设置后,即可省略实体对象中的
@TableId(type=IdType.AUTO)
配置。
1 | mybatis-plus: |
tablePrefix
tablePrefix:
- 类型:String。
- 默认值:null。
表名前缀,全局配置后可省略
@TableName()
的配置。
1 | mybatis-plus: |
条件构造器
概述
在 MyBatisPlus 中,Wrapper
接口的实现类关系如下:
可以看到,AbstractWrapper
和AbstractChainWrapper
是重点实现,我们重点学习AbstractWrapper
及其实现子类。
说明:QueryWrapper(LambdaQueryWrapper)和 UpdateWrapper(LambdaUpdateWrapper)的父类用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件。
注意:entity 生成的 where 条件与使用各个 api 生成的 where 条件没有任何关联行为。
allEq
说明
1 | allEq(Map<R, V> params) |
1 | allEq(Map<R, V> params, boolean null2IsNull) |
1 | allEq(boolean condition, Map<R, V> params, boolean null2IsNull) |
参数说明:
params:key 是数据库字段名,value 为字段值。
null2IsNull:为 true 则在 map 的 value 为 null 时调用 isNull 方法,为 false 时则忽略 value 为 null。
应用示例
1 |
|
基本操作比较
eq:等于
=
ne:不等于
<>
gt:大于
>
lt:小于
<
ge:大于等于
>=
le:小于等于
le
between:
between 值1 AND 值2
notBetween:
NOT between 值1 AND 值2
in:
字段 IN (值1,值2,...)
notIn:
字段 NOT IN (值1,值2,...)
模糊查询
like:
- LIKE ‘%值%’。
- 例:
like("name", "王")
—>name like '%王%'
- 例:
notlike:
- NOT LIKE ‘%值%’。
- 例:
notLike("name", "王")
—>name not like '%王%'
- 例:
likeLeft:
- LIKE ‘%值’。
- 例:
likeLeft("name", "王")
—>name like '%王'
- 例:
LikeRight:
- LIKE ‘值%’。
- 例:
likeRight("name", "王")
—>name like '王%'
- 例:
排序
orderBy:
- 排序:ORDER BY 字段, …
- 例:
orderBy(true, true, "id", "name")
—>order by id ASC,name ASC
- 例:
orderByAsc:
- 排序:ORDER BY 字段, … ASC。
- 例:
orderByAsc("id", "name")
—>order by id ASC,name ASC
- 例:
orderByDesc:
- 排序:ORDER BY 字段, … DESC。
- 例:
orderByDesc("id", "name")
—>order by id DESC,name DESC
- 例:
逻辑查询
or:
- 拼接 OR。
- 例:
eq("id",1).or().eq("name","老王")
—>id = 1 or name = '老王'
- 例:
and:
- AND 嵌套。
- 例:
and(i -> i.eq("name", "李白").ne("status", "活着"))
—>and (name = '李白' and status <> '活着')
- 例:
select
select:设置查询字段。
1 |
|
发布时间: 2021-12-08
最后更新: 2024-06-24
本文标题: MyBatisPlus基础
本文链接: https://blog-yilia.xiaojingge.com/posts/f4b9a74f.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处!
