MyBatis-Plus通用CRUD操作的实现
作者:Flying_Fish_Xuan
MyBatis-Plus 是在 MyBatis 的基础上开发的增强工具,旨在简化 MyBatis 的使用,提升开发效率。它为开发者提供了许多开箱即用的功能,尤其是通用 CRUD 操作,极大地减少了开发中常见的 CRUD 代码编写工作。MyBatis-Plus 通过提供一系列基于注解和模板的通用方法,简化了数据库操作。
一、MyBatis-Plus 的优势
- 开箱即用的 CRUD 功能:MyBatis-Plus 提供了通用的 CRUD 方法,开发者无需手动编写常见的增删改查 SQL。
- 丰富的分页功能:内置分页插件,支持数据库级别的分页查询,性能优越。
- 多种插件支持:提供各种插件支持,如分页、性能分析、乐观锁等,开发者可以根据需要进行扩展。
- 自动代码生成器:可以根据数据库表结构自动生成实体类、Mapper 接口、Service 和 Controller 层代码,大大提高开发效率。
二、集成 MyBatis-Plus
1. 引入依赖
在 pom.xml
文件中引入 MyBatis-Plus 的依赖:
<dependencies> <!-- MyBatis-Plus Starter for Spring Boot --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency> <!-- MySQL 数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies>
2. 配置数据库连接
在 application.yml
文件中配置数据库连接信息:
spring: datasource: url: jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC username: root password: yourpassword driver-class-name: com.mysql.cj.jdbc.Driver
3. 启动类配置
在 Spring Boot 的启动类中,需要添加 @MapperScan
注解,指定 Mapper 接口所在的包。
import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.example.demo.mapper") // 扫描 Mapper 接口 public class MyBatisPlusDemoApplication { public static void main(String[] args) { SpringApplication.run(MyBatisPlusDemoApplication.class, args); } }
三、实体类定义
首先,我们需要定义实体类,它对应数据库中的表结构。MyBatis-Plus 提供了自动生成主键的注解 @TableId
,并且支持多种主键生成策略。
package com.example.demo.model; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("users") // 对应数据库中的表名 public class User { @TableId(type = IdType.AUTO) // 主键自增 private Long id; private String name; private String email; }
@TableName
:指定实体类对应的数据库表名。@TableId
:指定主键,type = IdType.AUTO
表示主键自增。
四、Mapper 接口
MyBatis-Plus 提供了通用的 BaseMapper<T>
接口,用户只需继承 BaseMapper
,就可以自动拥有常见的 CRUD 操作,无需再手动编写 SQL。
package com.example.demo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.demo.model.User; import org.apache.ibatis.annotations.Mapper; @Mapper public interface UserMapper extends BaseMapper<User> { // 这里不需要定义方法,BaseMapper 已经提供了常用的 CRUD 操作 }
BaseMapper<T>
中内置了大量的 CRUD 方法,开发者无需再重复编写增删改查的 SQL。
五、Service 层
为了进一步分离业务逻辑,我们可以在 Service 层使用 Mapper 进行数据库操作。通过继承 MyBatis-Plus 提供的 IService<T>
接口,我们可以轻松地获得常见的 CRUD 功能。
Service 接口:
package com.example.demo.service; import com.baomidou.mybatisplus.extension.service.IService; import com.example.demo.model.User; public interface UserService extends IService<User> { }
Service 实现类:
package com.example.demo.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.demo.mapper.UserMapper; import com.example.demo.model.User; import com.example.demo.service.UserService; import org.springframework.stereotype.Service; @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { // 这里无需编写额外代码,通用 CRUD 功能已经由 ServiceImpl 提供 }
通过继承 ServiceImpl
,我们可以快速获得 CRUD
的操作,无需手动实现。
六、Controller 层
在控制器中,可以调用 Service 层的方法来处理 HTTP 请求。例如,我们可以实现用户的增删改查操作。
package com.example.demo.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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; // 查询所有用户 @GetMapping public List<User> getAllUsers() { return userService.list(); } // 根据 ID 查询用户 @GetMapping("/{id}") public User getUserById(@PathVariable Long id) { return userService.getById(id); } // 添加新用户 @PostMapping public String addUser(@RequestBody User user) { userService.save(user); return "用户添加成功"; } // 更新用户 @PutMapping("/{id}") public String updateUser(@PathVariable Long id, @RequestBody User user) { user.setId(id); userService.updateById(user); return "用户更新成功"; } // 删除用户 @DeleteMapping("/{id}") public String deleteUser(@PathVariable Long id) { userService.removeById(id); return "用户删除成功"; } }
七、通用 CRUD 方法
MyBatis-Plus 内置了一系列通用 CRUD 方法,这些方法被 BaseMapper
和 IService
提供。以下是常用的 CRUD 方法:
1. BaseMapper 通用方法
int insert(T entity)
:插入一条记录。int deleteById(Serializable id)
:根据 ID 删除记录。int updateById(T entity)
:根据 ID 更新记录。T selectById(Serializable id)
:根据 ID 查询记录。List<T> selectList(Wrapper<T> queryWrapper)
:查询所有记录。
2. IService 通用方法
boolean save(T entity)
:保存或新增记录。boolean saveOrUpdate(T entity)
:保存或更新记录。boolean removeById(Serializable id)
:根据 ID 删除记录。T getById(Serializable id)
:根据 ID 查询记录。List<T> list()
:查询所有记录。boolean updateById(T entity)
:根据 ID 更新记录。
八、条件构造器
MyBatis-Plus 提供了强大的 条件构造器,可以通过 QueryWrapper
和 UpdateWrapper
灵活地构建查询条件,避免手动拼接 SQL 语句。
示例:根据条件查询
@GetMapping("/search") public List<User> searchUsers(@RequestParam String name, @RequestParam String email) { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.like("name", name).eq("email", email); return userService.list(queryWrapper); }
示例:根据条件更新
@PutMapping("/update") public String updateUserByCondition(@RequestBody User user) { UpdateWrapper<User> updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("email", user.getEmail()); userService.update(user, updateWrapper); return "用户更新成功"; }
通过条件构造器,MyBatis-Plus 提供了链式操作来实现复杂的条件查询和更新,大大简化了 SQL 拼接的工作。
九、分页查询
MyBatis-Plus 通过分页插件支持数据库级别的分页查询,开发者无需再手动编写分页逻辑。
添加分页插件
首先,在 Spring Boot 配置类中添加分页插件:
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyBatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } }
使用分页查询
@GetMapping("/page") public IPage<User> getUserPage(@RequestParam int pageNo, @RequestParam int pageSize) { Page<User> page = new Page<>(pageNo, pageSize); return userService.page(page); }
MyBatis-Plus 自动处理分页参数,并返回分页结果。
十、总结
MyBatis-Plus 极大地简化了 MyBatis 的使用,通过提供通用 CRUD 方法、分页插件、条件构造器等功能,大大减少了样板代码的编写。在实际开发中,MyBatis-Plus 提供了高效的开发体验,适合在多种场景下快速实现数据库操作。
到此这篇关于MyBatis-Plus通用CRUD操作的实现的文章就介绍到这了,更多相关MyBatis-Plus通用CRUD操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!