本文详细介绍了MyBatis Plus学习的相关内容,包括MyBatis Plus的功能特点、与MyBatis的区别、安装与环境搭建步骤以及基本使用方法。文章还深入讲解了MyBatis Plus的高级特性、与Spring Boot的集成以及事务管理等知识点。
MyBatis Plus简介MyBatis Plus是什么
MyBatis Plus 是一个 MyBatis 的增强工具,它在 MyBatis 的基础上提供了大量的开箱即用的功能,极大简化了开发人员的工作量。它提供了简单的 CRUD 操作、分页插件、逻辑删除、自动填充等功能,同时支持自定义扩展,可以方便地与各种主流框架(如 Spring Boot)进行集成。
MyBatis Plus与MyBatis的区别
MyBatis 本身是一个持久化框架,它提供了将 Java 对象与数据库表进行映射的能力,简化了数据库操作。而 MyBatis Plus 是在 MyBatis 的基础上进行了功能扩展,提供了更多的便捷功能,比如自动生成 CRUD 操作、分页插件、逻辑删除等。
-
MyBatis:
- 需要手动编写 SQL 语句,包括增删改查等操作。
- 需要手动编写分页逻辑。
- 缺乏逻辑删除功能。
- MyBatis Plus:
- 自动生成 CRUD 操作,无需手动编写 SQL。
- 提供分页插件,无需手动编写分页逻辑。
- 支持逻辑删除,可以通过配置实现软删除。
MyBatis Plus的安装与环境搭建
安装步骤
-
添加 Maven 依赖:
在你的pom.xml
文件中添加 MyBatis Plus 的依赖。<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency>
-
数据库配置:
在application.yml
或者application.properties
文件中配置数据库连接信息。spring: datasource: url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&useSSL=false username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver
-
创建实体类:
创建一个简单的实体类,例如User
类。import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; 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; private Integer age; }
-
创建 Mapper 接口:
创建一个 Mapper 接口,继承BaseMapper
接口。import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface UserMapper extends BaseMapper<User> { }
-
创建配置类:
创建一个配置类来初始化 MyBatis Plus。import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; 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 PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }
完成以上步骤后,MyBatis Plus 的环境就搭建好了。
MyBatis Plus的基本使用数据库配置
在 Spring Boot 项目中,数据库配置通常在 application.yml
或 application.properties
文件中完成。以下是一个示例:
spring:
dataSource:
url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
实体类和Mapper接口的创建
实体类
实体类通常使用 MyBatis Plus 提供的注解进行定义,例如 @TableName
和 @TableId
。
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
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;
private Integer age;
}
Mapper接口
Mapper 接口继承 BaseMapper
接口,MyBatis Plus 会自动生成相应的 CRUD 方法。
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface UserMapper extends BaseMapper<User> {
}
基本的CRUD操作
添加数据
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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 addUser(User user) {
userMapper.insert(user);
}
}
查询数据
public User getUserById(Long id) {
return userMapper.selectById(id);
}
更新数据
public boolean updateUser(User user) {
return userMapper.updateById(user) > 0;
}
删除数据
public boolean deleteUser(Long id) {
return userMapper.deleteById(id) > 0;
}
MyBatis Plus的高级特性
条件构造器的使用
MyBatis Plus 提供了一个强大的条件构造器 QueryWrapper
,可以用来构建复杂的查询条件。
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
public List<User> getUsersByCondition(String name, Integer age) {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", name);
wrapper.gt("age", age);
return userMapper.selectList(wrapper);
}
分页插件的配置与使用
分页插件可以方便地进行分页查询。
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
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 PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
分页查询
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
public Page<User> getUsersByPage(Integer current, Integer size) {
Page<User> page = new Page<>(current, size);
return userMapper.selectPage(page, null);
}
自动填充与逻辑删除
自动填充
可以通过 MetaObjectHandler
接口实现自动填充功能。
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
metaObject.setValue("createTime", new Date());
metaObject.setValue("updateTime", new Date());
}
@Override
public void updateFill(MetaObject metaObject) {
metaObject.setValue("updateTime", new Date());
}
}
逻辑删除
通过 @TableLogic
注解实现逻辑删除功能。
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;
@Data
@TableName("user")
public class User {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableLogic
private Integer deleted;
private String name;
private Integer age;
}
MyBatis Plus与Spring Boot的集成
Spring Boot项目的创建
使用 spring initializr
创建一个新的 Spring Boot 项目,并选择依赖项。
MyBatis Plus在Spring Boot中的配置
添加依赖
在 pom.xml
文件中添加 MyBatis Plus 的依赖。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
配置文件
配置数据库连接信息。
spring:
dataSource:
url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
配置类
配置 MyBatis Plus 插件。
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
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 PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
使用MyBatis Plus进行数据库操作
实体类
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
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;
private Integer age;
}
Mapper接口
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface UserMapper extends BaseMapper<User> {
}
服务层
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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 addUser(User user) {
userMapper.insert(user);
}
public User getUserById(Long id) {
return userMapper.selectById(id);
}
public boolean updateUser(User user) {
return userMapper.updateById(user) > 0;
}
public boolean deleteUser(Long id) {
return userMapper.deleteById(id) > 0;
}
}
MyBatis Plus的事务管理
事务的基本概念
事务是数据库操作中的一个基本概念,它是一组操作的集合,这些操作要么全部成功,要么全部失败。事务具有以下四个特性:
- 原子性:事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。
- 一致性:事务必须使数据库从一个一致性状态转换到另一个一致性状态。
- 隔离性:一个事务的执行不能被其他事务干扰。
- 持久性:事务一旦提交,其结果就应该是永久性的。
MyBatis Plus中的事务处理
MyBatis Plus 提供了事务的支持,可以通过 Spring 的事务管理机制来处理事务。
开启事务
默认情况下,Spring Boot 会自动配置事务管理器。可以通过 @Transactional
注解来控制方法级别的事务。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public void addUser(User user) {
userMapper.insert(user);
}
@Transactional
public void addUserWithException(User user) {
userMapper.insert(user);
// 引发异常
throw new RuntimeException("Something went wrong");
}
}
事务的提交与回滚
如果事务中没有抛出异常,事务会自动提交;如果抛出了异常,事务会自动回滚。
实际应用示例
假设我们需要在一个方法中同时插入多个用户,如果任意一个插入失败,整个操作都应该回滚。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public void addUsers(List<User> users) {
for (User user : users) {
userMapper.insert(user);
// 模拟插入失败
if (user.getId() % 2 == 0) {
throw new RuntimeException("Insert failed for user " + user.getName());
}
}
}
}
MyBatis Plus的日志与测试
日志配置与输出
MyBatis Plus 支持多种日志框架,如 Log4j、Logback 等。可以通过配置文件来设置日志输出。
Logback 配置
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.baomidou.mybatisplus" level="DEBUG" />
<root level="info">
<appender-ref ref="STDOUT" />
</root>
</configuration>
测试环境的搭建
可以通过 JUnit 来编写单元测试,确保代码的正确性。
测试类
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void testAddUser() {
User user = new User();
user.setName("Test User");
user.setAge(25);
userService.addUser(user);
User savedUser = userService.getUserById(user.getId());
assert savedUser != null;
assert savedUser.getName().equals("Test User");
assert savedUser.getAge() == 25;
}
}
常见问题及解决方案
问题:插入数据时主键冲突
解决方案:在实体类中设置主键生成策略。
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
问题:查询数据时数据库连接失败
解决方案:检查数据库连接配置是否正确,确保数据库服务已启动。
问题:事务处理失败
解决方案:确保 @Transactional
注解正确使用,并检查事务传播行为是否符合预期。
通过以上步骤和示例代码,你可以详细了解和掌握 MyBatis Plus 的使用方法及其与 Spring Boot 的集成。希望这篇文章对你有所帮助。
共同学习,写下你的评论
评论加载中...
作者其他优质文章