MyBatisPlus的知识点
文章目录
简介
-
MyBatisPlus,简称MP,是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率。
-
MyBatisPlus特性:
- 无侵入:在MyBatis的基础上只做增强不做改变,不会对现有的工程产生影响;
- 强大的CRUD操作:内置通用Mapper,少量配置即可实现单表CRUD操作;
- 支持Lambda:编写查询条件无需担心字段写错;
- 支持主键自动生成;
- 内置分页插件
- …
-
MyBatisPlus对比MyBatis有哪些优势?
- MyBatisPlus封装了一些常用的操作,可以使用简单的代码实现一些复杂的操作,减少了代码量;
- MyBatisPlus提供了一些常用的CRUD操作(添加数据(Create)、读取查询数据(Read)、修改数据(Update)、删除数据(Delete)),可以减少一些常规的操作代码;
- MyBatisPlus提供了一些高级功能,比如:分页、逻辑删除、多表查询、乐观锁等等,这些功能可以大大提高开发效率;
- MyBatisPlus提供了丰富的插件支持,可以方便地进行二级缓存、性能优化、分页插件等等的集成;
- MyBatisPlus可以通过配置文件或注解的方式进行配置,开发者可以根据需要选择合适的配置方式
开发方式
- 基于MyBatis使用MyBatisPlus
- 基于Spring使用MyBatisPlus
- 基于SpringBoot使用MyBatisPlus
SpringBoot整合MyBatisPlus
整合步骤:
1.创建SpringBoot工程(使用快速构建)
2.引入mybatisplus整合SpringBoot的依赖:
<!-- mybatisplus整合SpringBoot的起步依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
3.引入常用的依赖:
<!-- druid数据源依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.20</version>
</dependency>
<!-- 使用@Data注解依赖,简化POJO实体类的开发-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
4.配置application.yml文件:
#JDBC连接池配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=utf-8
username: root
password: "010802" #若为纯数字则要加上双引号,非纯数字则不需要
5.创建User实体类:
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author :LTY
* @date :Created in 2023/6/26 16:38
* @description:实体类
* @modified By:
* @version: $
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private String password;
private Integer age;
private String tel;
}
6.创建数据层UserDao接口:
package com.itcast.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itcast.pojo.User;
import org.apache.ibatis.annotations.Mapper;
/**
* @author :ATO
* @date :Created in 2023/6/26 16:59
* @description:数据层接口
* @modified By:
* @version: $
*/
@Mapper //表示这个接口在编译时会生成相应的实现类
@Repository //此注解为Spring注解,主动识别当前类要交给Spring容器管理的,然后生成dao层的bean
public interface UserDao extends BaseMapper<User> {
}
7.编写测试类:
package com.itcast.mybatisplus_01;
import com.itcast.dao.UserDao;
import com.itcast.pojo.User;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
@MapperScan(value="com.itcast.dao") //扫描包下的所有类或接口,作用为:指定要变成实现类的接口所在的包,包下面的所有接口在编译之后都会生成相应的实现类
public class Mybatisplus01ApplicationTests {
@Autowired
private UserDao userDao;
// 查询所有数据
@Test
void testGetAll() {
List<User> users = userDao.selectList(null);
System.out.println(users);
}
}
标准数据层开发
- 标准数据层CRUD功能
功能 | 自定义接口 | MP接口 |
---|---|---|
新增 | boolean save(T t) | int insert(T t) |
删除 | boolean delete(int id) | int deleteById(Serializable id) |
修改 | boolean update(T t) | int updateById(T t) |
依据id字段查询 | T getById(int id) | T selectById(Serializable id) |
查询全部数据 | List getAll() | List selectList() |
分页查询 | PageInfo getAll(int page, int size) | IPage selectPage(IPage page) |
按条件查询 | List getAll(Condition condition) | IPage selectPage(Wrapper queryWrapper) |
1.新增数据
//新增一条数据
@Test
void testSave() {
User user = new User();
user.setName("彭昱畅");
user.setAge(24);
user.setPassword("12344");
user.setTel("34354545");
userDao.insert(user);
}
2.删除数据
//删除数据
@Test
void testDelete() {
// id的类型为long型,故在后面要加上L或l
userDao.deleteById(1673332182423891970l);
}
3.修改数据
//修改数据
@Test
void testUpdate() {
//依据id更新,只更新user中不为null的字段
User user = new User();
user.setId(4L);
user.setAge(30);
userDao.updateById(user);
}
4.依据id查询数据
//依据id进行查询
@Test
void testSelectById() {
User user = userDao.selectById(4L);
System.out.println(user);
}
标准分页功能
1.创建一个配置类,对分页插件进行配置: 分页查询拦截器
package com.itcast.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
/**
* @author :LTY
* @date :Created in 2023/6/26 22:37
* @description:分页插件的配置类
* @modified By:
* @version: $
*/设置分页拦截器作为Spring管理的bean
@Configuration
public class MpConfig {
@Bean
public MybatisPlusInterceptor mpInterceptor() {
// 创建MyBatisPlus的拦截器
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//添加一个具体的内置的分页拦截器
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mybatisPlusInterceptor;
}
}
2.编写分页查询语句
//分页查询
@Test
void testGetByPage() {
// current表示第几页,size表示展示的条数
Page page = new Page(1,2);
userDao.selectPage(page,null);
System.out.println("当前页码值为: " + page.getCurrent());
System.out.println("每页显示数: " + page.getSize());
System.out.println("一共有: " + page.getPages() +"页");
System.out.println("一共: " + page.getTotal() + "条数据");
System.out.println("数据: " + page.getRecords());
}
3.开启MyBatisPlus日志
-
若想要在控制台上打印SQL语句,则在application.yml配置文件中添加:
#开启mp的日志(输出到控制台) mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
控制台显示结果为:
条件查询的三种格式
- MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合
去除控制台生成的大量的日志方法
- 在resources下新建一个logback.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
</configuration>
- 在配置文件application.yml里的开启mp日志(mybatis-plus:)后面添加:
global-config:
banner: false #表示斑不显示
- 在配置文件application.yml里的spring:下添加:
main:
banner-mode: off
条件查询的方式
- 方式一:常规格式
// 按条件查询
@Test
void testGetAll() {
QueryWrapper qw = new QueryWrapper();
// lt: < gt: > ge:大于等于 le:小于等于
// 查询年龄小于24岁的数据
qw.lt("age",24);
List<User> users = userDao.selectList(qw);
System.out.println(users);
}
- 方式二:lambda格式按条件查询。相比方式一,此方式避免了属性名书写错误。
@Test
void testGetAll() {
//方式二:lambda格式按条件查询
QueryWrapper<User> qw = new QueryWrapper<User>();
// 查询年龄小于24岁的数据
qw.lambda().lt(User::getAge,24);
List<User> users = userDao.selectList(qw);
System.out.println(users);
}
- 方式三:
@Test
void testGetAll() {
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
// 查询年龄小于24岁的数据
lqw.lt(User::getAge,24);
List<User> users = userDao.selectList(lqw);
System.out.println(users);
}
-
多条件查询
- 查询区间的数据
@Test void testGetAll() { LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>(); // 查询年龄大于20小于30岁的数据 // lqw.lt(User::getAge,30); // lqw.gt(User::getAge,20); //或简写为: 链式格式 lqw.lt(User::getAge,30).gt(User::getAge,20); List<User> users = userDao.selectList(lqw); System.out.println(users); }
- 查询两边的数据
@Test void testGetAll() { LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>(); //查询小于20岁或者大于30岁的数据 lqw.lt(User::getAge,20).or().gt(User::getAge,30); List<User> users = userDao.selectList(lqw); System.out.println(users); }
null值的处理
- 新建一个UserQuery实体类,继承于原来的User实体类,用于封装User模型查询条件:
package com.itcast.pojo.query;
import com.itcast.pojo.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author :LTY
* @date :Created in 2023/6/27 0:04
* @description:封装用于User模型的查询条件的实体类
* @modified By:
* @version: $
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserQuery extends User {
// 原来属性数据有上下限时,需要在这里创建新的变量
private Integer age2;
}
- 编写测试:
//null值的处理
@Test
void testDealNull() {
//模拟页面传递过来的查询数据
UserQuery userQuery = new UserQuery();
// userQuery.setAge(10);
userQuery.setAge2(30);
//null判定
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
// 方式一:if语句控制条件追加(不推荐)
// if(null != userQuery.getAge2()) {
// lqw.lt(User::getAge,userQuery.getAge2());
// }
// if(null != userQuery.getAge()) {
// lqw.gt(User::getAge,userQuery.getAge());
// }
// 方式二:条件参数控制
//先判定第一个条件是否为true,若为true,则连接当前条件
lqw.lt(null != userQuery.getAge2(),User::getAge,userQuery.getAge2());
lqw.gt(null != userQuery.getAge(),User::getAge,userQuery.getAge());
List<User> users = userDao.selectList(lqw);
System.out.println(users);
}
查询投影
查询部分属性
@Test
void test3() {
//lambda格式
// LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
查询某些字段
// lqw.select(User::getId,User::getName,User::getAge);
//非lambda格式
QueryWrapper qw = new QueryWrapper();
qw.select("id","name","age");
List<User> users = userDao.selectList(qw);
System.out.println(users);
}
查询统计数、分组
@Test
void test3() {
QueryWrapper<User> lqw = new QueryWrapper<User>();
//统计
lqw.select("count(*) as count,tel");
// 按电话号码分组
lqw.groupBy("tel");
List<Map<String,Object>> users = userDao.selectMaps(lqw);
System.out.println(users);
}
查询条件设置
查询条件
- 范围匹配:>、=、between
- 模糊匹配:like
- 空判定:null
- 包含性匹配:in
- 分组:group
- 排序:order
条件构造器官网:https://baomidou.com/pages/10c804/#abstractwrapper
用户登录(eq匹配)
- eq : 等同于 =
// 等匹配查询
@Test
void testEquals() {
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//等同于= 验证登录操作
lqw.eq(User::getName,"Jock").eq(User::getPassword,"itcat");
User user = userDao.selectOne(lqw);
System.out.println(user);
}
范围查询
- lt : 小于
- le : 小于等于
- gt : 大于
- ge : 大于等于
- eq : 等于(即:equals)
- between : 两数之间
@Test
void testArea() {
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//范围查询 lt le gt ge eq between
//区间查询
lqw.between(User::getAge,20,30);
List<User> user = userDao.selectList(lqw);
System.out.println(user);
}
模糊匹配
- like() : 前后加百分号,如 %J%
- likeLeft() : 前面加百分号,如:%J
- likeRight : 后面加百分号,如:J%
@Test
void testArea2() {
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//模糊匹配 like likeLeft : %J; likeRight : J%
lqw.like(User::getName,"J");
List<User> user = userDao.selectList(lqw);
System.out.println(user);
}
映射匹配兼容性
字段映射
(1)情况一:表字段与编码属性设计不同步,即表字段与实体类中的字段不相同
解决方法:
-
名称:@TableField
-
类型:属性注解
-
添加位置:模型类属性定义的上方
-
作用:设置当前属性对应的数据库表中的字段关系
-
例子:
public class User { //pwd为表中的字段 @TableField(value="pwd") private String password; }
-
相关属性:value(默认) : 设置数据库表中的字段名称
(2)情况二:实体类中添加了数据库中没有定义的属性
解决方法:
public class User {
@TableField(exist = false)
private Integer online;
}
- 相关属性:exist : 设置属性在数据库表字段中是否存在,默认为true。此属性无法与value合并使用
(3)情况三:采用默认查询开放了更多的字段查看权限
解决方法:
public class User {
//pwd为表中的字段
@TableField(value="pwd",select = false)
private String password;
}
- select : 设置属性是否参与查询,此属性与select()映射配置不冲突
表名映射
(4)情况四:表名与实体类的名称不同步
解决方法:
- 名称:@TableName
- 类型:类注解
- 添加位置:模型类的上方
- 作用:设置当前类对应与数据库关系
- 例子: value : 设置数据库表名称
@TableName("tb_user") //tb_user为表名
public class User {
.....
}
- 可使用全局配置
不在实体类的上方添加@TableName(“tb_user”),直接在application.yml配置文件中配置:
table-prefix:tb_
id生成策略
id生成策略控制
- 名称:@TableId
- 类型:属性注解
- 位置:模型类中用于表示主键的属性定义上方
- 作用:设置当前类中主键属性的生成策略
- 例子:
public class User {
//AUTO 数据库ID自增 该类型请确保数据库设置了ID自增 否则无效
//@TableId(type = IdType.AUTO)
//INPUT 用户输入ID 该类型可以通过自己注册自动填充插件进行填充
//@TableId(type = IdType.INPUT)
//ASSIGN_ID 雪花算法
@TableId(type = IdType.ASSIGN_ID)
private Long id;
}
- 相关属性:
- value : 设置数据库主键名称
- type : 设置主键属性的生成策略,值参照IdType枚举值
- @TableId的IdType的各选项
- Auto(0) : 使用数据库id自增策略控制id生成
- NONE(1) : 不设置id生成策略
- INPUT(2) : 用户手工输入id
- ASSIGN_ID(3) : 雪花算法生成id(可兼容数值型与字符串型)
- AAIGN_UUID(4) : 以UUID生成算法作为id生成策略
雪花算法
占位符:0 时间戳(41) 机器码(5+5) 序列号(12)
0 | 00100110111011010101100001101010011000110 | 10000 | 1001 | 000000000010
- 全局配置雪花算法
在application.yml配置文件的mybatis-plus:下添加:
db-config:
id-type: assign_id
然后去除实体类中属性上方的@TableId(type = IdType.ASSIGN_ID)即可。
多数据操作(删除与查询)
删除多条数据
@Test
void testDelete() {
// List<Long> list = new ArrayList<>();
// list.add(1673588033600581634L);
// list.add(1673594396900741121L);
// list.add(667L);
//或:
List<Long> list = Arrays.asList(new Long[]{1673596821212651522l,1673596925982240770l});
userDao.deleteBatchIds(list);
}
查询多条数据
@Test
void testSelect() {
//查询多条数据
// List<Long> list = new ArrayList<>();
// list.add(1L);
// list.add(2L);
//list.add(3L);
//或:
List<Long> list = Arrays.asList(new Long[]{1L, 2L, 3L});
userDao.selectBatchIds(list);
}
逻辑删除
- 删除操作业务问题:业务数据从数据库中丢弃
- 逻辑删除:为数据设置是否可用状态字段,删除时设置字段为不可用状态,数据保留在数据库中
操作步骤
- 先在表中添加用于显示状态的字段
- 在实体类中添加该字段,并使用@TableLogic设定当前字段为逻辑删除标记字段:
或者在application.yml配置文件中进行@TableLogic的全局配置:
logic-delete-field: status #\此字段为数据库中设置逻辑删除的字段
logic-not-delete-value: 0 #设置可用状态
logic-delete-value: 1 #设置不可用状态
运行结果:
乐观锁(Update)
操作步骤
1.操作数据库表
首先在数据库表中添加一个字段,用于标记正在操作该数据库表的用户。
2.修改实体类
- 在实体类中添加该字段
3.新建一个乐观锁拦截器配置类
- 配置拦截器实现锁机制对应的动态SQL语句拼装
package com.itcast.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author :LTY
* @date :Created in 2023/6/26 22:37
* @description:乐观锁的配置类
* @modified By:
* @version: $
*/
@Configuration
public class MpConfig {
@Bean
public MybatisPlusInterceptor mpInterceptor() {
// 定义MyBatisPlus的拦截器
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//添加乐观锁拦截器
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
}
4.编写测试类
@Test
void testUpdate() {
// User user = new User();
// user.setId(2l);
// user.setName("Amy");
// user.setVersion(1);
// userDao.updateById(user);
//不收集version数据
//1.先通过要修改的数据id将当前数据查询出来
User user = userDao.selectById(2L);
//2.将要修改的属性逐一设置
user.setName("李湘");
userDao.updateById(user);
}
运行结果:
模拟秒杀操作
@Test
void testUpdate() {
//1.先通过要修改的数据id将当前数据查询出来
//模拟A用户进行修改
User user = userDao.selectById(2L); //version=3
//模拟B用户进行修改
User user2 = userDao.selectById(2L); //version=3
user2.setName("李玉 aaa");
userDao.updateById(user2); //version=4
//2.将要修改的属性逐一设置
user.setName("李湘 bbb");
userDao.updateById(user); version=3条件不成立,故此操作不执行
}
运行结果:
代码生成器
使用这个可以超快速生成entity、service、controller层
- 模板:由MyBatisPlus提供
- 数据库相关配置:读取数据库获取信息
- 开发者自定义配置:手工配置
步骤
1.新建一个SpringBoot项目
2.pom.xml文件的配置:
<?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.7.13</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.itcast</groupId>
<artifactId>mybatisplus_04_generator</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mybatisplus_04_generator</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<!-- 依赖坐标-->
<dependencies>
<!-- spring webmvc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.6</version>
</dependency>
<!-- mybatisplus依赖坐标-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<!-- druid依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<!-- mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<!-- test依赖-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>3.0.2</version>
<scope>test</scope>
</dependency>
<!-- lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<!-- 若导包爆红,则可能是版本问题,降低版本即可 -->
<!-- 代码生成器 若版本为3.5.2则velocity依赖可以不导入 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.2</version>
</dependency>
<!--velocity模板引擎 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.CodeGenerator代码生成器类
-
此类作为自动生成器的入口
package com.itcast;
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.DateType;
/**
* @author :LTY
* @date :Created in 2023/6/27 23:26
* @description:
* @modified By:
* @version: $
*/
public class CodeGenerator {
public static void main(String[] args) {
//1.获取代码生成器的对象
AutoGenerator autoGenerator = new AutoGenerator();
//设置数据库相关配置
DataSourceConfig dataSource = new DataSourceConfig();
dataSource.setDriverName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///mybatisplus_db?serverTimezone=UTC&characterEncoding=utf-8&useSSL=false&useUnicode=true");
dataSource.setUsername("root");
dataSource.setPassword("010802");
autoGenerator.setDataSource(dataSource);
//设置全局配置
GlobalConfig globalConfig = new GlobalConfig();
//设置代码生成后存放的路径
//user.dir表示获取当前的目录
String projectPath = System.getProperty("user.dir");
globalConfig.setOutputDir("D:\\idea-file\\mybatisplus_04_generator" + "/src/main/java");
//设置生成完毕后是否打开生成代码所在的目录
globalConfig.setOpen(false);
//设置作者
globalConfig.setAuthor("LTY");
//设置是否覆盖原始生成的文件
globalConfig.setFileOverride(true);
//设置数据层接口名,%s为占位符,指代模块名称 dao命名方式,自动生成的dao类前面加前缀
globalConfig.setMapperName("%sDao");
//service 命名方式,自动生成的Service类前面会自动添加前缀
globalConfig.setServiceName("%sService");
//数据库中的时间类型对应的java类,此设置表示Date类,默认为java8的时间类
globalConfig.setDateType(DateType.ONLY_DATE);
//设置Id生成策略 ASSIGN_ID为雪花算法
globalConfig.setIdType(IdType.ASSIGN_ID);
globalConfig.setEnableCache(false); //XML 二级缓存
autoGenerator.setGlobalConfig(globalConfig);
//设置包名相关配置
PackageConfig packageConfig = new PackageConfig();
//设置生成的包名,与代码所在位置不冲突,二者叠加组成完整路径
packageConfig.setParent("com.mybatisplus");
//设置实体类包名
packageConfig.setEntity("domain");
//设置数据访问层包名
packageConfig.setMapper("dao");
//设置业务层包名
packageConfig.setService("service");
autoGenerator.setPackageInfo(packageConfig);
//策略设置
StrategyConfig strategyConfig = new StrategyConfig();
//设置当前参与生成的表名,参数为可变参数 要生成多个表的话在后面添加即可
strategyConfig.setInclude("tb_user");
//设置数据库表的前缀名称,模块名 = 数据库表名 - 前缀名 如:User = tb_user - tb_
strategyConfig.setTablePrefix("tb_");
//设置是否启用Rest风格
strategyConfig.setRestControllerStyle(true);
//设置乐观锁字段名
strategyConfig.setVersionFieldName("version");
//设置逻辑删除字段名 status为你数据库表中用于设置逻辑删除的字段
strategyConfig.setLogicDeleteFieldName("status");
//设置是否启用lombok
strategyConfig.setEntityLombokModel(true);
autoGenerator.setStrategy(strategyConfig);
//2.执行生成操作
autoGenerator.execute();
}
}
点击运行。
运行结果为如下情况,则证明代码自动生成成功了。
测试UserDao
- 配置application.yml文件:
#JDBC连接池
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=utf-8
username: root
password: "010802" #若密码为纯数字,则需要加上双引号
#开启mp的日志(输出到控制台)
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- 编写测试类
package com.itcast.mybatisplus_04_generator;
import com.itcast.CodeGenerator;
import com.mybatisplus.dao.UserDao;
import com.mybatisplus.domain.User;
import com.mybatisplus.service.UserService;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
@MapperScan("com.mybatisplus.dao") //扫描包下的所有类或接口,作用为:指定要变成实现类的接口所在的包,包下面的所有接口在编译之后都会生成相应的实现类
class Mybatisplus04GeneratorApplicationTests {
@Autowired(required = false)
private UserDao userDao;
@Test
void contextLoads() {
List<User> users = userDao.selectList(null);
System.out.println(users);
}
}
- 修改UserDao接口
@Mapper
@Repository
- 修改实体类
运行结果为: