mybatis-plus的使用和讲解
特性:
-
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
-
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
-
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD
操作,更有强大的条件构造器,满足各类使用需求 -
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
-
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
-
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD
操作 -
支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere ) 内置代码生成器:采用代码或者
-
代码生成器可快速生成 Mapper 、 Model 、 Service 、 Controller
层代码,支持模板引擎,更有超多自定义配置等您来使用 -
内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
-
分页插件支持多种数据库:支持
MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库 -
内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
-
内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
核心功能:
- 代码生成器
- CRUD接口
- 条件构造器
- 分页插件
- Sequence主键
- 自定义ID生成器
快速使用Mybtis-plus
- 首先使用Spring Initializr 快速创建一个springboot项目
- 在pom文件中导入mybatis-plus的依赖坐标
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- lombok插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
- 准备一个数据表
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');
- 在application.properties中配置数据库连接
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- 创建实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("user")
public class User {
@TableId(value = "id")
private Long id;
@TableField("name")
private String name;
@TableField("age")
private Integer age;
@TableField("email")
private String email;
}
@TableName是表名注解
@TableId是主键注解
@TableField是表中的字段注解
6.创建mapper接口
@Repository
public interface UserMapper extends BaseMapper<User> {
}
只需要继承BaseMapper接口,泛型T代表操作的对象类型
- 在启动类上添加@MapperScan(“mapper包路径”)扫描Mapper包下面的所有接口
- 测试类中测试
@SpringBootTest
@RunWith(SpringRunner.class)
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testSelectList(){
List<User> res = userMapper.selectList(null);
for(User e :res){
System.out.println(e);
}
}
}
测试结果:
主键生成策略
插入数据查看生成的主键
测试:
@Test
public void testInsert(){
//不设置id的值 mp使用默认的主键生成策略自动生成
User user = new User();
user.setName("lll");
user.setAge(20);
user.setEmail("fff@163.com");
userMapper.insert(user);
//查看生成的主键id user自动回填
System.out.println(user);
}
测试结果:
mybatis-plus默认的主键生成策略是ID_WORKER 全局唯一id
该策略使用了 雪花算法
mybatis-plus提供了五种主键生成策略
public enum IdType {
AUTO(0), // 自增
NONE(1), // 没有设置主键
INPUT(2), // 插入数据时必须手动设置id的值
ID_WORKER(3), // 全局唯一id
UUID(4), // 全局唯一id uuid
ID_WORKER_STR(5); //ID_WORKER 字符串表示
}
可以通过在@TableId注解中指定要想使用主键生成策略
!注意
当使用@TableId(value = “id”,type = IdType.AUTO)策略时 数据库中字段一定要设置为自增!
自动填充
mybatis-plus还提供了自动填充功能,当对数据库表进行操作时会同时执行你想要的自动操作
例如:想要清楚知道表中数据的creatTime和updateTime 这两个字段都需要自动填充
实现步骤
- 首先在数据库中添加两个字段creat_time和update_time同时将实体类也更新加上这两个属性
- 配置自动填充策略
- 编写策略处理器
@Component //将处理器加到ioc容器中
public class MyMetaObjectHandler implements MetaObjectHandler {
//执行插入操作时的 处理策略
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("create_time",new Date(),metaObject);
this.setFieldValByName("update_time",new Date(),metaObject);
}
//执行更新操作时的 处理策略
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("update_time",new Date(),metaObject);
}
}
- 测试插入测试更新 查看create_time和update_time字段
插入:
@Test
public void testInsertAu(){
User user = new User();
user.setName("aaa");
user.setAge(21);
user.setEmail("aaa@163.com");
userMapper.insert(user);
System.out.println(user);
}
结果:
create_time和update_time字段都自动填充了
更新:
@Test
public void testUpdateAu(){
User user = new User();
user.setId(1354740420564897794L);
user.setName("AAAAA");
userMapper.updateById(user);
System.out.println(user.getUpdate_time());
}
结果:
乐观锁
向数据库表中加入了一个version字段
在执行查询的修改操作时 先得到version字段的值然后再使用version执行更新操作version的值也进行了更新
具体实现如下:
- 现在数据库表中添加一个version字段 初始值为1
- 将实体类中添加一个Integer类型的version属性,使用@Version注解开启乐观锁
- 新建一个配置类,注册乐观锁插件
@EnableTransactionManagement
@MapperScan("org.xupt.mp.mapper")
@Configuration
public class MybatisPlusConfig {
//注册mybatis-plus中的乐观锁插件
@Bean
public OptimisticLockerInterceptor myOptimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
- 测试
@Test
public void testOptimisticLock(){
//首先查询信息 获得version值
User user = userMapper.selectById(1354740420564897794L);
user.setName("qqq");
System.out.println("更新操作前version的值:"+user.getVersion());
//使用version的值进行更新操作 同时修改version的值
userMapper.update(user,null);
System.out.println("更新操作后version的值:"+user.getVersion());
}
测试结果: