MyBatis-Plus是一个MyBatis的增强工具,它在MyBatis的基础上扩展了功能,同
时保留了MyBatis的基本特性,旨在简化开发并提高效率。以下是一个详细的MyBatis-
Plus使用教程,涵盖了从项目搭建到基础操作的过程。
一、MyBatis-Plus简介
MyBatis-Plus是MyBatis的增强版,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。它内置了通用Mapper、通用Service,仅通过少量配置即可实现单表大部分CRUD操作,并且提供了强大的条件构造器,支持Lambda形式调用,方便编写各类查询条件。
二、项目搭建
- 创建Spring Boot项目
可以通过Spring Initializr(https://start.spring.io/)快速生成Spring Boot项目骨架。
选择需要的项目元数据(如Group、Artifact、Name等),并添加依赖(如Spring Web、MyBatis-Plus Starter、MySQL Driver等)。
2**. 引入依赖**
在项目的pom.xml文件中引入MyBatis-Plus相关的依赖。以下是一个示例:
xml
<dependencies>
<!-- MyBatis-Plus Spring Boot Starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>最新版本号</version> <!-- 请替换为实际可用的最新版本号 -->
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.xx</version> <!-- 请替换为实际可用的版本号 -->
</dependency>
<!-- Lombok(可选,用于简化实体类代码) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 其他需要的依赖 -->
- 配置数据源 在application.yml或application.properties文件中配置MySQL数据源信息。以下是一个application.yml的示例:
yaml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: 密码
- 编写实体类
根据数据库表结构编写对应的实体类,并使用Lombok简化代码(如果已引入Lombok依赖)。
java
import lombok.Data;
@Data
public class User {
private Long id;
private String name;
private Integer age;
// 其他字段...
}
- 编写Mapper接口
Mapper接口继承自MyBatis-Plus提供的BaseMapper接口,MyBatis-Plus会自动实现该接口中的方法,无需编写实现类。
java
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface UserMapper extends BaseMapper<User> {
// 如果需要自定义方法,可以在这里添加
}
- 扫描Mapper接口
在Spring Boot启动类上添加@MapperScan注解,指定Mapper接口所在的包路径。
java
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.mapper") // 替换为你的Mapper接口所在的包路径
public class MybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusApplication.class, args);
}
}
三、基础操作
MyBatis-Plus提供了丰富的CRUD操作方法,通过Mapper接口中的方法即可实现。以下是一些常用的操作示例:
- 插入数据
java
@Autowired
private UserMapper userMapper;
public void insertUser(User user) {
userMapper.insert(user);
}
2. 更新数据
java
public void updateUser(User user) {
userMapper.updateById(user); // 根据ID更新数据
}
- 删除数据
java
public void deleteUserById(Long id) {
userMapper.deleteById(id);
}
四、进阶功能
MyBatis-Plus的高级操作涵盖了多个方面,包括但不限于条件查询、自定义SQL
、性能优化、逻辑删除、分页查询、自动填充等。以下将详细描述这些高级操作:
1. 条件查询
MyBatis-Plus提供了强大的条件构造器,如QueryWrapper和LambdaQueryWrapper,用于构建复杂的查询条件。
QueryWrapper:使用字符串模板方式构建查询条件,可能会因为字段名写错而导致运行时错误。
示例:
java
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John").lt("age", 30);
List users = userMapper.selectList(queryWrapper);
LambdaQueryWrapper:使用Lambda表达式构建查询条件,类型安全,可以避免硬编码字段名。
示例:
java
LambdaQueryWrapper<User> lambdaQuery = Wrappers.lambdaQuery();
lambdaQuery.eq(User::getName, "John").lt(User::getAge, 30);
List<User> users = userMapper.selectList(lambdaQuery);
2. 自定义SQL
当MyBatis-Plus的自动CRUD无法满足需求时,可以在Mapper接口中自定义SQL。
在Mapper接口中添加自定义方法,并使用@Select、@Insert、@Update、@Delete等注解指定SQL语句。
示例:
java
@Mapper
public interface UserMapper extends BaseMapper<User> {
@Select("SELECT * FROM user WHERE age > #{age}")
List<User> selectUsersOlderThanAge(@Param("age") int age);
}
3. 性能优化
MyBatis-Plus提供了性能分析插件,可以帮助监控和优化SQL执行性能。
在配置类中配置性能分析插件。
示例:
java
@Bean
@Profile({"dev", "test"}) // 只在开发和测试环境开启
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setMaxTime(1000); // 设置SQL执行的最大时间
performanceInterceptor.setFormat(true); // 是否格式化SQL
return performanceInterceptor;
}
4. 逻辑删除
逻辑删除是指在数据库中用一个字段标识数据是否被删除,而不是真的将数据行删除。
在实体类中使用@TableLogic注解标记逻辑删除属性。
示例:
java
@TableLogic
private Integer deleted;
在配置文件中配置逻辑删除字段的策略。
示例(application.properties):
properties
mybatis-plus.global-config.db-config.logic-delete-field=deleted
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
5. 分页查询
MyBatis-Plus内置了分页插件,可以很方便地实现分页查询。
使用Page对象或IPage接口进行分页查询。
示例:
java
int pageNum = 1;
int pageSize = 10;
Page<User> page = new Page<>(pageNum, pageSize);
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", 18);
page = userMapper.selectPage(page, queryWrapper);
List<User> users = page.getRecords();
long total = page.getTotal();
- 自动填充
MyBatis-Plus提供了自动填充功能,可以自动为实体类的字段赋值。
使用@TableField注解的fill属性指定填充策略(INSERT、UPDATE、INSERT_UPDATE)。
示例:
java
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;
实现MetaObjectHandler接口来自定义填充逻辑。
示例:
java
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject)