概述 {#概述}
目标:MybatisPlus, 为简化 Mybatis 开发而生, 只做增强, 不做改变
简介 {#简介}
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。简单来说就是简化 JDBC 操作
愿景
我们的愿景是成为 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
支持的数据库 {#支持的数据库}
几乎包含市面上所有主流数据库
- mysql 、 mariadb 、 oracle 、 db2 、 h2 、 hsql 、 sqlite 、 postgresql 、 sqlserver 、 presto
- 达梦数据库 、 虚谷数据库 、 人大金仓数据库
框架结构 {#框架结构}
快速开始 {#快速开始}
官方地址:传送门
核心步骤:
使用第三方组件:
- 导入对应的依赖
- 研究依赖如何配置
- 代码如何编写
- 提高扩展技术能力
- 创建表
DROP TABLE IF EXISTS USER;
CREATE TABLE USER (
id BIGINT ( 20 ) NOT NULL COMMENT '主键 ID',
NAME VARCHAR ( 30 ) NULL DEFAULT NULL COMMENT '姓名',
age INT ( 11 ) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR ( 50 ) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY ( id )
);
DELETE FROM USER;
INSERT INTO USER ( id, NAME, age, email )
VALUES
( 1, 'Jone', 18, 'test1@baomidou.com' ),
( 2, 'Jack', 20, 'test2@baomidou.com' ),
( 3, 'Tom', 28, 'test3@baomidou.com' ),
( 4, 'Sandy', 21, 'test4@baomidou.com' ),
( 5, 'Billie', 24, 'test5@baomidou.com' );
-- 真实开发中,version(乐观锁)、deleted(逻辑删除)、gmt_create、gmt_modified
- 创建
spring-boot
项目, 导入依赖, 初始化项目
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 简化实体类 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.43</version>
</dependency>
<!--mybatis-plus 启动器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<!--spring-boot-test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
注意: 在使用 mybatis-plus 可以简化我们大量的代码, 不可以在同一个项目下导入 mybatis 依赖和 mybatis-plus, 会有版本冲突!!!
- 配置数据库连接相关内容
# MySQL5
spring:
datasource:
url: jdbc:mysql://localhost:3306/index
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
# MySQL8 配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
注意:
- MySQL5 和 MySQL8 驱动不同
- MySQL-5:
com.mysql.jdbc.Driver
- MySQL-8:
com.mysql.cj.jdbc.Driver
- MySQL8 需要增加时区配置
serverTimezone=GMT%2B8
- 创建实体类
@Getter
@Setter
@ToString
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
- 创建
dao
接口
/**
* Software:IntelliJ IDEA 2020.1 x64
* Author: MoBai·杰
* Date: 2020/6/8 14:05
* ClassName:UserDao
* 使用 mybatis-plus, 每个 mapper 接口都需要继承 BaseMapper
* BaseMapper 类描述: Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得 CRUD 功能
*/
@Repository // 表示持久层
public interface UserDao extends BaseMapper<User> {
}
- 全局启动类添加
扫描 mapper 接口
/**
* 全局启动类
*/
// 表示扫描 mapper 包下的所有接口
@MapperScan("com.mobai.mybatis_plus.dao")
@SpringBootApplication
public class MybatisPlusApplication {
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">SpringApplication</span><span class="token punctuation">.</span><span class="token function">run</span><span class="token punctuation">(</span><span class="token class-name">MybatisPlusApplication</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> args<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
}
- 测试类
@SpringBootTest
class MybatisPlusApplicationTests {
<span class="token comment">// 注入 Dao 接口, 继承 BaseMapper</span>
<span class="token annotation punctuation">@Autowired</span>
<span class="token keyword">private</span> <span class="token class-name">UserDao</span> userDao<span class="token punctuation">;</span>
<span class="token annotation punctuation">@Test</span>
<span class="token keyword">void</span> <span class="token function">contextLoads</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// 调用 BaseMapper 查询方法 <selectList></span>
<span class="token class-name">List</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">User</span><span class="token punctuation">></span></span> list <span class="token operator">=</span> userDao<span class="token punctuation">.</span><span class="token function">selectList</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
list<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token operator">::</span><span class="token function">println</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
}
- 效果
思考 {#思考}
- SQL 是谁帮我们写的?
- Mybatis-plus 帮我们写好了
- 方法哪里来的?
- Mybatis-plus 帮我们写的
配置日志输出 {#配置日志输出}
yml 配置添加日志处理
# 配置日志输出 使用默认控制台打印
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- 测试
插入测试和雪花算法 {#插入测试和雪花算法}
- 添加
/**
* 添加数据
*/
@Test
public void testInsert() {
User user = new User();
user.setName("墨白君");
user.setAge(25);
user.setEmail("mobaijun8@163.com");
// mybatis-plus 会自动帮助我们生成主键 ID
int insert = userDao.insert(user);
// 被影响的行数
System.out.println("insert =" + insert);
// ID 会自动回填
System.out.println("user =" + user);
}
数据库插入的 ID 是全局唯一 ID
主键生成策略 {#主键生成策略}
mybats-plus
默认策略为:ID_WORKER
扩展: 分布式系统唯一 ID 生成:传送门
雪花算法 {#雪花算法}
Twitter 的 snowflake 算法
snowflake 是 Twitter 开源的分布式 ID 生成算法,结果是一个 long 型的 ID。其核心思想是:使用 41bit 作为毫秒数,10bit 作为机器的 ID(5 个 bit 是数据中心,5 个 bit 的机器 ID),12bit 作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是 0。以上实现思路基本可以保证主键 ID 为全球唯一
Mybatis-Plus 提供的所有策略 {#Mybatis-Plus 提供的所有策略}
看IdType
源码
public enum IdType {
/**
* 数据库 ID 自增
*/
AUTO(0),
/**
* 该类型为未设置主键类型
*/
NONE(1),
/**
* 用户输入 ID
* 该类型可以通过自己注册自动填充插件进行填充
*/
INPUT(2),
<span class="token comment">/* 以下 3 种类型、只有当插入对象 ID 为空,才自动填充。 */</span>
<span class="token comment">/**
* 全局唯一 ID (idWorker)
*/</span>
<span class="token function">ID_WORKER</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token comment">/**
* 全局唯一 ID (UUID)
*/</span>
<span class="token function">UUID</span><span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token comment">/**
* 字符串全局唯一 ID (idWorker 的字符串表示)
*/</span>
<span class="token function">ID_WORKER_STR</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
}
不同的主键策略测试 {#不同的主键策略测试}
IdType.AUTO
: 主键自增长
- 数据表添加自增长策略
-- 已有数据表添加自增策略
ALTER TABLE `user` CHANGE id LONG NOT NULL AUTO_INCREMENT PRIMARY KEY;
- 实体类添加
主键自增长策略
@Getter
@Setter
@ToString
public class User {
// 常见的主键生成策略(UUID/MySQL 自增长 / 雪花算法 /redis/zookeeper...)
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}
- 测试 / 查看日志
/**
* 添加数据
*/
@Test
public void testInsert() {
User user = new User();
user.setName("墨白");
user.setAge(21);
user.setEmail("mobaijun8@163.com");
// mybatis-plus 会自动帮助我们生成主键 ID
int insert = userDao.insert(user);
// 被影响的行数
System.out.println("insert =" + insert);
// ID 会自动回填
System.out.println("user =" + user);
}
- 查看数据表是否自增
更新操作 {#更新操作}
- 测试类
/**
* 根据 ID 修改操作
*/
@Test
public void testUpdate() {
User user = new User();
user.setId(1269882840871374849L);
user.setName("小柠檬");
user.setEmail("mobaijun8@163.com");
// 根据用户 ID 修改
int i = userDao.updateById(user);
System.out.println("i =" + i);
}
注意:
updateById()
名字虽然是 ById, 但源码里面的参数是一个对象!!!注意:
Mybatis-Plus 会通过条件帮我们自动拼接动态 SQL
, 比mybatis 手动编写动态 SQL 标签灵活
- 结果
自动填充处理 {#自动填充处理}
比如一些测试
log
, 创建时间和修改时间, 这些操作一般都是通过自动化完成的, 一般我们不希望手动操作!!!扩展: 阿里巴巴开发手册规定: 所有的数据库表都要包含两个字段:
gmt_create
和gmt_modified
, 几乎所有的表都要配置上, 并且需要自动化
自动填充有两种方式
方式一: 数据库级别 {#方式一 - 数据库级别}
-- 已有数据表添加新字段
alter table user add gmt_create date; -- 开始时间
alter table user add gmt_modified date; -- 结束时间
- 实体类添加属性
@Getter
@Setter
@ToString
public class User {
// 常见的主键生成策略(UUID/MySQL 自增长 / 雪花算法 /redis/zookeeper...)
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
// 开始时间
private Date gmtCreate;
// 结束时间
private Date gmrModified;
}
- 测试
/**
* 添加数据
*/
@Test
public void testInsert() {
User user = new User();
user.setName("框架师");
user.setAge(21);
user.setEmail("mobaijun8@163.com");
// mybatis-plus 会自动帮助我们生成主键 ID
int insert = userDao.insert(user);
// 被影响的行数
System.out.println("insert =" + insert);
// ID 会自动回填
System.out.println("user =" + user);
}
方式二: 代码级别 {#方式二 - 代码级别}
- 字段添加填充内容
// 开始时间
// 插入填充字段
@TableField(fill = FieldFill.INSERT)
private Date gmtCreate;
// 结束时间
// 更新填充字段
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date gmtModified;
- 源码内容
public enum FieldFill {
/**
* 默认不处理
*/
DEFAULT,
/**
* 插入填充字段
*/
INSERT,
/**
* 更新填充字段
*/
UPDATE,
/**
* 插入和更新填充字段
*/
INSERT_UPDATE
}
- 创建自定义元对象处理器接口
@Slf4j // 添加日志
@Component // 注入 Spring 容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
/**
* 插入时的填充策略
*
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) {
// 添加日志
log.info("start insert fill............");
/**
* String fieldName: 需要插入的字段
* Object fieldVal: 需要插入的类型
* MetaObject metaObject: 需要给那个数据处理
*/
this.setFieldValByName("gmtCreate", new Date(), metaObject);
this.setFieldValByName("gmtModified", new Date(), metaObject);
}
<span class="token comment">/**
* 更新时的填充策略
*
* @param metaObject
*/</span>
<span class="token annotation punctuation">@Override</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">updateFill</span><span class="token punctuation">(</span><span class="token class-name">MetaObject</span> metaObject<span class="token punctuation">)</span> <span class="token punctuation">{</span>
log<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">"end update fill............"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/**
* 更新的时候只需要更新的字段
*/</span>
<span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">setFieldValByName</span><span class="token punctuation">(</span><span class="token string">"gmtModified"</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> metaObject<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
}
自定义元对象处理器接口必须要实现
MetaObjectHandler
接口
- 测试
/**
* 添加数据
*/
@Test
public void testInsert() {
User user = new User();
user.setName("小狐狸");
user.setAge(21);
user.setEmail("mobaijun@163.com");
// mybatis-plus 会自动帮助我们生成主键 ID
int insert = userDao.insert(user);
// 被影响的行数
System.out.println("insert =" + insert);
// ID 会自动回填
System.out.println("user =" + user);
}
乐观锁处理 {#乐观锁处理}
- 乐观锁 : 故名思意十分乐观,它总是认为不会出现问题,无论干什么不去上锁!如果出现了问题, 再次更新值测试
- 悲观锁:故名思意十分悲观,它总是认为总是出现问题,无论干什么都会上锁!再去操作!
- 乐观锁实现方式:
- 取出记录时,获取当前 version
- 更新时,带上这个 version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果 version 不对,就更新失败
乐观锁:1、先查询,获得版本号 version = 1
-- A
update user set name = "kuangshen", version = version + 1
where id = 2 and version = 1
-- B 线程抢先完成,这个时候 version = 2,会导致 A 修改失败!
update user set name = "kuangshen", version = version + 1
where id = 2 and version = 1
- 在数据库中添加
version
字段
- 实体类
// 配置乐观锁插件
@Version // 乐观锁注解
private Integer version;
- 新建
config
包, 创建MyBatisPlusConfig
配置类
/**
* Software:IntelliJ IDEA 2020.1 x64
* Author: MoBai·杰
* Date: 2020/6/8 16:52
* ClassName:MyBatisPlusConfig
* 类描述: Spring 配置类
*/
// 表示扫描 mapper 包下的所有接口
@MapperScan("com.mobai.mybatis_plus.dao")
@EnableTransactionManagement // 开启自动事务
@Configuration // 表示这个类是全局配置类
public class MyBatisPlusConfig {
<span class="token comment">/**
* 注册乐观锁插件
*
* @return
*/</span>
<span class="token annotation punctuation">@Bean</span>
<span class="token keyword">public</span> <span class="token class-name">OptimisticLockerInterceptor</span> <span class="token function">optimisticLockerInterceptor</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">OptimisticLockerInterceptor</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
}
- 乐观锁成功测试
/**
* 测试乐观锁成功
*/
@Test
public void testOptimisticLocker() {
// 1. 查询用户信息
User user = userDao.selectById(1L);
// 2. 修改用户信息
user.setName("墨白科技");
user.setEmail("mobaijun8@163.com");
user.setAge(21);
// 3. 执行更新
userDao.updateById(user);
}
# 控制台打印 sql UPDATE user SET name=?, age=?, email=?, version=?, gmt_create=?, gmt_modified=? WHERE id=? AND version=?
- 乐观锁失败测试
/**
* 测试乐观锁失败!多线程下
*/
@Test
public void testOptimisticLocker2() {
/**
* 线程 1
*/
User user = userDao.selectById(1L);
user.setName("墨白科技 111");
user.setEmail("mobaijun8@163.com");
user.setAge(21);
/**
* 线程 2
* 模拟另外一个线程执行了插队操作
*/
User user2 = userDao.selectById(1L);
user2.setName("墨白科技 222");
user2.setEmail("mobaijun8@163.com");
user2.setAge(21);
userDao.updateById(user2);
// 自旋锁来多次尝试提交!
userDao.updateById(user); // 如果没有乐观锁就会覆盖插队线程的值!
}
查询操作 {#查询操作}
/**
* 测试查询
*/
@Test
public void testSelectById() {
User id = userDao.selectById(1L);
System.out.println("id =" + id);
}
/**
* 批量查询
*/
@Test
public void testSelectByBatchId() {
List<User> users = userDao.selectBatchIds(Arrays.asList(1, 2, 3));
System.out.println("users =" + users);
}
/**
`
`
* `按条件查询
*/``
`@Test`
`public` `void` `testSelectByBatchIdS()` `{`
`HashMap<String, Object>` map `=` `new` `HashMap<>();`
`// 自定义条件`
map`.put("name",` `"Jack");`
map`.put("age",` `20);`
`List<User>` users `=` userDao`.selectByMap(`map`);`
users`.forEach(System.`out`::println);`
`}
分页查询 {#分页查询}
应用场景: 分页在浏览场景或一些 web 网站非常常见
-
常用的分页方式
- 使用 MySQL 原始
limit
进行分页 Mybatis
插件PageHelper
MybatisPlus
其实也内置了分页插件
- 使用 MySQL 原始
-
配置拦截器组件即可
/**
* 分页拦截器
*
* @return
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
// 开启 count 的 join 优化, 只针对部分 left join
return new PaginationInterceptor();
}
- 测试: 直接使用 Page 对象即可!
/**
* 测试分页查询
*/
@Test
public void testPage() {
/**
* 参数一: 当前页
* 参数一: 页大小
* 使用了分页插件以后, 所有的分页操作也变得非常简单
*/
Page<User> page = new Page<>(2, 4);
// 调用 selectPage 进行分页
userDao.selectPage(page, null);
page.getRecords().forEach(System.out::println);
// 获取记录总数
System.out.println("page =" + page.getTotal());
}
删除操作 {#删除操作}
/**
* 测试删除
*/
@Test
public void testDeleteById() {
userDao.deleteById(1269882840871374854L);
}
/**
* 批量删除
*/
@Test
public void testDeleteList() {
userDao.deleteBatchIds(Arrays.asList(1269882840871374853L,
1269882840871374852L,
1269882840871374851L,
1269882840871374850L,
1269882840871374849L));
}
/**
* 通过集合删除
*/
@Test
public void testDeleteMap() {
HashMap<String, Object> map = new HashMap<>();
map.put("name", "墨白科技 222");
userDao.deleteByMap(map);
}
逻辑删除 {#逻辑删除}
物理删除 :从数据库中直接移除
逻辑删除 :在数据库中没有被移除,而是通过一个变量来让他失效! deleted = 0 => deleted = 1
管理员可以查看被删除的记录!防止数据的丢失,类似于回收站!
- 在表中新增一个字段
deleted
逻辑删除
- 实体类
// 逻辑删除
@TableLogic // 逻辑删除注解
private Integer deleted;
- 在
MyBatisPlusConfig
添加逻辑删除组件
/**
* 逻辑删除组件
*/
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
yml
配置逻辑删除
# 配置逻辑删除
global-config:
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
- 测试
/**
* 逻辑删除
* 相当于回收站
*/
@Test
public void testDeleted() {
userDao.deleteById(6L);
}
- 数据库字段值变为
0
记录依旧在数据库,但是值确已经变化了!
性能分析插件 {#性能分析插件}
- 我们在平时的开发中,会遇到一些慢 sql。测试! druid,,,,,
- 作用:性能分析拦截器,用于输出每条 SQL 语句及其执行时间
- MP 也提供性能分析插件,如果超过这个时间就停止运行!
MyBatisPlusConfig
导入插件
/**
* SQL 执行效率插件
*/
@Bean
@Profile({"dev", "test"}) // 设置 dev test 环境开启, 保证开发效率
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor =
new PerformanceInterceptor();
// 设置执行时间和写入日志
Properties properties = new Properties();
properties.setProperty("format", "true");
// 设置 SQL 执行时间和写入日志
performanceInterceptor.setProperties(properties);
return performanceInterceptor;
}
- 第二种写法(单独配置)
// 设置 SQL 最大执行时间, 如果超过了则不执行
performanceInterceptor.setMaxTime(10);
// 设置 SQL 是否格式化
performanceInterceptor.setFormat(true);
application.yml
配置插件
# 数据库配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/index?characterEncoding=utf-8
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
# 设置性能分析插件
profiles:
active: dev
- 测试
/**
* 测试性能分析插件
*/
@Test
public void contextLoads2() {
List<User> users = userDao.selectList(null);
users.forEach(System.out::println);
}
使用性能分析插件,可以帮助我们提高效率!
条件查询 wrapper {#条件查询 wrapper}
十分重要:Wrapper
- 我们写一些复杂的 sql 就可以使用它来替代!
- 测试类
@SpringBootTest
public class WrapperTest {
<span class="token annotation punctuation">@Autowired</span>
<span class="token keyword">private</span> <span class="token class-name">UserDao</span> userDao<span class="token punctuation">;</span>
<span class="token comment">/**
* 条件查询
*/</span>
<span class="token annotation punctuation">@Test</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">wrapper1</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">// 查询 name 不为空和 email 不为空并且年龄大于等于 12</span>
<span class="token class-name">QueryWrapper</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">User</span><span class="token punctuation">></span></span> wrapper <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">QueryWrapper</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 链式编程</span>
wrapper<span class="token punctuation">.</span><span class="token function">isNotNull</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>
<span class="token function">isNotNull</span><span class="token punctuation">(</span><span class="token string">"email"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>
<span class="token function">ge</span><span class="token punctuation">(</span><span class="token string">"age"</span><span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
userDao<span class="token punctuation">.</span><span class="token function">selectList</span><span class="token punctuation">(</span>wrapper<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token operator">::</span><span class="token function">println</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">/**
* 根据名称查询
*/</span>
<span class="token annotation punctuation">@Test</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">wrapper2</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">QueryWrapper</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">User</span><span class="token punctuation">></span></span> wrapper <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">QueryWrapper</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
wrapper<span class="token punctuation">.</span><span class="token function">eq</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">,</span> <span class="token string">"MoBai"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// selectOne(wrapper); 查询一个数据</span>
<span class="token class-name">User</span> user <span class="token operator">=</span> userDao<span class="token punctuation">.</span><span class="token function">selectOne</span><span class="token punctuation">(</span>wrapper<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"user ="</span> <span class="token operator">+</span> user<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">/**
* 查询区间
*/</span>
<span class="token annotation punctuation">@Test</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">wrapper3</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">QueryWrapper</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">User</span><span class="token punctuation">></span></span> wrapper <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">QueryWrapper</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 查询年龄在 15-25 之间的数据</span>
wrapper<span class="token punctuation">.</span><span class="token function">between</span><span class="token punctuation">(</span><span class="token string">"age"</span><span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">,</span> <span class="token number">25</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// selectOne(wrapper); 查询一个数据</span>
<span class="token class-name">Integer</span> count <span class="token operator">=</span> userDao<span class="token punctuation">.</span><span class="token function">selectCount</span><span class="token punctuation">(</span>wrapper<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>count<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">/**
* 模糊查询
*/</span>
<span class="token annotation punctuation">@Test</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">test4</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">QueryWrapper</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">User</span><span class="token punctuation">></span></span> wrapper <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">QueryWrapper</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
wrapper<span class="token punctuation">.</span>
<span class="token comment">// 查询 name 不包含 e 的字段</span>
<span class="token function">notLike</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">,</span> <span class="token string">"e"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>
<span class="token comment">// 左和右 t%</span>
<span class="token function">likeRight</span><span class="token punctuation">(</span><span class="token string">"email"</span><span class="token punctuation">,</span> <span class="token string">"t"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">List</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Map</span><span class="token punctuation"><</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">Object</span><span class="token punctuation">></span><span class="token punctuation">></span></span> maps <span class="token operator">=</span> userDao<span class="token punctuation">.</span><span class="token function">selectMaps</span><span class="token punctuation">(</span>wrapper<span class="token punctuation">)</span><span class="token punctuation">;</span>
maps<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token operator">::</span><span class="token function">println</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">/**
* 模糊查询
*/</span>
<span class="token annotation punctuation">@Test</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">test5</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">QueryWrapper</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">User</span><span class="token punctuation">></span></span> wrapper <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">QueryWrapper</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// id 在子查询中查出来</span>
wrapper<span class="token punctuation">.</span><span class="token function">inSql</span><span class="token punctuation">(</span><span class="token string">"id"</span><span class="token punctuation">,</span> <span class="token string">"select id from user where id < 3"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">List</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Object</span><span class="token punctuation">></span></span> list <span class="token operator">=</span> userDao<span class="token punctuation">.</span><span class="token function">selectObjs</span><span class="token punctuation">(</span>wrapper<span class="token punctuation">)</span><span class="token punctuation">;</span>
list<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token operator">::</span><span class="token function">println</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">/**
* 模糊查询
*/</span>
<span class="token annotation punctuation">@Test</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">test6</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">QueryWrapper</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">User</span><span class="token punctuation">></span></span> wrapper <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">QueryWrapper</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 通过 ID 进行排序</span>
wrapper<span class="token punctuation">.</span><span class="token function">orderByAsc</span><span class="token punctuation">(</span><span class="token string">"id"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">List</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">User</span><span class="token punctuation">></span></span> list <span class="token operator">=</span> userDao<span class="token punctuation">.</span><span class="token function">selectList</span><span class="token punctuation">(</span>wrapper<span class="token punctuation">)</span><span class="token punctuation">;</span>
list<span class="token punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token operator">::</span><span class="token function">println</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
}
其余的方法多练习, 多记笔记
代码自动生成器 {#代码自动生成器}
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
- 引入插件包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<description>Demo project for Spring Boot</description>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>properties</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>java.version</span><span class="token punctuation">></span></span>1.8<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>java.version</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>properties</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependencies</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>org.springframework.boot<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>spring-boot-starter-web<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span>
<span class="token comment"><!-- 简化实体类 --></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>org.projectlombok<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>lombok<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>optional</span><span class="token punctuation">></span></span>true<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>optional</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span>
<span class="token comment"><!--MySQL 驱动 --></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>mysql<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>mysql-connector-java<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>5.1.43<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span>
<span class="token comment"><!--mybatis-plus 启动器 --></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>com.baomidou<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>mybatis-plus-boot-starter<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>3.0.5<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>org.apache.velocity<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>velocity-engine-core<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>2.0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span>
<span class="token comment"><!--spring-boot-test--></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>org.springframework.boot<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>spring-boot-starter-test<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>scope</span><span class="token punctuation">></span></span>test<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>scope</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>exclusions</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>exclusion</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>org.junit.vintage<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>junit-vintage-engine<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>exclusion</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>exclusions</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependencies</span><span class="token punctuation">></span></span>
</project>
- 测试类
package com.mobai.mybatis_plus;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
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.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.util.ArrayList;
/**
`
`
*
Software:IntelliJ IDEA 2020.1 x64
*
Author: MoBai·杰
*
Date: 2020/6/9 11:38
*
ClassName:MoBaiCode
* `
`类描述: MybatisPlus 代码生成器
/
public class MoBaiCode {
public static void main(String[] args) {
// MybatisPlus 代码生成器必须要 new 一个 AutoGenerator 对象
AutoGenerator mpg = new AutoGenerator();
/*
* 配置策略
* 1. 全局配置
*/
GlobalConfig gc = new GlobalConfig();
// 获取当前资源路径
String projectPath = System.getProperty("user.dir");
// 生成的代码输出路径
gc.setOutputDir(projectPath + "/src/main/java");
// 生成作者信息
gc.setAuthor("MoBai·杰");
// 是否打开输出目录
gc.setOpen(false);
// 是否覆盖文件
gc.setFileOverride(false);
// 取消生成以后 I 前缀
gc.setServiceName("%sService");
// 指定生成的主键的 ID 类型
gc.setIdType(IdType.ID_WORKER);
// 只使用 java.util.date 代替
gc.setDateType(DateType.ONLY_DATE);
// 开启 swagger2 模式
gc.setSwagger2(true);
mpg.setGlobalConfig(gc);
`
`
<span class="token comment">/**
* 2. 配置数据源相关
* DataSourceConfig: 数据库配置
*/</span>
<span class="token class-name">DataSourceConfig</span> ds <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">DataSourceConfig</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
ds<span class="token punctuation">.</span><span class="token function">setDriverName</span><span class="token punctuation">(</span><span class="token string">"com.mysql.jdbc.Driver"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
ds<span class="token punctuation">.</span><span class="token function">setUrl</span><span class="token punctuation">(</span><span class="token string">"jdbc:mysql://localhost:3306/index?characterEncoding=utf-8"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
ds<span class="token punctuation">.</span><span class="token function">setUsername</span><span class="token punctuation">(</span><span class="token string">"root"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
ds<span class="token punctuation">.</span><span class="token function">setPassword</span><span class="token punctuation">(</span><span class="token string">"root"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 数据库类型</span>
ds<span class="token punctuation">.</span><span class="token function">setDbType</span><span class="token punctuation">(</span><span class="token class-name">DbType</span><span class="token punctuation">.</span><span class="token constant">MYSQL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
mpg<span class="token punctuation">.</span><span class="token function">setDataSource</span><span class="token punctuation">(</span>ds<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/**
* 3. 设置包的配置
*/</span>
<span class="token class-name">PackageConfig</span> pc <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PackageConfig</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 项目名称</span>
pc<span class="token punctuation">.</span><span class="token function">setModuleName</span><span class="token punctuation">(</span><span class="token string">"cxdz"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 项目路径</span>
pc<span class="token punctuation">.</span><span class="token function">setParent</span><span class="token punctuation">(</span><span class="token string">"com.mobai"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 实体类包名</span>
pc<span class="token punctuation">.</span><span class="token function">setEntity</span><span class="token punctuation">(</span><span class="token string">"pojo"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// Dao 包名</span>
pc<span class="token punctuation">.</span><span class="token function">setMapper</span><span class="token punctuation">(</span><span class="token string">"dao"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// service 包名</span>
pc<span class="token punctuation">.</span><span class="token function">setService</span><span class="token punctuation">(</span><span class="token string">"service"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// service 实现类包名</span>
pc<span class="token punctuation">.</span><span class="token function">setServiceImpl</span><span class="token punctuation">(</span><span class="token string">"service.impl"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// controller 包名</span>
pc<span class="token punctuation">.</span><span class="token function">setController</span><span class="token punctuation">(</span><span class="token string">"controller"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
mpg<span class="token punctuation">.</span><span class="token function">setPackageInfo</span><span class="token punctuation">(</span>pc<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/**
* 4. 策略配置
*/</span>
<span class="token class-name">StrategyConfig</span> sc <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">StrategyConfig</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 需要映射的表</span>
sc<span class="token punctuation">.</span><span class="token function">setInclude</span><span class="token punctuation">(</span><span class="token string">"user"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 从数据库表到文件的命名策略 / 下划线转驼峰命名</span>
sc<span class="token punctuation">.</span><span class="token function">setNaming</span><span class="token punctuation">(</span><span class="token class-name">NamingStrategy</span><span class="token punctuation">.</span>underline_to_camel<span class="token punctuation">)</span><span class="token punctuation">;</span>
sc<span class="token punctuation">.</span><span class="token function">setColumnNaming</span><span class="token punctuation">(</span><span class="token class-name">NamingStrategy</span><span class="token punctuation">.</span>underline_to_camel<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 是否为 lombok 模型 / 默认 false</span>
sc<span class="token punctuation">.</span><span class="token function">setEntityLombokModel</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 设置逻辑删除字段</span>
sc<span class="token punctuation">.</span><span class="token function">setLogicDeleteFieldName</span><span class="token punctuation">(</span><span class="token string">"deleted"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/**
* 5. 设置自动填充
*/</span>
<span class="token class-name">TableFill</span> gmtCreate <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableFill</span><span class="token punctuation">(</span><span class="token string">"gmt_create"</span><span class="token punctuation">,</span> <span class="token class-name">FieldFill</span><span class="token punctuation">.</span><span class="token constant">INSERT</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">TableFill</span> gmtModified <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">TableFill</span><span class="token punctuation">(</span><span class="token string">"gmt_modified"</span><span class="token punctuation">,</span> <span class="token class-name">FieldFill</span><span class="token punctuation">.</span><span class="token constant">INSERT_UPDATE</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">ArrayList</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">TableFill</span><span class="token punctuation">></span></span> list <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ArrayList</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
list<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>gmtCreate<span class="token punctuation">)</span><span class="token punctuation">;</span>
list<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>gmtModified<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 表填充字段</span>
sc<span class="token punctuation">.</span><span class="token function">setTableFillList</span><span class="token punctuation">(</span>list<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 设置乐观锁字段</span>
sc<span class="token punctuation">.</span><span class="token function">setVersionFieldName</span><span class="token punctuation">(</span><span class="token string">"version"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 生成 @RestController 控制器</span>
sc<span class="token punctuation">.</span><span class="token function">setRestControllerStyle</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 驼峰转连字符</span>
sc<span class="token punctuation">.</span><span class="token function">setControllerMappingHyphenStyle</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
mpg<span class="token punctuation">.</span><span class="token function">setStrategy</span><span class="token punctuation">(</span>sc<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 执行</span>
mpg<span class="token punctuation">.</span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
`
`
}`
`}
总结 {#总结}
MybatisPlus 是对 mybatis 的增强, 只做增强, 不做修改