上一篇文章给大家介绍了到底什么是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、准备数据表

10分钟快速上手Mybatis-Plus_sql

建表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

10分钟快速上手Mybatis-Plus_mybatis_02

设置maven本地仓库地址

10分钟快速上手Mybatis-Plus_mybatis_03

3、创建springboot应用

使用 ​​Spring Initializr​​ 快速初始化一个 Spring Boot 工程

idea中File – New Project 选择 ​​Spring Initializr​​ 后填写项目信息,创建工程。

10分钟快速上手Mybatis-Plus_sql_04

项目信息:

10分钟快速上手Mybatis-Plus_sql_05

选择依赖项目MySQL

10分钟快速上手Mybatis-Plus_mybatis_06

创建好的项目结构:

10分钟快速上手Mybatis-Plus_sql_07

5、pom.xml

10分钟快速上手Mybatis-Plus_mybatis_08

6、application.yml添加数据库配置

10分钟快速上手Mybatis-Plus_java_09

7、实体 entity

10分钟快速上手Mybatis-Plus_mybatis_10

@TableId 设置主键, IdType.AUTO使用自动增长产生主键

8、mapper

10分钟快速上手Mybatis-Plus_sql_11

继承MyBatis Plus中的BaseMapper , 在UserMapper中使用MP中的方法,实现CURD。

9、添加@MapperScan扫描Mapper文件夹

10分钟快速上手Mybatis-Plus_mysql_12

10、测试

10分钟快速上手Mybatis-Plus_mybatis_13

二、配置mybatis日志

application.yml

10分钟快速上手Mybatis-Plus_sql_14

三、CRUD基本用法

CRUD的操作是来自BaseMapper中的方法。BaseMapper中共有17个方法,CRUD操作都有多个不同参数的方法。继承BaseMapper可以其中的方法。BaseMapper方法列表:

10分钟快速上手Mybatis-Plus_数据库_15

1、insert 操作

10分钟快速上手Mybatis-Plus_mybatis_16

注:insert()返回值int,数据插入成功的行数,成功的记录数。getId()获取主键值

2、update操作

10分钟快速上手Mybatis-Plus_mybatis_17

注意:null的字段不更新

10分钟快速上手Mybatis-Plus_sql_18

日志:

10分钟快速上手Mybatis-Plus_java_19

email没有赋值,是null ,所有没有出现在 set 语句中; age 有默认 0,被更新了。

3、delete操作

删除有多个方法:

10分钟快速上手Mybatis-Plus_mysql_20

(1) deleteById:按主键删除,其他方法后面介绍

10分钟快速上手Mybatis-Plus_sql_21

(2) 根据Map中条件删除

10分钟快速上手Mybatis-Plus_java_22

注:删除条件封装在Map中,key是列名,value是值,多个key之间and联接。

日志:

10分钟快速上手Mybatis-Plus_java_23

(3) 批量删除

10分钟快速上手Mybatis-Plus_java_24

注:list集合的创建可以使用lambda表达式,也可以使用add()。例如:

idlist.add(1); idlist.add(2);idlist.add(3)…

把要删除的id放入List ,传给deleteBatchIds()。 批量操作使用 in(…)

10分钟快速上手Mybatis-Plus_java_25

4、select操作

(1) 根据id主键查询

10分钟快速上手Mybatis-Plus_数据库_26

注:没有查询结果,不会报错。

日志:

10分钟快速上手Mybatis-Plus_sql_27

(2) 批量查询记录

10分钟快速上手Mybatis-Plus_java_28

注:根据id查询记录,把需要查询的多个id存入到List,调用selectBatchIds(),传入List,返回值也是List。 查询条件是 from user where in id (1,2)

(3) 使用Map的条件查询

10分钟快速上手Mybatis-Plus_java_29

把要查询的条件字段put到Map,key是字段,value是条件值。多个条件是and联接。调用selectByMap(),传入Map作为参数,返回值是List集合。

10分钟快速上手Mybatis-Plus_mybatis_30

更多的查询方式,在后面章节作为专题讲解。包括条件对象Wrapper,lambda表达式,分页查询等等。

四、ActiveRecord(AR)

ActiveRecord是什么::

  • 每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表的一行记录; 通常表的每个字段在类中都有相应的Field;
  • ActiveRecord负责把自己持久化. 在ActiveRecord中封装了对数据库的访问,通过对象自己实现CRUD,实现优雅的数据库操作。
  • ActiveRecord也封装了部分业务逻辑。可以作为业务对象使用。

1、AR之insert

(1) dept表设计

10分钟快速上手Mybatis-Plus_sql_31

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实体类

10分钟快速上手Mybatis-Plus_mysql_32

必须继承Model,Model定义了表的CRUD方法,Dept属性名和列名是一样的。

(3) mapper

10分钟快速上手Mybatis-Plus_mysql_33

不使用mapper,也需要定义这个类,MP通过mapper获取到表的结构;不定义时,MP报错无法获取表的结构信息。

(4)测试AR

10分钟快速上手Mybatis-Plus_mysql_34

2、AR之update

10分钟快速上手Mybatis-Plus_数据库_35

创建实体对象,对要更新的属性赋值,null的属性不更新,根据主键更新记录。返回值是boolean,true更新成功。没有更新记录是false。

日志:

10分钟快速上手Mybatis-Plus_数据库_36

3、AR之delete

10分钟快速上手Mybatis-Plus_sql_37

使用主键作为删除条件,deleteById()参数是主键值,sql语句条件是where id=1。返回值始终是true。通过源码查看:

10分钟快速上手Mybatis-Plus_mybatis_38

删除返回值判断条件是 result >=0 ,只有sql语法是正确的,返回就是true。和删除记录的数量无关。

日志:

10分钟快速上手Mybatis-Plus_mysql_39

4、AR之select

(1)对象调用selectById()

10分钟快速上手Mybatis-Plus_mybatis_40

对象提供主键值,调用selectById()无参数,使用id=2作为查询条件,返回值是查询的结果对象;没有查询到对象,返回是null;不提供主键id值,报错如下:

com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: selectById primaryKey is null.

(2)selectById(主键)

10分钟快速上手Mybatis-Plus_数据库_41

创建对象,不设值id主键值, selectById的参数是查询条件,和对象的属性值无关。返回值是结果对象,id不存在返回null。

(3)其它方法

查询操作是最多的,其它方法的使用在介绍Wrapper对象后讲解。

10分钟快速上手Mybatis-Plus_java_42

五、表和列

主键 ,TableName, TableId

1、主键类型

IdType枚举类,主键定义如下:

10分钟快速上手Mybatis-Plus_java_43

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) 表

10分钟快速上手Mybatis-Plus_sql_44

(2) entity

10分钟快速上手Mybatis-Plus_mybatis_45

(3) mapper

10分钟快速上手Mybatis-Plus_mysql_46

(4) 测试

注入mapper对象

10分钟快速上手Mybatis-Plus_数据库_47

insert记录:

10分钟快速上手Mybatis-Plus_数据库_48

日志:

10分钟快速上手Mybatis-Plus_java_49

3、指定列名

(1) 表

10分钟快速上手Mybatis-Plus_java_49

(2) entity

10分钟快速上手Mybatis-Plus_mybatis_51

(3) mapper

10分钟快速上手Mybatis-Plus_java_52

(4) 测试

10分钟快速上手Mybatis-Plus_java_53

日志:

10分钟快速上手Mybatis-Plus_sql_54

4、驼峰命名

列名使用下划线,属性名是驼峰命名方式。MyBatis默认支持这种规则。

(1) 表定义

10分钟快速上手Mybatis-Plus_数据库_55

(2) entity

10分钟快速上手Mybatis-Plus_sql_56

(3) mapper

10分钟快速上手Mybatis-Plus_java_57

(4)测试

10分钟快速上手Mybatis-Plus_mybatis_58

日志:

10分钟快速上手Mybatis-Plus_java_59

六、自定义sql

1、表定义

10分钟快速上手Mybatis-Plus_数据库_60

2、创建实体

10分钟快速上手Mybatis-Plus_mybatis_61

3、创建Mapper

10分钟快速上手Mybatis-Plus_mybatis_62

4、新建sql映射xml文件

10分钟快速上手Mybatis-Plus_sql_63

5、配置xml文件位置

application.yml

10分钟快速上手Mybatis-Plus_mybatis_64

6、测试

10分钟快速上手Mybatis-Plus_mybatis_65

日志:

10分钟快速上手Mybatis-Plus_sql_66

七、查询和分页

1、查询构造器:Wrapper

10分钟快速上手Mybatis-Plus_java_67

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表:初始数据

10分钟快速上手Mybatis-Plus_mysql_68

1)、allEq

以Map为参数条件

a) 条件:name是张三,age是22

10分钟快速上手Mybatis-Plus_mybatis_69

日志:where name=”张三” and age = 22

10分钟快速上手Mybatis-Plus_mybatis_70

b) 查询条件有 null

10分钟快速上手Mybatis-Plus_mysql_71

true日志:

10分钟快速上手Mybatis-Plus_mysql_72

false日志:

10分钟快速上手Mybatis-Plus_mybatis_73

2)、eq

等于 =

name等于李四

10分钟快速上手Mybatis-Plus_mysql_74

日志:

10分钟快速上手Mybatis-Plus_sql_75

3)、ne

ne 不等于

10分钟快速上手Mybatis-Plus_java_76

日志:

10分钟快速上手Mybatis-Plus_数据库_77

4)、gt

gt 大于

10分钟快速上手Mybatis-Plus_数据库_78

日志:

10分钟快速上手Mybatis-Plus_mybatis_79

5)、ge

ge 大于等于

10分钟快速上手Mybatis-Plus_java_80

日志:

10分钟快速上手Mybatis-Plus_java_81

6)、lt

lt 小于

10分钟快速上手Mybatis-Plus_sql_82

日志:

10分钟快速上手Mybatis-Plus_mybatis_83

7)、le

le小于等于 <=

10分钟快速上手Mybatis-Plus_java_84

日志:

10分钟快速上手Mybatis-Plus_sql_85

8)、between

between 在两个值范围之间

10分钟快速上手Mybatis-Plus_数据库_86

日志

10分钟快速上手Mybatis-Plus_mybatis_87

9)、notBetween

notBetween 不在两个值范围之间

10分钟快速上手Mybatis-Plus_数据库_88

日志:

10分钟快速上手Mybatis-Plus_java_89

10)、like , notLike

like 匹配值 “%值%”

notLike 不匹配 “%值%”

10分钟快速上手Mybatis-Plus_java_90

日志:

10分钟快速上手Mybatis-Plus_mysql_91

11)、likeLeft, likeRight

likeLeft 匹配 like “%值”

likeRight 匹配 like “值%”

10分钟快速上手Mybatis-Plus_sql_92

日志:

10分钟快速上手Mybatis-Plus_mysql_93

12)、isNull , isNotNull

isNull 判断字段值为 null

isNotNull 字段值不为 null

10分钟快速上手Mybatis-Plus_sql_94

日志:

10分钟快速上手Mybatis-Plus_mysql_95

13)、in , notIn

in 后面值列表, 在列表中都是符合条件的。

notIn不在列表中的

10分钟快速上手Mybatis-Plus_数据库_96

10分钟快速上手Mybatis-Plus_mybatis_97

日志:

10分钟快速上手Mybatis-Plus_mysql_98

14)、inSql, notInSql

inSql 常用来做子查询 类似 in()

notInSql 类似 notIn()

10分钟快速上手Mybatis-Plus_java_99

日志:

10分钟快速上手Mybatis-Plus_java_100

15)、groupBy

groupBy 基于多个字段分组

10分钟快速上手Mybatis-Plus_mybatis_101

日志:

10分钟快速上手Mybatis-Plus_数据库_102

16)、orderByAsc ,orderyByDesc , orderBy

orderByAsc 按字段升序

orderByDesc 按字段降序

orderBy 每个字段指定排序方向

10分钟快速上手Mybatis-Plus_数据库_103

日志:

10分钟快速上手Mybatis-Plus_java_104

17)、or , and

or 连接条件用or,默认是 and

and 连接条件用and

10分钟快速上手Mybatis-Plus_mysql_105

日志:

10分钟快速上手Mybatis-Plus_mybatis_106

18)、last

last 拼接sql语句

10分钟快速上手Mybatis-Plus_sql_107

日志:

10分钟快速上手Mybatis-Plus_mybatis_108

19)、exists ,notExists

exists 拼接 EXISTS ( sql语句 )

notExists 是exists的相反操作

10分钟快速上手Mybatis-Plus_java_109

日志:

10分钟快速上手Mybatis-Plus_数据库_110

3、分页

前提: 配置分页插件,实现物理分页。默认是内存分页

10分钟快速上手Mybatis-Plus_数据库_111

分页查询:

10分钟快速上手Mybatis-Plus_mysql_112

日志:

10分钟快速上手Mybatis-Plus_数据库_113

输出:

10分钟快速上手Mybatis-Plus_mysql_114

八、MP生成器

准备条件:

<!-- 模板引擎 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>

创建生成类:

10分钟快速上手Mybatis-Plus_mybatis_115

10分钟快速上手Mybatis-Plus_mysql_116

10分钟快速上手Mybatis-Plus_java_117

10分钟快速上手Mybatis-Plus_java_118