本文将详细介绍MybatisPlus项目实战,包括环境搭建、基础操作和高级特性等内容,帮助开发者快速掌握MybatisPlus的使用方法。通过具体示例和常见问题的解决方法,进一步加深对MybatisPlus的理解和应用。
MybatisPlus简介 MybatisPlus是什么MybatisPlus 是一个 Mybatis 的增强工具,它在 Mybatis 的基础上提供了更多简便的功能,简化了开发过程。MybatisPlus 在 Mybatis 的基础上增加了包括分页、条件构造器、自动填充、逻辑删除等在内的更多便捷功能。MybatisPlus 官方文档中提到,它能在不改变原有 Mybatis 代码的情况下,通过少量配置即可完成大部分的 Mybatis 功能,提供了强大的 CRUD 操作,简化了开发者的编码工作。
MybatisPlus与Mybatis的区别Mybatis 和 MybatisPlus 都是用于简化数据库操作的 Java 框架,但它们在使用上有一些明显的区别:
-
功能差异:
- Mybatis 提供了基础的 SQL 映射功能,开发者需要编写 XML 配置文件或者注解来完成 SQL 语句的编写。
- MybatisPlus 在 Mybatis 基础上提供了更高级的 CRUD 操作和功能,如条件构造器、分页插件、逻辑删除等,减轻了部分重复的代码编写工作。
-
性能差异:
- MybatisPlus 由于其封装的特性,可能会在某些场景下比 Mybatis 的性能稍低,但这通常是在高并发或者大量数据读写的情况下才会体现出来。
- 在日常开发中,这种性能差异是非常微小的,可以忽略不计,MybatisPlus 提供的便利性往往能够抵消这种影响。
- 使用差异:
- Mybatis 需要开发者手动编写 SQL 语句,尽管可以使用注解和 XML 配置简化部分操作,但仍然需要开发者有一定的 SQL 编写能力。
- MybatisPlus 提供了大量的便捷方法,开发者可以更加专注于业务逻辑的实现,而不需要过多关注底层的 SQL 编写。
MybatisPlus 提供了多个核心功能,如下:
- CRUD 操作:提供了一系列标准的增删改查方法,如
insert()
,updateById()
,deleteById()
和selectById()
方法。 - 条件构造器:提供了一个强大的条件构造器,支持组合查询条件,如
QueryWrapper
和UpdateWrapper
。 - 分页插件:提供了一个简单的分页插件,可以自动处理数据库的分页操作。
- 逻辑删除:提供了一个逻辑删除的插件,允许用户通过设置删除字段的方式实现数据的逻辑删除。
- 自定义 SQL 插入:支持自定义 SQL 插入,允许开发者在需要时编写自己的 SQL 语句。
- 自动填充:提供了一个自动填充插件,可以自动填充插入和更新时的一些字段值,如创建时间、更新时间等。
- 性能优化:提供了一些性能优化插件,如缓存、懒加载等。
- 代码生成器:提供了一个代码生成器,可以自动生成项目所需的实体类、Mapper 接口等代码。
- 接口增强:提供了一些接口增强功能,如 SPI 接口、条件构造器增强等。
在搭建 MybatisPlus 环境时,首先需要在项目中添加 MybatisPlus 的依赖。以 Maven 为例,找到项目的 pom.xml
文件,并添加如下依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
.<artifactId>mybatis-plus-extension</artifactId>
<version>3.4.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
这些依赖分别代表了 MybatisPlus 的核心启动依赖、MybatisPlus 的扩展插件依赖以及 MySQL 连接依赖。
配置MybatisPlus相关配置MybatisPlus 提供了丰富的配置选项,需要在项目的配置文件中进行配置。这里我们使用 Spring Boot 作为示例,配置文件通常为 application.yml
或 application.properties
。
在 application.yml
文件中,配置数据库连接和 MybatisPlus 的相关配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
mapper-locations: classpath*:mapper/*Mapper.xml
global-config:
db-config:
id-type: ASSIGN_ID
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
这些配置项分别代表了数据库连接信息、MybatisPlus 的 Mapper 文件位置、全局配置中的数据库配置信息以及 Mybatis 配置中的日志实现。
UserMapper 接口定义
定义 UserMapper
接口:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
MybatisPlus基础操作
基本的CRUD操作
MybatisPlus 提供了标准的 CRUD 操作,可以大大简化数据库操作的编写。这里以一个简单的用户表 User
为例来演示基本的 CRUD 操作。
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
// Getter 和 Setter 方法
}
使用 MybatisPlus 进行 CRUD 操作的代码示例如下:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
@Autowired
private UserMapper userMapper;
public void insertUser(User user) {
userMapper.insert(user);
}
public User getUserById(Long id) {
return userMapper.selectById(id);
}
public List<User> getAllUsers() {
return userMapper.selectList(new QueryWrapper<User>());
}
public void updateUser(User user) {
userMapper.updateById(user);
}
public void deleteUser(Long id) {
userMapper.deleteById(id);
}
}
这段代码中,通过 UserMapper
接口来操作数据库,其中 insert()
方法用于插入数据,selectById()
方法用于根据 ID 查询数据,selectList()
方法用于查询所有数据,updateById()
方法用于更新数据,deleteById()
方法用于删除数据。
除了使用 MybatisPlus 提供的标准 CRUD 方法外,还可以自定义 SQL 语句来执行更复杂的数据库操作。
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface UserMapper extends BaseMapper<User> {
@Select("SELECT * FROM user WHERE name = #{name}")
List<User> findByName(String name);
}
这段代码中,通过 @Select
注解自定义了一个 SQL 查询语句,并在 UserService
类中调用:
public List<User> findUsersByName(String name) {
return userMapper.findByName(name);
}
MybatisPlus高级特性
条件构造器的使用
MybatisPlus 提供了强大的条件构造器,可以轻松构建复杂的查询条件。下面以 QueryWrapper
为例进行说明。
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
public List<User> getUsersByCondition(String name, Integer age) {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", name)
.gt("age", age);
return userMapper.selectList(queryWrapper);
}
这段代码中,使用 QueryWrapper
构造了查询条件,条件是 name = name
且 age > age
。
MybatisPlus 提供了自动分页插件,可以方便地实现分页查询。
首先,在 application.yml
中配置分页插件:
mybatis-plus:
pagination:
enabled: true
然后,在代码中使用分页查询:
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
public void getUsersByPage(int currentPage, int pageSize) {
Page<User> page = new Page<>(currentPage, pageSize);
userMapper.selectPage(page, new QueryWrapper<User>());
List<User> records = page.getRecords();
// 处理返回的用户数据
}
分页查询完整代码实现
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
@Autowired
private UserMapper userMapper;
public void getUsersByPage(int currentPage, int pageSize) {
Page<User> page = new Page<>(currentPage, pageSize);
userMapper.selectPage(page, new QueryWrapper<User>());
List<User> records = page.getRecords();
// 处理返回的用户数据
}
}
自动填充与逻辑删除
自动填充
MybatisPlus 可以自动填充插入和更新时的一些字段值,如创建时间、更新时间等。
首先,在实体类中添加注解:
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import java.time.LocalDateTime;
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableLogic
private Boolean deleted;
}
然后,在配置文件中启用自动填充插件:
mybatis-plus:
global-config:
db-config:
id-type: ASSIGN_ID
auto-fill-strategy:
enabled: true
auto-fill-list:
- createTime
- updateTime
逻辑删除
逻辑删除插件允许用户通过设置删除字段的方式实现数据的逻辑删除。首先,在实体类中添加逻辑删除注解:
import com.baomidou.mybatisplus.annotation.TableLogic;
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
@TableLogic
private Boolean deleted;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
然后,在配置文件中启用逻辑删除插件:
mybatis-plus:
global-config:
db-config:
id-type: ASSIGN_ID
logic-delete-value: 1
logic-not-delete-value: 0
在代码中执行删除操作:
public void deleteUser(Long id) {
User user = new User();
user.setId(id);
user.setDeleted(true);
userMapper.updateById(user);
}
实战案例
使用MybatisPlus构建简单用户管理系统
以构建一个简单的用户管理系统为例,该系统需要实现用户信息的增删改查功能。
实体类定义
首先定义用户实体类 User
:
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
@TableLogic
private Boolean deleted;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
// Getter 和 Setter 方法
}
Mapper接口定义
定义 UserMapper
接口:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
服务类实现
定义 UserService
服务类:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
@Autowired
private UserMapper userMapper;
public void insertUser(User user) {
userMapper.insert(user);
}
public User getUserById(Long id) {
return userMapper.selectById(id);
}
public List<User> getAllUsers() {
return userMapper.selectList(new QueryWrapper<User>());
}
public void updateUser(User user) {
userMapper.updateById(user);
}
public void deleteUser(Long id) {
User user = new User();
user.setId(id);
user.setDeleted(true);
userMapper.updateById(user);
}
}
控制器实现
定义 UserController
控制器:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@PostMapping
public void addUser(@RequestBody User user) {
userService.insertUser(user);
}
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getUserById(id);
}
@GetMapping
public List<User> getAllUsers() {
return userService.getAllUsers();
}
@PutMapping
public void updateUser(@RequestBody User user) {
userService.updateUser(user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
}
}
配置文件
在 application.yml
文件中配置数据库连接和 MybatisPlus 相关配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
mapper-locations: classpath*:mapper/*Mapper.xml
global-config:
db-config:
id-type: ASSIGN_ID
logic-delete-value: 1
logic-not-delete-value: 0
auto-fill-strategy:
enabled: true
auto-fill-list:
- createTime
- updateTime
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
运行示例
启动项目后,可以通过浏览器或者 Postman 等工具进行测试:
- 添加用户:
POST /users
,请求体为{"name": "test", "age": 20}
- 获取用户:
GET /users/1
- 获取所有用户:
GET /users
- 更新用户:
PUT /users
,请求体为{"id": 1, "name": "newTest", "age": 21}
- 删除用户:
DELETE /users/1
问题1: 查询时返回null
如果查询时返回 null,可以检查以下几点:
- 检查数据库连接配置:确保数据库连接信息正确配置。
- 检查 Mapper 文件:确保 Mapper 文件中的 SQL 语句正确。
- 检查实体类映射:确保实体类中的字段与数据库表字段一一对应。
- 检查条件构造器:确保条件构造器中的条件正确。
问题2: 分页插件未生效
如果分页插件未生效,可以检查以下几点:
- 检查配置文件:确保
application.yml
文件中配置了分页插件。 - 检查代码实现:确保在代码中正确使用了分页插件。
问题3: 逻辑删除插件未生效
如果逻辑删除插件未生效,可以检查以下几点:
- 检查配置文件:确保
application.yml
文件中配置了逻辑删除插件。 - 检查实体类:确保实体类中使用了
@TableLogic
注解。 - 检查代码实现:确保在代码中正确使用了逻辑删除插件。
通过以上章节的介绍,可以看出 MybatisPlus 的优势主要体现在以下几个方面:
- 简化开发:MybatisPlus 提供了丰富的 CRUD 方法,减少了开发者编写 SQL 语句的工作量。
- 强大的条件构造器:MybatisPlus 提供了条件构造器,可以方便地构建复杂的查询条件。
- 强大的插件支持:包括自动填充、逻辑删除、分页插件等,大大简化了开发者的编码工作。
- 高性能:虽然在某些场景下性能略低于 Mybatis,但在开发过程中能够忽略不计。
- 良好的扩展性:MybatisPlus 可以非常方便地扩展,支持自定义 SQL 插入等高级功能。
- 深入了解 MybatisPlus 插件:如自动填充插件、逻辑删除插件、分页插件等。
- 学习 MybatisPlus 的代码生成器:了解如何自动生成代码,可以大大节省开发时间。
- 学习 MybatisPlus 的 SPI 接口:了解 MybatisPlus 的 SPI 接口,可以对 MybatisPlus 进行更深层次的定制。
- 学习 MybatisPlus 的缓存插件:了解如何使用缓存插件来提高系统性能。
- 学习 MybatisPlus 的动态 SQL:了解如何使用动态 SQL 来提高系统的灵活性。
建议学习者可以参考 MybatisPlus 的官方文档和示例代码,并在实际项目中不断实践,以掌握 MybatisPlus 的更多高级用法。