MybatisPlus是一个强大的Mybatis增强工具,提供了丰富的功能简化数据库操作。本文详细介绍了MybatisPlus的基本概念、优势、快速入门以及高级功能,帮助开发者快速上手。文章还涵盖了MybatisPlus与其他框架的整合方法和常见问题的解决技巧,提供了全面的mybatisplus资料。
MybatisPlus简介 MybatisPlus的基本概念MybatisPlus 是一个 Mybatis 的增强工具,它在 Mybatis 基础上提供了许多开箱即用的功能,简化了开发过程。MybatisPlus 遵循 Mybatis 的设计思路,使得开发者可以专注于业务逻辑的实现,而不需要关心底层的细节。它在 Mybatis 的基础上提供了 CRUD 操作、条件构造器、分页插件、自动填充、逻辑删除等丰富的功能。
MybatisPlus 能够帮助开发者快速地搭建数据库操作的框架,提高了开发效率。它具有以下特点:
- 高性能: MybatisPlus 在 Mybatis 的基础上做了很多优化,如缓存、批量操作等,从而提高了数据库操作的性能。
- 简洁性: MybatisPlus 提供了丰富的注解和接口,使得代码更加简洁易读。
- 扩展性: MybatisPlus 可以轻松地与各种框架进行整合,如 Spring Boot、Spring、Mybatis 等,从而满足不同的开发需求。
- 易用性: MybatisPlus 提供了丰富的功能,如自动生成 SQL 语句、自动填充字段、逻辑删除等,使得开发变得更加简单。
MybatisPlus 的主要优势在于它强大的功能和简单易用的特性。以下是一些典型的应用场景:
- 快速开发: MybatisPlus 提供了丰富的功能,使得开发人员可以更快地完成数据库操作,减少了重复代码的编写。
- 性能优化: MybatisPlus 自带了多种优化手段,如缓存、批量操作等,能够显著提高系统的性能。
- 业务逻辑分离: MybatisPlus 允许开发人员将业务逻辑与数据库操作分开,使得代码更加清晰易读。
- 简化配置: MybatisPlus 提供了默认的配置,使得配置文件更加简洁,减少了配置的复杂度。
MybatisPlus的优势
- 便捷的CRUD操作: MybatisPlus 提供了丰富的 CRUD 操作接口,使得增删改查操作更加简单。
- 强大的条件构造器: MybatisPlus 提供了条件构造器,开发者可以轻松地构建复杂的查询条件。
- 高效的分页插件: MybatisPlus 提供了分页插件,支持多种分页方式,如 Mybatis 的分页插件等。
- 自动填充和逻辑删除: MybatisPlus 支持自动填充字段和逻辑删除,使得数据库操作更加灵活。
- 与多种框架的无缝集成: MybatisPlus 可以与 Spring Boot、Spring、Mybatis等框架无缝集成,提供了丰富的整合方案。
- 支持自定义插件: MybatisPlus 支持自定义插件,可以根据需求进行二次开发。
这些优势使得 MybatisPlus 成为一个非常实用的工具,适用于各种规模的项目。
MybatisPlus快速入门 MybatisPlus的环境搭建Maven依赖
要使用 MybatisPlus,首先需要在 Maven 项目中引入 MybatisPlus 的依赖。在 pom.xml
文件中添加如下依赖:
<dependencies>
<!-- 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.27</version>
</dependency>
<!-- Spring Boot Starter JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
数据库配置
在 application.yml
文件中配置数据库连接信息:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&characterEncoding=UTF-8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
实体类定义
创建一个简单的实体类 User
,用于表示用户信息:
package com.example.demo.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
@TableName("user")
public class User implements Serializable {
@TableId
private Long id;
private String name;
private Integer age;
private String email;
private Date createTime;
// 省略 Getter 和 Setter 方法
}
Mapper接口定义
创建一个 UserMapper
接口,继承自 BaseMapper
接口,用于定义数据库操作方法:
package com.example.demo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
public interface UserMapper extends BaseMapper<User> {
}
配置启用MybatisPlus
在 application.yml
文件中启用 MybatisPlus:
mybatis-plus:
configuration:
cache-enabled: false
启动类配置
在 Spring Boot 应用的启动类中配置 MybatisPlus:
package com.example.demo;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
import com.baomidou.mybatisplus.core.MybatisSqlSessionFactory;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
接口实现
在 Spring Boot 应用中,通过 UserMapper
接口可以直接调用 MybatisPlus 提供的 CRUD 方法,无需编写 SQL 语句。
示例代码
创建一个简单的测试类 UserMapperTest
,用于验证 MybatisPlus 的功能:
package com.example.demo.mapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testCRUD() {
// 插入数据
User user = new User();
user.setName("John Doe");
user.setAge(30);
user.setEmail("john.doe@example.com");
user.setCreateTime(new Date());
userMapper.insert(user);
// 查询数据
User userById = userMapper.selectById(user.getId());
System.out.println(userById);
// 更新数据
user.setAge(31);
userMapper.updateById(user);
// 删除数据
userMapper.deleteById(user.getId());
}
}
MybatisPlus的核心注解介绍
@TableId
@TableId
注解用于指定实体类的主键字段。默认情况下,MybatisPlus 会根据字段名推断主键字段。如果需要指定主键生成策略,可以使用 value
属性。
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableName
@TableName
注解用于指定实体类对应的数据库表名。默认情况下,MybatisPlus 会根据实体类名推断表名。
@TableName("user")
public class User implements Serializable {
// ...
}
@TableField
@TableField
注解用于指定实体类字段对应的数据库字段名。默认情况下,MybatisPlus 会根据字段名推断对应的数据库字段名。如果需要指定数据库字段名,可以使用 value
属性。
@TableField(value = "create_time")
private Date createTime;
@TableLogic
@TableLogic
注解用于指定逻辑删除字段。默认情况下,MybatisPlus 会将逻辑删除字段设置为 deleted
,值为 0 表示未删除,1 表示已删除。
@TableField(value = "deleted")
@TableLogic
private Integer deleted;
@Version
@Version
注解用于指定乐观锁字段。默认情况下,MybatisPlus 会将乐观锁字段设置为 version
。
@TableField(value = "version")
@Version
private Long version;
@TableField(exist = false)
@TableField(exist = false)
注解用于指定实体类字段对应的数据库字段不存在。这种情况往往在表结构和实体类不匹配时使用。
@TableField(exist = false)
private String nonExistentField;
@TableField(fill = FieldFill.INSERT)
@TableField(fill = FieldFill.INSERT)
注解用于指定在插入数据时自动填充的字段。可以使用 FieldFill
枚举指定填充时机(INSERT、UPDATE 等)。
@TableField(fill = FieldFill.INSERT, value = "create_time")
private Date createTime;
示例代码
package com.example.demo.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.Version;
import java.io.Serializable;
import java.util.Date;
@TableName("user")
public class User implements Serializable {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
@TableField(value = "email")
private String email;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableLogic
private Integer deleted;
@Version
private Long version;
// 省略 Getter 和 Setter 方法
}
MybatisPlus常用功能详解
CRUD操作
MybatisPlus 提供了一系列的 CRUD 操作接口,使得数据库操作变得更加简单。以下是 MybatisPlus 常用的 CRUD 操作方法:
插入数据
使用 insert
方法插入一条数据:
User user = new User();
user.setName("John Doe");
user.setAge(30);
user.setEmail("john.doe@example.com");
user.setCreateTime(new Date());
UserMapper userMapper = SpringContextUtils.getBean(UserMapper.class);
userMapper.insert(user);
查询数据
使用 selectById
方法查询一条数据:
User userById = userMapper.selectById(1L);
System.out.println(userById);
更新数据
使用 updateById
方法更新一条数据:
User user = new User();
user.setId(1L);
user.setAge(31);
userMapper.updateById(user);
删除数据
使用 deleteById
方法删除一条数据:
userMapper.deleteById(1L);
批量插入数据
使用 insertBatch
方法批量插入数据:
List<User> users = new ArrayList<>();
users.add(new User("Alice", 25, "alice@example.com"));
users.add(new User("Bob", 30, "bob@example.com"));
userMapper.insertBatch(users);
批量更新数据
使用 updateBatchById
方法批量更新数据:
List<User> users = new ArrayList<>();
users.add(new User(1L, "Alice", 26));
users.add(new User(2L, "Bob", 31));
userMapper.updateBatchById(users);
批量删除数据
使用 deleteBatchIds
方法批量删除数据:
List<Long> ids = Arrays.asList(1L, 2L);
userMapper.deleteBatchIds(ids);
示例代码
package com.example.demo.mapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testCRUD() {
// 插入数据
User user = new User();
user.setName("John Doe");
user.setAge(30);
user.setEmail("john.doe@example.com");
user.setCreateTime(new Date());
userMapper.insert(user);
// 查询数据
User userById = userMapper.selectById(user.getId());
System.out.println(userById);
// 更新数据
user.setAge(31);
userMapper.updateById(user);
// 删除数据
userMapper.deleteById(user.getId());
// 批量插入数据
List<User> users = new ArrayList<>();
users.add(new User("Alice", 25, "alice@example.com"));
users.add(new User("Bob", 30, "bob@example.com"));
userMapper.insertBatch(users);
// 批量更新数据
List<User> updatedUsers = new ArrayList<>();
updatedUsers.add(new User(1L, "Alice", 26));
updatedUsers.add(new User(2L, "Bob", 31));
userMapper.updateBatchById(updatedUsers);
// 批量删除数据
List<Long> ids = Arrays.asList(1L, 2L);
userMapper.deleteBatchIds(ids);
}
}
条件构造器的使用
MybatisPlus 提供了条件构造器 QueryWrapper
和 LambdaQueryWrapper
,用于构建复杂的查询条件。以下是条件构造器的使用示例:
基本条件构造
使用 QueryWrapper
构建基本的查询条件:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John Doe");
List<User> users = userMapper.selectList(queryWrapper);
多条件查询
使用 QueryWrapper
构建多条件查询:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John Doe").and(wrapper -> wrapper.gt("age", 30));
List<User> users = userMapper.selectList(queryWrapper);
Lambda表达式查询
使用 LambdaQueryWrapper
构建 Lambda 表达式查询:
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getName, "John Doe").and(wrapper -> wrapper.gt(User::getAge, 30));
List<User> users = userMapper.selectList(lambdaQueryWrapper);
分组查询
使用 QueryWrapper
构建分组查询:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("name").groupBy("name");
List<User> users = userMapper.selectList(queryWrapper);
排序查询
使用 QueryWrapper
构建排序查询:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("name").orderByDesc("age");
List<User> users = userMapper.selectList(queryWrapper);
示例代码
package com.example.demo.mapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testQueryWrapper() {
// 基本条件构造
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John Doe");
List<User> users = userMapper.selectList(queryWrapper);
System.out.println(users);
// 多条件查询
queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John Doe").and(wrapper -> wrapper.gt("age", 30));
users = userMapper.selectList(queryWrapper);
System.out.println(users);
// Lambda表达式查询
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getName, "John Doe").and(wrapper -> wrapper.gt(User::getAge, 30));
users = userMapper.selectList(lambdaQueryWrapper);
System.out.println(users);
// 分组查询
queryWrapper = new QueryWrapper<>();
queryWrapper.select("name").groupBy("name");
users = userMapper.selectList(queryWrapper);
System.out.println(users);
// 排序查询
queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("name").orderByDesc("age");
users = userMapper.selectList(queryWrapper);
System.out.println(users);
}
}
分页插件的使用
MybatisPlus 提供了分页插件 PaginationInterceptor
,用于支持分页查询。以下是分页插件的使用示例:
配置分页插件
在 Spring Boot 应用的启动类中配置分页插件:
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
使用分页插件
在查询方法中使用 Page
对象进行分页查询:
Page<User> page = new Page<>(1, 10);
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
List<User> users = userMapper.selectPage(page, queryWrapper);
System.out.println(page.getRecords());
示例代码
package com.example.demo.mapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testPagination() {
// 使用分页插件
Page<User> page = new Page<>(1, 10);
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
List<User> users = userMapper.selectPage(page, queryWrapper);
System.out.println(page.getRecords());
}
}
MybatisPlus高级功能探索
自动填充
MybatisPlus 支持自动填充字段,开发者可以配置自动填充策略,使得插入和更新数据时自动填充特定字段的值。以下是自动填充的使用示例:
配置自动填充
在实体类中使用 @TableField(fill = FieldFill.INSERT)
和 @TableField(fill = FieldFill.INSERT_UPDATE)
注解配置自动填充字段:
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
在 application.yml
文件中配置自动填充策略:
mybatis-plus:
global-config:
db-config:
auto-fill-strategy:
- create-time
- update-time
示例代码
package com.example.demo.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import java.util.Date;
@TableName("user")
public class User implements Serializable {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
// 省略 Getter 和 Setter 方法
}
mybatis-plus:
global-config:
db-config:
auto-fill-strategy:
- create-time
- update-time
示例代码
package com.example.demo.mapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testAutoFill() {
// 插入数据
User user = new User();
user.setName("John Doe");
user.setAge(30);
user.setEmail("john.doe@example.com");
userMapper.insert(user);
// 查询数据
User userById = userMapper.selectById(user.getId());
System.out.println(userById);
}
}
逻辑删除
MybatisPlus 支持逻辑删除,开发者可以配置逻辑删除字段,使得删除数据时不会真正删除数据库记录,而是将逻辑删除字段标记为已删除。以下是逻辑删除的使用示例:
配置逻辑删除
在实体类中使用 @TableField
和 @TableLogic
注解配置逻辑删除字段:
@TableField(value = "deleted")
@TableLogic
private Integer deleted;
示例代码
package com.example.demo.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import java.io.Serializable;
import java.util.Date;
@TableName("user")
public class User implements Serializable {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
@TableField(value = "email")
private String email;
@TableField(value = "deleted")
@TableLogic
private Integer deleted;
// 省略 Getter 和 Setter 方法
}
示例代码
package com.example.demo.mapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testLogicDelete() {
// 插入数据
User user = new User();
user.setName("John Doe");
user.setAge(30);
user.setEmail("john.doe@example.com");
userMapper.insert(user);
// 查询数据
User userById = userMapper.selectById(user.getId());
System.out.println(userById);
// 逻辑删除数据
userMapper.deleteById(user.getId());
// 查询数据
userById = userMapper.selectById(user.getId());
System.out.println(userById);
}
}
MybatisPlus与其他框架的整合
MybatisPlus与Spring Boot的整合
MybatisPlus 可以与 Spring Boot 进行无缝整合,使得开发更加方便。以下是 MybatisPlus 与 Spring Boot 的整合示例:
配置Spring Boot依赖
在 pom.xml
文件中添加 Spring Boot 依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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.27</version>
</dependency>
</dependencies>
配置数据库连接信息
在 application.yml
文件中配置数据库连接信息:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&characterEncoding=UTF-8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
配置MybatisPlus
在 application.yml
文件中配置 MybatisPlus:
mybatis-plus:
global-config:
db-config:
id-type: AUTO
logic-delete-value: 1
logic-not-delete-value: 0
configuration:
cache-enabled: false
使用Spring Boot启动类
在 Spring Boot 应用的启动类中配置 MybatisPlus:
package com.example.demo;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
import com.baomidou.mybatisplus.core.MybatisSqlSessionFactory;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
示例代码
package com.example.demo.mapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testCRUD() {
// 插入数据
User user = new User();
user.setName("John Doe");
user.setAge(30);
user.setEmail("john.doe@example.com");
userMapper.insert(user);
// 查询数据
User userById = userMapper.selectById(user.getId());
System.out.println(userById);
// 更新数据
user.setAge(31);
userMapper.updateById(user);
// 删除数据
userMapper.deleteById(user.getId());
}
}
MybatisPlus与Mybatis的对比
MybatisPlus 是 Mybatis 的增强工具,提供了许多开箱即用的功能,简化了开发过程。以下是 MybatisPlus 与 Mybatis 的对比:
MybatisPlus的功能增强
- CRUD操作: MybatisPlus 提供了丰富的 CRUD 操作接口,使得数据库操作变得更加简单。
- 条件构造器: MybatisPlus 提供了条件构造器,开发者可以轻松地构建复杂的查询条件。
- 分页插件: MybatisPlus 提供了分页插件,支持多种分页方式,如 Mybatis 的分页插件等。
- 自动填充: MybatisPlus 支持自动填充字段,使得插入和更新数据时自动填充特定字段的值。
- 逻辑删除: MybatisPlus 支持逻辑删除,使得删除数据时不会真正删除数据库记录,而是将逻辑删除字段标记为已删除。
- 乐观锁: MybatisPlus 支持乐观锁,可以防止并发操作数据时的数据不一致问题。
- 自定义插件: MybatisPlus 支持自定义插件,可以根据需求进行二次开发。
MybatisPlus与Mybatis的整合
MybatisPlus 可以与 Mybatis 进行无缝整合,使得开发更加方便。以下是 MybatisPlus 与 Mybatis 的整合示例:
配置Mybatis
在 pom.xml
文件中添加 Mybatis 依赖:
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
</dependencies>
在 application.yml
文件中配置 Mybatis:
mybatis:
mapper-locations: classpath*:mapper/*.xml
type-aliases-package: com.example.demo.entity
配置MybatisPlus
在 pom.xml
文件中添加 MybatisPlus 依赖:
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
</dependencies>
在 application.yml
文件中配置 MybatisPlus:
mybatis-plus:
global-config:
db-config:
id-type: AUTO
logic-delete-value: 1
logic-not-delete-value: 0
configuration:
cache-enabled: false
使用MybatisPlus
在 Spring Boot 应用的启动类中配置 MybatisPlus:
package com.example.demo;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
import com.baomidou.mybatisplus.core.MybatisSqlSessionFactory;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
示例代码
package com.example.demo.mapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testCRUD() {
// 插入数据
User user = new User();
user.setName("John Doe");
user.setAge(30);
user.setEmail("john.doe@example.com");
userMapper.insert(user);
// 查询数据
User userById = userMapper.selectById(user.getId());
System.out.println(userById);
// 更新数据
user.setAge(31);
userMapper.updateById(user);
// 删除数据
userMapper.deleteById(user.getId());
}
}
常见问题及解决方法
常见错误及解决办法
-
找不到Mapper接口
- 原因: Mapper 接口未被正确扫描。
- 解决办法: 确保 Mapper 接口被
@MapperScan
注解正确扫描。
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {
// ...
}
-
自动填充失败
- 原因: 自动填充策略未正确配置。
- 解决办法: 检查
application.yml
文件中的自动填充策略配置是否正确。
mybatis-plus:
global-config:
db-config:
auto-fill-strategy:
- create-time
- update-time
-
乐观锁异常
- 原因: 乐观锁字段未正确配置。
- 解决办法: 确保乐观锁字段被
@Version
注解正确配置。
@TableField(value = "version")
@Version
private Long version;
-
逻辑删除失败
- 原因: 逻辑删除字段未正确配置。
- 解决办法: 确保逻辑删除字段被
@TableLogic
注解正确配置。
@TableField(value = "deleted")
@TableLogic
private Integer deleted;
MybatisPlus的优化技巧
-
缓存优化
- 原因: 缓存可以提高数据库操作的性能。
- 解决办法: 配置 MybatisPlus 的缓存策略。
mybatis-plus:
configuration:
cache-enabled: true
-
批量操作优化
- 原因: 批量操作可以减少数据库访问次数,提高性能。
- 解决办法: 使用
insertBatch
、updateBatchById
和deleteBatchIds
方法进行批量操作。
List<User> users = new ArrayList<>();
users.add(new User("Alice", 25, "alice@example.com"));
users.add(new User("Bob", 30, "bob@example.com"));
userMapper.insertBatch(users);
-
分页优化
- 原因: 分页插件可以减少每次查询的数据量,提高性能。
- 解决办法: 使用分页插件进行分页查询。
Page<User> page = new Page<>(1, 10);
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
List<User> users = userMapper.selectPage(page, queryWrapper);
-
配置优化
- 原因: 合理配置可以提高 MybatisPlus 的性能。
- 解决办法: 检查
application.yml
文件中的配置是否合理。
mybatis-plus:
global-config:
db-config:
id-type: AUTO
configuration:
cache-enabled: true
use-column-label: true
use-generated-keys: true
共同学习,写下你的评论
评论加载中...
作者其他优质文章