文章目录
- 第一节 MyBatis Plus 的简介
- 第二节 MyBatis Plus 的框架搭建
- [1] 第一步:导包
- [2] 搭建SSM开发环境
- [3] 在数据库中创建测试表
- [4] 在pojo层下创建Student表的实体类
- [5] 在mapper层创建StudentMapper接口并继承BaseMapper接口
- [6] 创建测试类,并从Spring容器中获取StudentMapper的接口的实例化对象并使用对象完成数据的查询操作,查询所有的学生信息
- [7] MyBatis和Mybatis Plus的使用比较
- 第三节MyBatis Plus 中的CRUD
- [1] 添加操作
- [2] 修改操作
- [3] 删除操作
- [4] 查询操作
- 第四节MyBatis Plus 条件构造器Wrapper的使用
- [1] Wrapper条件构造器的介绍
- [2] QueryWrapper常用的方法说明
- [3] 带条件的查询的代码示例
- 第五节:MybatisPlus的分页查询
- [1] MybatisPlus的分页查询介绍
- [2] MybatisPlus的分页查询的配置
- [3] MybatisPlus分页查询的使用
- 第六节 MybatisPlus的常用注解
- [1] MybatisPlus的注解的介绍
- [2] 常用注解及其作用
- [3] MybatisPlus中获取自增的主键值
- 第七节 MybatisPlus的全局配置策略
- [1] 全局配置策略介绍
- [2] 全局配置策略示例
- 第八节 Active Record
- [1] AR模式和MP的Mapper模式的比较
- [2] AR模式的特点
- [3] AR模式的使用代码示例
- [1] MP的代码生成器介绍
- [2] MP代码生成器的使用
第一节 MyBatis Plus 的简介
[1] 为什么使用MyBatis Plus?
A、再之前学习的Mybatis中 我们对单表的增删改查的操作,都是自己再mapper.xml中进行代码的书写,这样一来我们书写的代码比较的麻烦。
B、我们目前封装数据库的实体的时候,每一表都需要自己的书写实体类,这样一来,我们书写的代码就比较的麻烦。
[2] 解决的方案
MyBatis Plus:其实就是对MyBatis的进一步的封装。
[3]MyBatis Plus 的简介
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。官方文档说的愿景是成为 Mybatis 最好的搭档,就像魂斗罗中的1P、2P,基友搭配,效率翻倍。
2,特性
3,架构原理
第二节 MyBatis Plus 的框架搭建
[1] 第一步:导包
在原有SSM的jar包的基础上增加MybatisPlus的jar即可。

[2] 搭建SSM开发环境
-
在Src下创建MVC的包结构
-
在src下创建和配置SSM相关配置文件
注意:
其他配置和原有SSM流程不变,在applicationcontext.xml文件中
将Mybatis的工厂bean替换为MybatisPlus的工厂bean即可。
-
在web.xml中配置SSM相关信息
[3] 在数据库中创建测试表
创建t_student表并添加测试数据
[4] 在pojo层下创建Student表的实体类
[5] 在mapper层创建StudentMapper接口并继承BaseMapper接口
[6] 创建测试类,并从Spring容器中获取StudentMapper的接口的实例化对象并使用对象完成数据的查询操作,查询所有的学生信息
[7] MyBatis和Mybatis Plus的使用比较
1、MybatisPlus包含了Mybatis的所有功能,也就说在MybatisPlus中我们仍然可以按照Mybatis的方式来完成数据库的操作(无侵入)。
2、MybatisPlus的数据库操作的Mapper层的接口只需要继承BaseMapper接口,就自动的拥有了当前对应的表的基本的CRUE操作,无需声明接口方法及其xml文件,极大的提升了开发效率(MybatisPlus是通过实体类来逆向动态生成对应的表的基本的Sql语句)
第三节MyBatis Plus 中的CRUD
[1] 添加操作
[2] 修改操作
[3] 删除操作
[4] 查询操作
第四节MyBatis Plus 条件构造器Wrapper的使用
[1] Wrapper条件构造器的介绍
问题:
目前我们可以使用mp完成基本的增删改查操作,但是我们在进行数据操作
时,很多时候Sql语句中的筛选条件是非常复杂的,比如or关键,>,<,模
糊查询等,怎么办?
解决:
mp提供了功能非常强大的Wrapper条件构造器
本质:
条件构造器其实就是一个对象,以方法的形式提供了数据库操作的筛选关键字
我们调用该对象,来拼接我们的筛选条件即可。
实现:
QueryWrapper
使用:
创建QueryWrapper对象,使用该对象中提供的对应的数据库操作的方法,来
完成条件的拼接,QueryWrapper对象最终存储拼接好的Sql片段,将片段
拼接在Sql语句中。
[2] QueryWrapper常用的方法说明
[3] 带条件的查询的代码示例
第五节:MybatisPlus的分页查询
[1] MybatisPlus的分页查询介绍
问题:
对于传统的分页Sql语句,需要我们自己在Sql语句中
使用limit关键字来实现分页查询。但是呢,在MybatisPlus
中,Sql语句是动态生成的,那么如何完成数据的分页查询呢?
解决:
使用分页插件。
使用:
- 在配置文件中配置分页插件
- 在代码中调用分页效果
[2] MybatisPlus的分页查询的配置
[3] MybatisPlus分页查询的使用
第六节 MybatisPlus的常用注解
[1] MybatisPlus的注解的介绍
问题:
在使用MybatisPlus后,我们不用再声明Sql语句了,只需要我们的Mapper
接口继承BaseMapper接口即可拥有对应的CRUD操作。通过我们之前的学习
我们发现,MyBatisPlus其实在根据我们的实体类来动态的生成对象的Sql语句
默认会按照类名即是对应的表的表名,属性名即是对应的表的字段名。但是如果
实体类名和表名不一致,或者属性名和字段名不一致怎么办?
解决:
在实体类上使用注解表名对应的映射关系。
注意:
建议大家在开发时尽量保证实体类和表之间的对应关系是相同的。这样就不用
声明注解。
[2] 常用注解及其作用
- @TableName注解
作用:表明实体类对应的数据库表
使用:在类名上使用,值为对应的表的表名
示例:
官方说明:
- @TableId
作用:表明类中的某个属性为主键字段对应的属性
使用:在为主键的属性上使用
示例:
官方说明:
-
@TableField
作用:表明普通属性映射的表中的字段,值为字段名
使用:在普通属性上使用
示例:
官方说明:
[3] MybatisPlus中获取自增的主键值
在Mybatis中需要使用 useGeneratedKeys,keyProperty,keyColumn 设置自增主键值的回返,在实体类对象中获取即可。在MybatisPlus中在进行数据新增时,在新增成功后,会自动的将自增的主键值返回到实体类对象中,前提是需要在实体类中使用@TableId表明主键字段,并且为自增类型。
第七节 MybatisPlus的全局配置策略
[1] 全局配置策略介绍
问题:
假如我们每个实体类和数据库中的表名都不一致,表的格式都是t_表名
类名呢没有t_字符,比如t_student表和Student类。这样每个实体类
上我们都要使用@TableName注解来表名类和表的映射关系,过于麻烦
怎么办?
解决:
使用MP的全局配置策略。GlobalConfig
作用:
配置表和类名映射关系的前缀。
配置全局主键自增
[2] 全局配置策略示例
第八节 Active Record
支持 ActiveRecord 模式:
支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
[1] AR模式和MP的Mapper模式的比较
- 原有MP的Mapper模式
① 创建项目完成Spring和MP的集成
② 创建数据库表对应的实体类
③ 创建mapper接口并继承BaseMapper接口
④ 从Spring容器中获取Mapper接口的实例化对象完成数据库操作
描述:
通过以上流程,MP的操作模式较于原有Mybatis的数据库操作流程
没有任何变化,只是我们在编写代码的时候不用在mapper层声明
Sql语句或者XML文件了,提升开发效率。 - MP的AR模式
① 创建项目完成Spring和MP的集成
② 创建数据库表对应的实体类,继承Model类
③ 在实体类中覆写pkVal方法.
④ 创建Mapper接口并继承BaseMapper接口
⑤ 创建Spring对象,让Spring容器完成对Mapper层的实例化扫描
⑥ 创建实体类对象,直接调用实体类从Model中继承的数据库方法完成
数据库操作。 - 流程比较分析
MP的AR模式其实底层仍然使用的是Mapper层在完成数据库操作。
只不过由我们自己调用Mappe对象操作数据库,变成了通过
实体类对象来调用Mapper完成数据库操作。从代码的物理视图上
我们是看不到实体类调用Mapper的过程的。也就说,本质上仍然
是Mapper层在操作数据库
[2] AR模式的特点
AR模式较于传统的MP模式操作数据库,在代码体系中,我们不用在获取Mapper对象,然后再将实体类传入给mapper层完成数据库操作,直接使用实体类即可完成操作。
提升开发效率。
[3] AR模式的使用代码示例
-
创建一个集成了MP的SSM项目
-
在pojo层创建实体类,并继承Model类,覆写pkVal的方法
-
使用AR模式完成数据库操作
第九节 AutoGenerator代码生成器
[1] MP的代码生成器介绍
问题:
目前我们在开发SSM项目的时候,会先搭建一个SSM的开发环境。我们会根据数据库的表在pojo包中创建对应的实体类,而且可以不关心项目功能的同时,在mapper层对数据库的表的基础增删改查功能提前实现,同理,在service层可以将基础的业务代码提前声明。然后再根据项目功能完成对应的复杂操作。而整个过程需要程序员手动
完成搭建,效率低下。
解决:
创建一个代码生成类,调用该类的对象,并将对应的数据库表作为参数传递进入
以及一些生成代码的其他要求也传递给该对象,让该对象帮助我们生成基础的开发
代码。
实现:
MP的代码生成器
作用:
根据数据库中的表动态的生成表对应的mapper,service,pojo,controller层的基础代码,提升开发效率。
[2] MP代码生成器的使用
-
导入代码生成器相关jar包
-
使用代码生成器生成代码
package com.bjsxt.test;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;public class TestCode {public static void main(String[] args) {// 代码生成器AutoGenerator mpg = new AutoGenerator();//全局配置策略GlobalConfig gc = new GlobalConfig();String path = System.getProperty("user.dir");//动态获取当前项目的路径System.out.println(path);gc.setFileOverride(false);// 是否覆盖同名文件,默认是falsegc.setActiveRecord(true);// 不需要ActiveRecord特性的请改为falsegc.setEnableCache(false);// XML 二级缓存gc.setBaseResultMap(true);// XML ResultMapgc.setBaseColumnList(false);// XML columListgc.setOutputDir(path+"/09-mp-code/src");gc.setIdType(IdType.AUTO);//设置主键策略//数据源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setUrl("jdbc:mysql://localhost:3306/mp?useUnicode=true&useSSL=false&characterEncoding=utf8");// dsc.setSchemaName("public");dsc.setDriverName("com.mysql.jdbc.Driver");dsc.setUsername("root");dsc.setPassword("1234");// 包配置PackageConfig pc = new PackageConfig();pc.setParent("com.bjsxt").setMapper("mapper").setService("service").setController("controller").setEntity("pojo").setXml("mapper");//策略配置StrategyConfig stConfig = new StrategyConfig();stConfig.setCapitalMode(true) //全局大写命名.setNaming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略.setTablePrefix("t_").setInclude("t_student"); // 生成的表,多个表继续传递即可,String类型的可变参数//将策略配置对象集成到代码生成器中mpg.setGlobalConfig(gc);mpg.setDataSource(dsc);mpg.setPackageInfo(pc);mpg.setStrategy(stConfig);//执行生成mpg.execute();}
}