本文详细介绍了MyBatis Plus的基本概念、优势和核心功能,包括环境搭建、快速开始以及常见问题解决方法。MyBatis Plus是一个MyBatis的增强工具,提供了大量辅助方法和高级功能,简化了数据库操作。文章还通过实战案例展示了MyBatis Plus在项目中的应用。
MyBatis Plus简介 MyBatis Plus是什么MyBatis Plus是一个MyBatis的增强工具,它在MyBatis的基础上提供了简单而强大的条件构造器,简化了MyBatis的使用。它提供了大量的辅助方法,可以减少开发人员的重复代码,提高开发效率。
MyBatis Plus与MyBatis的关系MyBatis Plus是基于MyBatis开发的,它完全兼容MyBatis的功能和特性。MyBatis Plus并没有对MyBatis的核心功能进行修改,而是通过扩展和封装,提供了一系列更高级的功能和更便捷的操作。
MyBatis Plus的优势- 简化代码:MyBatis Plus提供了大量的辅助方法,可以减少开发人员的重复代码,提高开发效率。
- 公共方法:提供了一些公共方法,如
count
、delete
、insert
、update
等,简化了基本的CRUD操作。 - 条件构造器:提供了强大的条件构造器,让SQL的拼装变得简单,支持链式操作和多种数据库方言。
- 自动生成代码:提供了代码生成器,可以自动生成Mapper、Service、Controller等基本代码。
- 逻辑删除:内置了逻辑删除功能,支持乐观锁和分页插件,提供了更丰富的数据库操作。
- 数据库层:提供了数据库层的一些功能,如连接池配置、数据库方言支持等。
在开始使用MyBatis Plus之前,需要先搭建好开发环境。这里我们以Spring Boot为例,介绍如何搭建开发环境。
- 安装Java开发环境:确保已经安装好Java开发环境,建议使用Java 8及以上版本。
- 安装IDE:选择合适的IDE,如IntelliJ IDEA、Eclipse等。
- 安装Maven或Gradle:选择合适的构建工具,这里使用Maven来管理项目依赖。
在Spring Boot项目中,可以通过Maven或Gradle来引入MyBatis Plus的依赖。以下是Maven的依赖配置:
<dependencies>
<!-- Spring Boot Starter Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MyBatis Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
<!-- Spring Boot Web Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
数据库连接配置
在application.properties
文件中配置数据库连接信息:
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis-plus.mapper-locations=classpath*:mapper/*.xml
mybatis-plus.mapper-locations=classpath*:mapper/*.xml
mybatis-plus.configuration.cache-enabled=true
mybatis-plus.configuration.use-generated-keys=true
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
快速开始
创建实体类
创建实体类User
,包含基本的属性以及对应的注解:
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String name;
@TableLogic
private Integer deleted;
}
创建Mapper接口
创建Mapper接口UserMapper
,继承BaseMapper<User>
接口:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
Page<User> page(Page<User> page);
}
基本CRUD操作
MyBatis Plus提供了大量的辅助方法,可以简化基本的CRUD操作。这里以增删改查为例。
插入操作
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
public boolean insertUser(User user) {
return save(user);
}
}
查询操作
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
public User getUserById(Long id) {
return getById(id);
}
}
更新操作
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
public boolean updateUser(User user) {
return updateById(user);
}
}
删除操作
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
public boolean deleteUserById(Long id) {
return removeById(id);
}
}
核心功能详解
自动填充
自动填充功能可以自动填充创建或更新时的字段值。这里以create_time
和update_time
两个字段为例。
在实体类中添加TableField
注解:
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.TenantFieldHandler;
import lombok.Data;
@Data
@TableName("user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String name;
@TableField(fill = FieldFill.INSERT)
private String createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateTime;
@TableLogic
private Integer deleted;
}
自定义填充策略:
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("insert fill...");
this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("update fill...");
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
}
}
配置自定义填充策略:
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.MetaObjectHandlerInner;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new MetaObjectHandlerInner(new MyMetaObjectHandler()));
return interceptor;
}
}
逻辑删除
逻辑删除功能允许你在删除数据时,不真正删除数据库中的记录,而是通过设置一个字段来标记数据已删除。这里使用@TableLogic
注解来实现逻辑删除。
在实体类中添加@TableLogic
注解:
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String name;
@TableField(fill = FieldFill.INSERT)
private String createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateTime;
@TableLogic
private Integer deleted;
}
逻辑删除操作:
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
public boolean deleteUserById(Long id) {
return update(new QueryWrapper<User>().eq("id", id).set("deleted", 1));
}
}
分页插件
分页插件可以简化分页操作,避免手动拼接分页SQL。这里使用MybatisPlusInterceptor
插件来实现分页功能。
配置分页插件:
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
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 MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInterceptor());
return interceptor;
}
}
使用分页插件:
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
public IPage<User> getUsersPage(Page<User> page) {
return page(page);
}
}
常见问题解决
常见错误及解决方法
- 实体类映射问题:确保实体类中的字段名与数据库中的字段名一致。
- Mapper接口问题:确保Mapper接口继承了
BaseMapper<T>
接口。 - SQL执行问题:确保SQL语句正确,可以通过
MyBatis Plus
提供的SQL
日志查看器来查看生成的SQL。 - 分页插件问题:确保配置了分页插件,并且插件拦截了所有的查询操作。
- 逻辑删除问题:确保使用了
@TableLogic
注解,并且在更新操作中正确设置了逻辑删除字段。
- 使用缓存:通过Spring Cache或Redis等缓存技术来减少数据库访问。
- 批量操作:使用MyBatis Plus提供的批量插入、删除和更新方法,减少数据库的交互次数。
- 合理使用索引:为频繁查询的字段添加索引,提高查询效率。
- 分页查询:合理使用分页插件,避免一次性查询大量数据。
- 批量加载:使用MyBatis Plus的
@SelectBatch
注解来实现批量加载。
这里以一个简单的用户管理系统为例,展示如何使用MyBatis Plus进行开发。
实体类
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String name;
@TableField(fill = FieldFill.INSERT)
private String createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateTime;
@TableLogic
private Integer deleted;
}
Mapper接口
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
Page<User> page(Page<User> page);
}
服务层实现
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
public boolean insertUser(User user) {
return save(user);
}
public User getUserById(Long id) {
return getById(id);
}
public boolean updateUser(User user) {
return updateById(user);
}
public boolean deleteUserById(Long id) {
return removeById(id);
}
public IPage<User> getUsersPage(Page<User> page) {
return page(page);
}
}
控制器
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@PostMapping
public boolean insertUser(@RequestBody User user) {
return userService.insertUser(user);
}
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getUserById(id);
}
@PutMapping
public boolean updateUser(@RequestBody User user) {
return userService.updateUser(user);
}
@DeleteMapping("/{id}")
public boolean deleteUserById(@PathVariable Long id) {
return userService.deleteUserById(id);
}
@GetMapping("/page")
public Page<User> getUsersPage(@RequestParam int currentPage, @RequestParam int pageSize) {
Page<User> page = new Page<>(currentPage, pageSize);
return userService.getUsersPage(page);
}
}
MyBatis Plus在项目中的应用
在实际项目中,MyBatis Plus可以简化大量的数据库操作,减少开发人员的重复代码。以下是一些常见应用场景:
- 快速开发:通过自动生成代码,可以快速搭建项目框架,减少开发时间。
- 条件构造器:通过链式操作,可以灵活构建复杂的查询条件,提高代码的可读性和可维护性。
- 分页插件:简化分页操作,避免手动拼接分页SQL。
- 逻辑删除:通过逻辑删除,避免物理删除带来的数据丢失风险。
- 批量操作:提供批量插入、删除和更新的方法,减少数据库交互次数。
- 自动生成代码:通过代码生成器,可以自动生成Mapper、Service、Controller等基本代码,提高开发效率。
总之,MyBatis Plus简化了MyBatis的使用,提供了丰富的功能和便捷的操作,大大提高了开发效率和代码质量。
共同学习,写下你的评论
评论加载中...
作者其他优质文章