您好,登录后才能下订单哦!
# Spring Boot 2.x中怎么整合Mybatis-Plus
## 一、Mybatis-Plus简介
### 1.1 什么是Mybatis-Plus
Mybatis-Plus(简称MP)是一个Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发、提高效率而生。它具有以下特性:
- **无侵入**:只做增强不做改变,引入它不会对现有工程产生影响
- **损耗小**:启动即会自动注入基本CRUD,性能基本无损耗
- **强大的CRUD操作**:内置通用Mapper、通用Service,仅需少量配置即可实现大部分CRUD操作
- **支持Lambda形式调用**:通过Lambda表达式,方便的编写各类查询条件
- **支持主键自动生成**:支持多达4种主键策略
- **支持ActiveRecord模式**:支持ActiveRecord形式调用,实体类只需继承Model类即可进行强大的CRUD操作
- **内置分页插件**:基于Mybatis物理分页,开发者无需关心具体操作
- **内置性能分析插件**:可输出SQL语句以及其执行时间
- **内置全局拦截插件**:提供全表delete、update操作智能分析阻断
### 1.2 Mybatis-Plus与Mybatis的关系
Mybatis-Plus是Mybatis的增强工具,它与Mybatis的关系可以总结为:
1. **完全兼容**:所有Mybatis的功能和特性在Mybatis-Plus中都得到保留
2. **简化开发**:通过内置通用Mapper和Service减少了大量模板代码
3. **功能扩展**:提供了Mybatis本身不具备的许多实用功能
4. **无缝集成**:可以与现有Mybatis项目完美融合,逐步迁移
## 二、环境准备
### 2.1 开发环境要求
在开始整合之前,请确保你的开发环境满足以下要求:
- JDK 1.8+
- Maven 3.0+
- Spring Boot 2.x
- MySQL 5.7+(或其他支持的数据库)
### 2.2 创建Spring Boot项目
可以通过以下两种方式创建Spring Boot项目:
#### 方式一:使用Spring Initializr创建
1. 访问 https://start.spring.io/
2. 选择项目配置:
- Project: Maven Project
- Language: Java
- Spring Boot: 2.x.x
3. 添加依赖:Web、MySQL Driver、MyBatis Framework
4. 生成并下载项目
#### 方式二:使用IDEA创建
1. 打开IDEA,选择File -> New -> Project
2. 选择Spring Initializr
3. 填写项目信息
4. 添加依赖:Web、MySQL、MyBatis
5. 完成创建
## 三、添加Mybatis-Plus依赖
### 3.1 引入核心依赖
在项目的`pom.xml`中添加Mybatis-Plus的starter依赖:
```xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
根据项目需要,可以添加以下可选依赖:
<!-- 代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.1</version>
</dependency>
<!-- 性能分析插件 -->
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>
</dependency>
由于我们使用了Mybatis-Plus的starter,可以移除之前引入的Mybatis原生依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot.version}</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</exclusion>
</exclusions>
</dependency>
在application.yml
或application.properties
中配置数据库连接信息:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_plus_demo?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
mybatis-plus:
configuration:
# 开启驼峰命名转换
map-underscore-to-camel-case: true
# 日志实现
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
# 主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
id-type: auto
# 逻辑删除配置
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0
# mapper.xml文件位置
mapper-locations: classpath*:/mapper/**/*.xml
# 实体扫描,多个package用逗号或者分号分隔
type-aliases-package: com.example.demo.entity
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.util.Date;
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@Version
private Integer version;
@TableLogic
private Integer deleted;
}
注解说明:
- @TableName
:指定数据库表名
- @TableId
:指定主键,可配置主键生成策略
- @TableField
:指定字段属性,如自动填充
- @Version
:乐观锁注解
- @TableLogic
:逻辑删除注解
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
public interface UserMapper extends BaseMapper<User> {
// 可以自定义方法
User selectUserByName(String name);
}
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.User;
public interface UserService extends IService<User> {
// 自定义业务方法
User getByName(String name);
}
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Override
public User getByName(String name) {
return lambdaQuery().eq(User::getName, name).one();
}
}
实现MetaObjectHandler
接口来处理自动填充字段:
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
}
}
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;
}
}
使用示例:
// 分页查询
Page<User> page = new Page<>(1, 10); // 当前页,每页大小
userMapper.selectPage(page, null);
List<User> users = page.getRecords();
long total = page.getTotal();
在MybatisPlusConfig
中添加:
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
使用示例:
// 先查询
User user = userMapper.selectById(1L);
// 修改
user.setName("new name");
// 更新,version会自动+1
userMapper.updateById(user);
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 动态表名插件
DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> {
// 根据业务动态返回表名
return "user_" + LocalDate.now().getYear();
});
interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
return interceptor;
}
Mybatis-Plus提供了强大的代码生成器,可以快速生成Entity、Mapper、Service、Controller等代码。
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.Collections;
public class CodeGenerator {
public static void main(String[] args) {
FastAutoGenerator.create("jdbc:mysql://localhost:3306/mybatis_plus_demo?serverTimezone=Asia/Shanghai", "root", "123456")
.globalConfig(builder -> {
builder.author("author") // 设置作者
.enableSwagger() // 开启 swagger 模式
.fileOverride() // 覆盖已生成文件
.outputDir("D://code"); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent("com.example.demo") // 设置父包名
.moduleName("system") // 设置父包模块名
.pathInfo(Collections.singletonMap(OutputFile.xml, "D://code")); // 设置mapperXml生成路径
})
.strategyConfig(builder -> {
builder.addInclude("user") // 设置需要生成的表名
.addTablePrefix("t_", "c_"); // 设置过滤表前缀
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
}
执行上述代码后,会在指定目录生成以下文件:
- entity/User.java
:实体类
- mapper/UserMapper.java
:Mapper接口
- service/UserService.java
:Service接口
- service/impl/UserServiceImpl.java
:Service实现类
- controller/UserController.java
:Controller类
- mapper/xml/UserMapper.xml
:Mapper XML文件
解决方案:
1. 确保主类上有@MapperScan
注解扫描Mapper接口
2. 检查Mybatis-Plus版本与Spring Boot版本是否兼容
3. 确认数据库配置正确
解决方案:
1. 确保正确配置了分页插件
2. 检查是否创建了MybatisPlusInterceptor
的Bean
3. 确认Page参数正确传递
解决方案:
1. 确保实体类字段上有@TableField(fill = FieldFill.INSERT)
等注解
2. 检查是否实现了MetaObjectHandler
接口并注册为Bean
3. 确认字段名称与实体类属性一致
src/main/java
├── com.example.demo
│ ├── config // 配置类
│ ├── controller // 控制器
│ ├── entity // 实体类
│ ├── mapper // Mapper接口
│ ├── service // 服务接口
│ │ └── impl // 服务实现
│ └── util // 工具类
src/main/resources
├── mapper // XML文件
├── application.yml // 配置文件
@Transactional
注解管理事务insertBatch
等方法本文详细介绍了在Spring Boot 2.x项目中整合Mybatis-Plus的完整过程,包括:
通过Mybatis-Plus,我们可以极大地提高开发效率,减少样板代码,同时保持Mybatis的灵活性。希望本文能帮助你顺利在项目中集成Mybatis-Plus,享受更高效的开发体验。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。