上一篇文章给大家介绍了到底什么是Mybatis-Plus及它的特性
现在来带大家开始上手Mybatis-Plus,体验MyBatis-Plus的优雅、简洁与强大。
通过观看本视频学习,可以让大家在项目中快速实现持久层开发,熟悉掌握MyBatis , MyBatis Plus的基本概念和使用技巧,采用MyBatis Plus提高基于MyBatis的开发效率。
在线观看链接:
MyBatis plus实战视频教程-带你快速掌握MyBatis-plus
MyBatis plus实战视频教程-带你快速掌握MyBatis-plus_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
资料、源码下载:
Mybatis-Plus视频教程全套免费下载【详细实战系列】 - 动力节点 (bjpowernode.com)
一、快速开始
几分钟就可以上手MP,前提是需要熟悉mybatis,spring或spring boot, maven,掌握lambda表达式更能提升效率。
准备环境:
l 拥有 Java 开发环境以及相应 IDE
l 熟悉 Spring Boot
l 熟悉 Maven
课堂的开发环境:IntelliJ IDEA 2018 Ultimate , MySQL 5.7 , Maven 3 , Spring Boot 2.x。
1、准备数据表
建表sql:
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`email` varchar(80) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2、idea中配置maven
设置maven本地仓库地址
3、创建springboot应用
使用 Spring Initializr 快速初始化一个 Spring Boot 工程
idea中File – New Project 选择 Spring Initializr 后填写项目信息,创建工程。
项目信息:
选择依赖项目MySQL
创建好的项目结构:
5、pom.xml
6、application.yml添加数据库配置
7、实体 entity
@TableId 设置主键, IdType.AUTO使用自动增长产生主键
8、mapper
继承MyBatis Plus中的BaseMapper , 在UserMapper中使用MP中的方法,实现CURD。
9、添加@MapperScan扫描Mapper文件夹
10、测试
二、配置mybatis日志
application.yml
三、CRUD基本用法
CRUD的操作是来自BaseMapper中的方法。BaseMapper中共有17个方法,CRUD操作都有多个不同参数的方法。继承BaseMapper可以其中的方法。BaseMapper方法列表:
1、insert 操作
注:insert()返回值int,数据插入成功的行数,成功的记录数。getId()获取主键值
2、update操作
注意:null的字段不更新
日志:
email没有赋值,是null ,所有没有出现在 set 语句中; age 有默认 0,被更新了。
3、delete操作
删除有多个方法:
(1) deleteById:按主键删除,其他方法后面介绍
(2) 根据Map中条件删除
注:删除条件封装在Map中,key是列名,value是值,多个key之间and联接。
日志:
(3) 批量删除
注:list集合的创建可以使用lambda表达式,也可以使用add()。例如:
idlist.add(1); idlist.add(2);idlist.add(3)…
把要删除的id放入List ,传给deleteBatchIds()。 批量操作使用 in(…)
4、select操作
(1) 根据id主键查询
注:没有查询结果,不会报错。
日志:
(2) 批量查询记录
注:根据id查询记录,把需要查询的多个id存入到List,调用selectBatchIds(),传入List,返回值也是List。 查询条件是 from user where in id (1,2)
(3) 使用Map的条件查询
把要查询的条件字段put到Map,key是字段,value是条件值。多个条件是and联接。调用selectByMap(),传入Map作为参数,返回值是List集合。
更多的查询方式,在后面章节作为专题讲解。包括条件对象Wrapper,lambda表达式,分页查询等等。
四、ActiveRecord(AR)
ActiveRecord是什么::
- 每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表的一行记录; 通常表的每个字段在类中都有相应的Field;
- ActiveRecord负责把自己持久化. 在ActiveRecord中封装了对数据库的访问,通过对象自己实现CRUD,实现优雅的数据库操作。
- ActiveRecord也封装了部分业务逻辑。可以作为业务对象使用。
1、AR之insert
(1) dept表设计
sql:
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`mobile` varchar(50) DEFAULT NULL,
`manager` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
(2) entity实体类
必须继承Model,Model定义了表的CRUD方法,Dept属性名和列名是一样的。
(3) mapper
不使用mapper,也需要定义这个类,MP通过mapper获取到表的结构;不定义时,MP报错无法获取表的结构信息。
(4)测试AR
2、AR之update
创建实体对象,对要更新的属性赋值,null的属性不更新,根据主键更新记录。返回值是boolean,true更新成功。没有更新记录是false。
日志:
3、AR之delete
使用主键作为删除条件,deleteById()参数是主键值,sql语句条件是where id=1。返回值始终是true。通过源码查看:
删除返回值判断条件是 result >=0 ,只有sql语法是正确的,返回就是true。和删除记录的数量无关。
日志:
4、AR之select
(1)对象调用selectById()
对象提供主键值,调用selectById()无参数,使用id=2作为查询条件,返回值是查询的结果对象;没有查询到对象,返回是null;不提供主键id值,报错如下:
com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: selectById primaryKey is null.
(2)selectById(主键)
创建对象,不设值id主键值, selectById的参数是查询条件,和对象的属性值无关。返回值是结果对象,id不存在返回null。
(3)其它方法
查询操作是最多的,其它方法的使用在介绍Wrapper对象后讲解。
五、表和列
主键 ,TableName, TableId
1、主键类型
IdType枚举类,主键定义如下:
0.none没有主键
1.auto自动增长(mysql, sql server)
2.input 手工输入
3.id_worker: 实体类用 Long id , 表的列用 bigint ,int类型大小不够
4.id_worker_str 实体类使用 String id, 表的列使用 varchar 50
5.uuid 实体类使用 String id, 列使用 varchar 50
id_worker: Twitter雪花算法-分布式ID
2、指定表名
定义实体类,默认的表名和实体类同名;如果不一致,在实体类定义上面使用@TableName说明表名称。
例如:@TableName(value=”数据库表名”)
步骤:
(1) 表
(2) entity
(3) mapper
(4) 测试
注入mapper对象
insert记录:
日志:
3、指定列名
(1) 表
(2) entity
(3) mapper
(4) 测试
日志:
4、驼峰命名
列名使用下划线,属性名是驼峰命名方式。MyBatis默认支持这种规则。
(1) 表定义
(2) entity
(3) mapper
(4)测试
日志:
六、自定义sql
1、表定义
2、创建实体
3、创建Mapper
4、新建sql映射xml文件
5、配置xml文件位置
application.yml
6、测试
日志:
七、查询和分页
1、查询构造器:Wrapper
QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件. MP3.x开始支持lambda表达式,LambdaQueryWrapper,LambdaUpdateWrapper支持lambda表达式的构造查询条件。
条件:
条件 | 说明 |
allEq | 基于map的相等 |
eq | 等于 = |
ne | 不等于 <> |
gt | 大于 > |
ge | 大于等于 >= |
lt | 小于 < |
le | 小于等于 <= |
between | BETWEEN 值1 AND 值2 |
notBetween | NOT BETWEEN 值1 AND 值2 |
like | LIKE '%值%' |
notLike | NOT LIKE '%值%' |
likeLeft | LIKE '%值' |
likeRight | LIKE '值%' |
isNull | 字段 IS NULL |
isNotNull | 字段 IS NOT NULL |
in | 字段 IN (value1, value2, ...) |
notIn | 字段 NOT IN (value1, value2, ...) |
inSql | 字段 IN ( sql语句 )例: inSql("age", "1,2,3")--->age in (1,2,3,4,5,6) 例: inSql("id", "select id from table where id < 3")--->id in (select id from table where id < 3) |
notInSql | 字段 NOT IN ( sql语句 ) |
groupBy | GROUP BY 字段 |
orderByAsc | 升序ORDER BY 字段, ... ASC |
orderByDesc | 降序ORDER BY 字段, ... DESC |
orderBy | 自定义字段排序orderBy(true, true, "id", "name")--->order by id ASC,name ASC |
having | 条件分组 |
or | OR 语句,拼接 + OR 字段=值 |
and | AND 语句,拼接 + AND 字段=值 |
apply | 拼接 sql |
last | 在sql语句后拼接自定义条件 |
exists | 拼接 EXISTS ( sql语句 )例: exists("select id from table where age = 1")--->exists (select id from table where age = 1) |
notExists | 拼接 NOT EXISTS ( sql语句 ) |
nested | 正常嵌套 不带 AND 或者 OR |
1)、QueryWrapper:查询条件封装类
方法 | 说明 |
select | 设置查询字段 select 后面的内容 |
2)、UpdateWrapper:更新条件封装类
方法 | 说明 |
set | 设置要更新的字段,MP拼接sql语句 |
setSql | 参数是sql语句,MP不在处理语句 |
2、查询
Student表:初始数据
1)、allEq
以Map为参数条件
a) 条件:name是张三,age是22
日志:where name=”张三” and age = 22
b) 查询条件有 null
true日志:
false日志:
2)、eq
等于 =
name等于李四
日志:
3)、ne
ne 不等于
日志:
4)、gt
gt 大于
日志:
5)、ge
ge 大于等于
日志:
6)、lt
lt 小于
日志:
7)、le
le小于等于 <=
日志:
8)、between
between 在两个值范围之间
日志
9)、notBetween
notBetween 不在两个值范围之间
日志:
10)、like , notLike
like 匹配值 “%值%”
notLike 不匹配 “%值%”
日志:
11)、likeLeft, likeRight
likeLeft 匹配 like “%值”
likeRight 匹配 like “值%”
日志:
12)、isNull , isNotNull
isNull 判断字段值为 null
isNotNull 字段值不为 null
日志:
13)、in , notIn
in 后面值列表, 在列表中都是符合条件的。
notIn不在列表中的
日志:
14)、inSql, notInSql
inSql 常用来做子查询 类似 in()
notInSql 类似 notIn()
日志:
15)、groupBy
groupBy 基于多个字段分组
日志:
16)、orderByAsc ,orderyByDesc , orderBy
orderByAsc 按字段升序
orderByDesc 按字段降序
orderBy 每个字段指定排序方向
日志:
17)、or , and
or 连接条件用or,默认是 and
and 连接条件用and
日志:
18)、last
last 拼接sql语句
日志:
19)、exists ,notExists
exists 拼接 EXISTS ( sql语句 )
notExists 是exists的相反操作
日志:
3、分页
前提: 配置分页插件,实现物理分页。默认是内存分页
分页查询:
日志:
输出:
八、MP生成器
准备条件:
<!-- 模板引擎 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
创建生成类: