MyBatis Plus(简称MP)是MyBatis的增强工具,旨在简化开发、提高效率。它保留了MyBatis的强大功能,并在其基础上进行了扩展和优化,提供了强大的CRUD操作、配置选项、条件构造器等功能。本文将详细介绍MyBatis Plus的安装、配置、基本操作以及分页和条件查询的使用。
首先,在Maven项目的pom.xml
中添加MyBatis Plus的依赖。以下是一个典型的依赖配置示例:
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.4.1version>
dependency>
注意,这里使用的是mybatis-plus-boot-starter
,它是为Spring Boot项目准备的,集成了MyBatis Plus和Spring Boot的自动配置。
在application.yml
或application.properties
中配置数据源,例如:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC
username: root
password: root
注意,serverTimezone
需要根据实际情况调整,如使用Asia/Shanghai
以匹配本地时区。
根据数据库表结构创建对应的实体类,使用MyBatis Plus的注解来标识表名和字段名:
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
// 省略getter和setter方法
}
Mapper接口继承自MyBatis Plus的BaseMapper
,无需编写XML文件即可实现基本的CRUD操作:
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 这里不需要定义任何方法,BaseMapper已经提供了
}
Service层继承自MyBatis Plus的IService
接口,并通过继承ServiceImpl
来实现:
public interface UserService extends IService<User> {
// 可以根据需要添加自定义方法
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 实现自定义方法
}
Service层继承自IService
后,可以直接使用其提供的CRUD方法,例如:
@Autowired
private UserService userService;
public void testAddUser() {
User user = new User();
user.setName("Tom");
user.setAge(30);
user.setEmail("[email protected]");
userService.save(user); // 插入操作
}
public void testUpdateUser() {
User user = new User();
user.setId(1L);
user.setName("Jerry");
userService.updateById(user); // 更新操作
}
public void testDeleteUser() {
userService.removeById(1L); // 删除操作
}
public void testGetUser() {
User user = userService.getById(1L); // 查询操作
System.out.println(user);
}
首先,需要在Spring Boot的配置类中添加分页插件:
@Configuration
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
然后,在Service层中使用分页查询:
public Page<User> pageQuery(int pageNum, int pageSize) {
Page<User> page = new Page<>(pageNum, pageSize);
return userMapper.selectPage(page, null); // 第二个参数为QueryWrapper,可以传递查询条件
}
MyBatis Plus 提供了 QueryWrapper
和 LambdaQueryWrapper
来构建查询条件。QueryWrapper
使用数据库字段名(字符串形式),而 LambdaQueryWrapper
使用 Java 实体类的属性名(通过方法引用),从而避免了硬编码数据库字段名,提高了代码的健壮性和可读性。
以下是使用 LambdaQueryWrapper
进行条件查询的示例:
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
// ...
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// ...
public List<User> selectUsersByNameAndAge(String name, Integer age) {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(User::getName, name) // 模糊查询name字段
.eq(User::getAge, age); // 精确查询age字段
return userMapper.selectList(queryWrapper);
}
// 分页查询示例,同时加入条件
public Page<User> pageQueryUsers(int pageNum, int pageSize, String name) {
Page<User> page = new Page<>(pageNum, pageSize);
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(User::getName, name); // 根据name字段进行模糊查询
return userMapper.selectPage(page, queryWrapper);
}
}
在上面的示例中,selectUsersByNameAndAge
方法通过 LambdaQueryWrapper
构建了一个查询条件,实现了对 name
字段的模糊查询和对 age
字段的精确查询。而 pageQueryUsers
方法则结合了分页和条件查询,实现了按 name
字段模糊查询的分页结果。
请注意,这里的 User::getName
和 User::getAge
是 Java 8 的方法引用,它们分别引用了 User
类中的 getName()
和 getAge()
方法,这样做的好处是避免了硬编码数据库字段名,提高了代码的易读性和可维护性。