Mybatis plus简介
MyBatis-Plus (简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
特性
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
快速使用
先创建一个spring项目,创建时记得勾选sql的驱动
之后我们导入mybatis plus的坐标
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
之后我们来到配置文件中,写入我们的datasource
我这里用的yml文件进行配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm
username: root
password: 123456
之后创建一个我们的一个pojo的实体类,记得给出相应的getter和setter方法
public class Book {
private Long id;
private String type;
private String name;
private String description;
}
之后我们写一下我们的dao层文件
@Mapper
public interface BookDao extends BaseMapper<Book> {
}
这里一下我们不需要去写什么CURD,mp已经通过basemapper帮我们写好了
到这里原先要我们花费大量时间去写的数据层就写完了,是不是很方便,感觉啥也没写就结束了
加入日志
只需要在日志中配置以下这段话就可以了
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
实现CUDR
根据ID查询
Book book = bookDao.selectById(2);
查询全部
List<Book> books = bookDao.selectList(null);
增加
Book book=new Book();
book.setName("123");
book.setType("123");
book.setDescription("123");
bookDao.insert(book);
删除
bookDao.deleteById(2);
修改
Book book=new Book();
book.setName("123");
book.setType("123");
book.setDescription("123");
bookDao.updateById(book);
对service层的封装
先让BookService继承IService
public interface BookService extends IService<Book> {
}
之后对于BookServiceImpl我们在实现service接口的基础上,我们还要继承一下ServiceImpl,这样在Impl中就不需要将所有的方法都重写出来
@Service
public class BookServiceImpl extends ServiceImpl<BookDao, Book> implements BookService {
}
这样之后我们简单的测试一下service中的方法
@Test
public void selectTest(){
System.out.println(bookService.getById(4));
}
要注意的是,为了避免命名的重复,mp在service对于的方法的取名有着较大的差别
mp的几个标签
@TableName
@TableName("tbl_book")
public class Book {
private Long id;
private String type;
private String name;
private String description;
}
描述:表名注解,标识实体类对应的表
使用位置:实体类
@TableId
public class User {
@TableId
private Long id;
private String name;
private Integer age;
private String email;
}
描述:主键注解
使用位置:实体类主键字段
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
value | String | 否 | “” | 主键字段名 |
type | Enum | 否 | IdType.NONE | 指定主键类型 |
mp默认使用雪花算法去计算主键id的值,但是我们也可以将type的值设置成IdType.AUTO,来实现id自增
@TableId(value = "id",type = IdType.AUTO)
@TableField
@TableName("sys_user")
public class User {
@TableId
private Long id;
@TableField("nickname")
private String name;
private Integer age;
private String email;
}
其的value属性,用于指定属性名和字段名的匹配
@TableLogic
用于逻辑删除
条件构造器
querywapper
首先我们先创建一个querywapper对象
QueryWrapper<Book> queryWrapper=new QueryWrapper<>();
之后我们看一下quertwapper提供的方法
查询name字段的包含spring的值,即模糊查询
queryWrapper.like("name","spring")
查询值在xx于xx之间
queryWrapper.between("id",1,5);
当然还有许多的方法,就不在这里一一列举了
当然我们的querywapper还支持链式编程
queryWrapper.like("name","spring")
.between("id",1,5);
updatewapper
将name为空的修改
UpdateWrapper<Book> updateWrapper=new UpdateWrapper<>();
updateWrapper.isNull("name");
updateWrapper.set("name","114514").set("type","1919810").set("description","123");
bookDao.update(null,updateWrapper);
Lambdaquerywapper
对于你的字段类型做出了约束,可以有效的防止写错
LambdaQueryWrapper<Book> lambdaQueryWrapper=new LambdaQueryWrapper<>();
String name="spring";
String type=null;
lambdaQueryWrapper.like(StringUtils.isNotBlank(name),Book::getName,name)
.like(StringUtils.isNotBlank(type),Book::getType,type);
List<Book> books = bookDao.selectList(lambdaQueryWrapper);
books.forEach(System.out::println);
Lambdaupdatewapper
和上面的Lambdaquerywapper类似
分页插件
首先我们先添加一个分页插件
@Configuration
public class MpConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor=new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
创建一个page对象,传入当前的页码以及每页分有几条数据
IPage<Book> iPage=new Page(1,5);
bookDao.selectPage(iPage,null);
在page对象中我们可以得到数据,总记录数等数据
乐观锁
首先我们要给我们的表添加一个版本字段,用于记录版本号
之后再实体类中给版本号属性添加一个@version注解就可以了
最后给我们的拦截器添加一个乐观锁的插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());