简介
mybatis-plus是一个mybatis的增强工具,在mybatis的基础上只做增强不做改变,为简化开发,提高效率而生;mybait-plus提供了通用的mappper和service,可以在不编写sql的情况下,快速的实现对单表的crud,批量,逻辑删除,分页等操作;
官方文档
特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
搭建测试项目
依赖
<dependencies>
<!--springboot 启动-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--lombok 代码简化-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- springboot test 启动-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 测试类 -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
<!--mysql 连接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
<scope>runtime</scope>
</dependency>
<!--Mybatis-Plus依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
</dependencies>
mybatis yml配置文件
# mybatis-plus相关配置
mybatis-plus:
configuration:
# 打印mybatis-plus生成的sql
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 设置mybatis-plus的全局配置
global-config:
db-config:
## 表名前缀
table-prefix: t_
## 设置统一的主键生成策略
id-type:auto
# 扫描通用枚举
type-enums-package: com.atguigu.mybatisplus.enums
代码部分
启动类
@SpringBootApplication
@MapperScan( "com.syh.mybatisplus04.mapper")
public class MybatisPlus04Application {
public static void main(String[] args) {
SpringApplication.run(MybatisPlus04Application.class, args);
}
}
接口
//@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
}
测试类
@SpringBootTest
public class MybatisMyplusTest01 {
@Autowired
private UserMapper userMapper;
@Test
public void selectList(){
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
}
}
常用注解
@Mapper
在接口类上添加了@Mapper,在编译之后会生成相应的接口实现类。添加位置:接口类上面
@MapperScan("")
指定要变成实现类的接口所在的包,包下面的所有接口在编译之后都会生成相应的实现类。添加位置:是在Springboot启动类上面添加
@TableName("")
指定数据库的表名
@TableId
@TableId(value="uid")--uid 表示表中字段@TableId(value="uid" , type=IdType.AUTO)type属性用来定义主键策略;默认ldType.ASSIGN_ID (默认),通过雪花算法生成id;ldType.AUTO :使用数据库的自增策略,注意,该类型请确保数据库设置了id自增,否则无效- 将属性所对应的字段指定为主键
- mybatis-plus 默认将id做为主键
@TableField("")
指定属性所对应的字段名
@TableLogic
效果:在字段上加上这个注解再执行BaseMapper的删除方法时,删除方法就会变成修改
** 逻辑删除**
物理删除: 真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据 逻辑删除:假删除,将对应数据中代表是否被删除字段的状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录 使用场景: 可以进行数据恢复 ** 实现逻辑删除** step1: 数据库中创建逻辑删除状态列,设置默认值为0
例:
实体类:
@TableLogic
private Integer del;
service层:
调用BaseMapper的deleteById(id);
执行是效果:
加@TableLogic的情况下
走 Update 表名 set 加注解的列=值 where del=值
不加@TableLogic的情况下
走 delete from 表名 where del=值
@TableLogic注解参数
value = "" 默认的原值
delval = "" 删除后的值
@TableLogic(value="原值",delval="改值")
雪花算法
在研究研究,挺厉害的
Wapper
wapper介绍 :
Wrapper : 条件构造抽象类,最顶端父类 AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件 QueryWrapper : Entity 对象封装操作类,不是用lambda语法 UpdateWrapper : Update 条件封装,用于Entity对象更新操作 AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。 LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper LambdaUpdateWrapper : Lambda 更新封装Wrapper
例子:
**Lambda 实现类 **
在开发中尽量使用lambada语法,防止写错和代码修改
@Test
public void selectList(){
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(User::getId,"10007");
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
**condition 条件判断 **
使用前
@Test
public void isNotEmptyTest(){
String name = "name0";
LambdaQueryWrapper<User> userQueryWrapper = Wrappers.lambdaQuery();
if(StringUtils.isNotEmpty(name)){
userQueryWrapper.likeRight(User::getName, name );
}
List<User> users = userMapper.selectList(userQueryWrapper);
System.out.println(users);
}
使用后
@Test
public void conditionTest(){
String name = "name0";
LambdaQueryWrapper<User> userQueryWrapper = Wrappers.lambdaQuery();
// 等同于if判空
userQueryWrapper.likeRight(StringUtils.isNotEmpty(name),User::getName, name );
List<User> users = userMapper.selectList(userQueryWrapper);
System.out.println(users);
}
常用的方法
MybatisPlusInterceptor
分页插件
乐观锁悲观锁
代码生成
代码生成器
不是太好用,还是用mabatisX生成比较号
- 引入依赖
<!--mybatis-plius 逆向工程-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3</version>
</dependency>
<!--freemarker 模板引擎-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
快速生成
FastAutoGenerator.create("url", "username", "password")
.globalConfig(builder -> {
builder.author("baomidou") // 设置作者
.enableSwagger() // 开启 swagger 模式
.fileOverride() // 覆盖已生成文件
.outputDir("D://"); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent("com.baomidou.mybatisplus.samples.generator") // 设置父包名
.moduleName("system") // 设置父包模块名
.pathInfo(Collections.singletonMap(OutputFile.xml, "D://")); // 设置mapperXml生成路径
})
.strategyConfig(builder -> {
builder.addInclude("t_simple") // 设置需要生成的表名
.addTablePrefix("t_", "c_"); // 设置过滤表前缀
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
MybatisX
官方文档上说的很详细,看一下直接用就好 官方文档提供的说明