MyBatis-Plus简介
MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,简化开发,提高效率。它提供了以下主要特性:
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,少量配置即可实现大部分 CRUD 操作
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件
- 支持主键自动生成:支持多达 4 种主键策略
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作
项目搭建
创建 SpringBoot 项目
在 pom.xml 中添加必要依赖:
<dependencies>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- MyBatis-Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
配置数据源
在 application.yml 中配置数据库连接:
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
username: root
password: 123456
核心功能演示
实体类定义
使用 Lombok 简化代码:
@Data
public class User {
private Integer id;
private String name;
private Integer age;
private String email;
public User() {}
public User(Integer id, String name, Integer age, String email) {
this.id = id;
this.name = name;
this.age = age;
this.email = email;
}
}
Mapper 接口
只需继承 BaseMapper 即可获得丰富的 CRUD 方法:
@Repository
public interface UserMapper extends BaseMapper<User> {
// 无需编写任何方法,即可获得完整CRUD功能
}
基础 CRUD 操作
@SpringBootTest
public class MyBatisplusTest extends AbstractTestNGSpringContextTests {
@Autowired
private UserMapper userMapper;
// 查询所有用户
@Test
public void testSelectList() {
userMapper.selectList(null).forEach(System.out::println);
}
// 插入用户
@Test
public void testInsert() {
User user = new User(null, "张三", 23, "zhangsan@qcby.com");
int result = userMapper.insert(user);
System.out.println("受影响行数:" + result);
System.out.println("id自动获取:" + user.getId());
}
}
MyBatis-Plus 特性详解
主键生成策略
MyBatis-Plus 支持多种主键生成策略:
- AUTO:数据库 ID 自增
- NONE:无状态,该类型为未设置主键类型
- INPUT:用户输入 ID
- ASSIGN_ID:分配 ID
- ASSIGN_UUID:分配 UUID
条件构造器
MyBatis-Plus 提供了强大的条件构造器 QueryWrapper 和LambdaQueryWrapper:
// 使用QueryWrapper
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "张").lt("age", 30);
List<User> users = userMapper.selectList(queryWrapper);
// 使用LambdaQueryWrapper(推荐)
LambdaQueryWrapper<User> lambdaQuery = Wrappers.lambdaQuery();
lambdaQuery.like(User::getName, "张").lt(User::getAge, 30);
List<User> users = userMapper.selectList(lambdaQuery);
分页功能
添加分页插件配置
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
使用分页查询
@Test
public void testPage() {
Page<User> page = new Page<>(1, 5); // 当前页,每页大小
IPage<User> userPage = userMapper.selectPage(page, null);
System.out.println("总页数:" + userPage.getPages());
System.out.println("总记录数:" + userPage.getTotal());
userPage.getRecords().forEach(System.out::println);
}