MyBatisPlus
一、MyBatisPlus简介
MyBatisPlus ( 简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率。
- 创建入门案例
- 创建新模块,选择Spring Initailizer,并配置模块相关基础信息
- 勾选MySQL Driver
- 手动添加mp起步依赖(由于mp并未被收录到idea的系统内置配置,无法直接选择加入)
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
- 设置jdbc参数(application.yml)
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/springboot_demo
username: root
password: root
- 定义数据接口,继承BaseMapper
@Mapper
public interface ProductsDao extends BaseMapper<Products> {
}
- 测试类注入dao接口,测试功能
@SpringBootTest
class MybatisplusApplicationTests {
@Autowired
private ProductsDao productsDao;
@Test
void testGetAll() {
List<Products> products = productsDao.selectList(null);
System.out.println(products);
}
}
二、标准数据层开发
- 标准数据层CRUD功能
- lombok
一个Java类库,提供了一组注解,简化POJO实体类开发;常用注解@Data
<dependency>
<groupId>org.project1ombok</groupId>
<artifactId>1ombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
- 分页查询
- 设置分页拦截器作为Spring管理的bean
package com.shine.config;
@Configuration
public class MpConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
//1.定义Mp拦截器
MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
//2.添加具体拦截器
mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mpInterceptor;
}
}
- 执行分页查询
@Test
void testPage() {
IPage page = new Page(1 ,2);
productsDao.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());
}
- 开启日志(查看sql语句,主要作调试时用)
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
三、DQL编程控制
- 条件查询
MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合
- 常规格式
//方式1:按条件查询
QueryWrapper qw = new QueryWrapper();
qw.lt("price", 1000);
List<Products> products = productsDao.selectList(qw);
System.out.println(products);
- lambda格式(推荐)
//方式2:lambda格式按条件查询
QueryWrapper<Products> qw = new QueryWrapper<Products>();
qw.lambda().gt(Products::getPrice, 1000);
List<Products> products = productsDao.selectList(qw);
System.out.println(products);
//方式3:lambda格式按条件查询
LambdaQueryWrapper<Products> lqw = new LambdaQueryWrapper<Products>();
lqw.eq(Products::getCategory_id, "c001");
List<Products> products = productsDao.selectList(lqw);
System.out.println(products);
- 查询投影
- 查询结果包含模型类中部分属性
LambdaQueryWrapper<Products> lqw = new LambdaQueryWrapper<Products>();
lqw.select(Products::getPname, Products::getPrice, Products::getCategory_id);
List<Products> products = productsDao.selectList(lqw);
System.out.println(products);
- 查询结果包含模型类中未定义的属性
QueryWrapper qw = new QueryWrapper();
qw.select("count(*) as count");
qw.groupBy("category_id");
List<Map<String, Object>> products = productsDao.selectMaps(qw);
System.out.println(products);
- 字段映射和表名映射
-
问题1:表字段和编码属性设计不同步
-
问题2:编码中添加了数据库中未定义的属性
-
问题3:采用默认查询开放了更多的字段查看权限
-
问题4:表名与编码开发设计不同步
四、DML编程控制
- id生成策略控制
-
不同的表 应用不同的id生成策略
- 日志:自增(1,2,3,4, ...)
- 购物订单:特殊规则 (FQ23948AK3843)
- 外卖单:关联地区日期等信息(10 04 20200314 34 91)
- 关系表:可省略id
- ……
-
生成策略
- AUTO(0):使用数据库id自增策略控制id生成
- NONE(1):不设置id生成策略
- INPUT(2):用户手工输入id
- ASSIGN_ ID(3):雪花算法生成id (可兼容数值型与字符串型)
- ASSIGN_ UUID(4):以UUID生成算法作为id生成策略
@TableId(type = IdType.ASSIGN_ID)
-
全局配置
mybatis-plus:
global-config:
db-config:
id-type: auto
table-prefix: tbl_
- 逻辑删除
删除操作业务问题:业务数据从数据库中丢弃
逻辑删除:为数据设置是否可用状态字段,删除时设置状态字段为不可用状态,数据保留在数据库中
- 数据库表中添加逻辑删除标记字段
- 实体类中添加对应字段,并设定当前字段为逻辑删除标记字段
@TableLogic
- 乐观锁
业务并发现象带来的问题:秒杀(比如大量用户同时抢购某种商品)
- 数据库表中添加锁标记字段
- 实体类中添加对应字段,并设定当前字段为逻辑删除标记字段
@version
- 配置乐观锁拦截器实现锁机制对应的动态SQL语句拼装
@Configuration
public class MpConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mpInterceptor;
}
}
- 使用乐观锁机制在修改前必须先获取到对应数据的version方可正常进行(先查询一次)
五、快速开发
利用代码生成器
- 添加依赖
<!--代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
<!--velocity模板引擎-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
- 核心代码
//1.获取代码生成器的对象
AutoGenerator autoGenerator = new AutoGenerator();
......
autoGenerator.execute();
- 设置数据库相关配置
DataSourceConfig dataSource = new DataSourceConfig();
dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/springboot_demo");
dataSource.setUsername("root");
dataSource.setPassword("root");
autoGenerator.setDataSource(dataSource);
- 设置全局配置
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java");
globalConfig.setOpen(false);
globalConfig.setAuthor("Shine");
globalConfig.setFileOverride(true);
globalConfig.setMapperName("%sDao");
autoGenerator.setGlobalConfig(globalConfig);
- 设置包名相关配置
PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent("com.shine");
packageConfig.setEntity("domain");
packageConfig.setMapper("dao");
autoGenerator.setPackageInfo(packageConfig);
- 策略设置
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setRestControllerStyle(true);
//strategyConfig.setInclude("products", "book");//设置当前生成的表名,为可变参数
//strategyConfig.setTablePrefix("tbl_"); //设置数据库表的前缀名称,模块名=数据库名-前缀名
//strategyConfig.setVersionFieldName("version");//设置乐观锁字段名
//strategyConfig.setLogicDeleteFieldName("deleted");//设置逻辑删除字段名
strategyConfig.setEntityLombokModel(true);//设置是否启用lombok
autoGenerator.setStrategy(strategyConfig);
标签:MyBatisPlus,System,笔记,学习,products,println,new,id,out
From: https://www.cnblogs.com/Shine-Gan/p/17334412.html