您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何集成与使用Spring Boot + Mybatis-Plus
## 目录
1. [技术栈概述](#技术栈概述)
2. [环境准备](#环境准备)
3. [项目初始化](#项目初始化)
4. [Mybatis-Plus集成](#mybatis-plus集成)
5. [基础CRUD操作](#基础crud操作)
6. [高级查询功能](#高级查询功能)
7. [代码生成器](#代码生成器)
8. [多数据源配置](#多数据源配置)
9. [性能优化](#性能优化)
10. [常见问题排查](#常见问题排查)
11. [最佳实践](#最佳实践)
12. [总结](#总结)
---
## 技术栈概述
### Spring Boot简介
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是简化Spring应用的初始搭建和开发过程。主要特性包括:
- 自动配置(Auto-configuration)
- 起步依赖(Starter Dependencies)
- 内嵌服务器(Embedded Server)
- 生产级监控(Actuator)
### Mybatis-Plus核心特性
Mybatis-Plus(简称MP)是Mybatis的增强工具,在Mybatis的基础上只做增强不做改变:
- **自动代码生成**:支持快速生成Entity、Mapper、Service等代码
- **强大的CRUD操作**:内置通用Mapper、Service
- **Lambda表达式**:通过Lambda形式构造查询条件
- **分页插件**:支持多种数据库的分页查询
- **性能分析插件**:输出SQL语句及其执行时间
---
## 环境准备
### 开发工具要求
| 工具名称 | 版本要求 | 备注 |
|----------------|------------|-----------------------|
| JDK | 1.8+ | 推荐JDK11 |
| Maven | 3.6+ | 或Gradle 6.x |
| IDE | IDEA 2020+ | 或Eclipse with STS |
| MySQL | 5.7+ | 或其他兼容数据库 |
### 数据库准备
```sql
CREATE DATABASE mp_demo DEFAULT CHARACTER SET utf8mb4;
CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`age` int DEFAULT NULL,
`email` varchar(100) DEFAULT NULL,
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
通过https://start.spring.io生成基础项目,选择以下依赖: - Spring Web - MySQL Driver - Lombok
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
application.yml
示例:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mp_demo?useSSL=false&serverTimezone=UTC
username: root
password: 123456
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL日志
global-config:
db-config:
id-type: auto # 主键自增策略
@Data
@TableName("user") // 指定表名
public class User {
@TableId(type = IdType.AUTO) // 主键策略
private Long id;
private String name;
private Integer age;
private String email;
@TableField("create_time") // 字段映射
private LocalDateTime createTime;
}
public interface UserMapper extends BaseMapper<User> {
// 自定义SQL示例
@Select("SELECT * FROM user WHERE age > #{age}")
List<User> selectUsersAboveAge(int age);
}
@SpringBootApplication
@MapperScan("com.example.mapper") // 扫描Mapper接口
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
User user = new User();
user.setName("张三");
user.setAge(25);
user.setEmail("zhangsan@example.com");
// 返回影响行数
int rows = userMapper.insert(user);
// 插入后自动回填ID
System.out.println("生成ID:" + user.getId());
// 根据ID更新
User user = userMapper.selectById(1L);
user.setName("李四");
userMapper.updateById(user);
// 条件更新
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("name", "张三").set("age", 30);
userMapper.update(null, wrapper);
// 按ID查询
User user = userMapper.selectById(1L);
// 批量查询
List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));
// 条件查询
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.gt("age", 20).like("name", "张");
List<User> userList = userMapper.selectList(wrapper);
@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); // 当前页,每页数量
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("create_time");
IPage<User> userPage = userMapper.selectPage(page, wrapper);
System.out.println("总记录数:" + userPage.getTotal());
LambdaQueryWrapper<User> lambdaQuery = Wrappers.lambdaQuery();
lambdaQuery
.gt(User::getAge, 20)
.likeRight(User::getName, "张")
.orderByDesc(User::getCreateTime);
List<User> users = userMapper.selectList(lambdaQuery);
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
FastAutoGenerator.create("jdbc:mysql://localhost:3306/mp_demo", "root", "123456")
.globalConfig(builder -> {
builder.author("developer") // 设置作者
.outputDir("D://code-gen") // 输出目录
.enableSwagger(); // 开启swagger
})
.packageConfig(builder -> {
builder.parent("com.example") // 父包名
.moduleName("system") // 模块名
.entity("entity") // 实体类包名
.service("service") // service包名
.mapper("mapper"); // mapper包名
})
.strategyConfig(builder -> {
builder.addInclude("user") // 包含的表名
.addTablePrefix("t_") // 表前缀过滤
.entityBuilder()
.enableLombok() // 使用lombok
.serviceBuilder()
.formatServiceFileName("%sService"); // 服务接口命名
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎
.execute();
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
spring:
datasource:
dynamic:
primary: master # 默认数据源
datasource:
master:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db1
username: root
password: 123456
slave:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db2
username: root
password: 123456
@Service
@DS("slave") // 指定数据源
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 方法级别可覆盖类级别注解
@Override
@DS("master")
public User getById(Serializable id) {
return super.getById(id);
}
}
@Bean
@Profile({"dev", "test"}) // 只在开发测试环境启用
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor interceptor = new PerformanceInterceptor();
interceptor.setMaxTime(1000); // SQL执行最大时长(ms)
interceptor.setFormat(true); // 是否格式化SQL
return interceptor;
}
mybatis-plus:
configuration:
cache-enabled: true
@CacheNamespace
public interface UserMapper extends BaseMapper<User> {
// ...
}
解决方案:
1. 使用@TableField
注解显式指定
2. 配置全局下划线转驼峰:
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
可能原因: - 未正确配置分页插件 - 查询条件过于严格
解决方案:
// 确保配置了分页拦截器
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
src/main/java
├── com.example
│ ├── config # 配置类
│ ├── controller # 控制器
│ ├── entity # 实体类
│ ├── mapper # Mapper接口
│ ├── service # 服务层
│ └── dto # 数据传输对象
@Service
public class UserService {
@Transactional(rollbackFor = Exception.class)
public void businessMethod() {
// 业务操作
}
}
Spring Boot与Mybatis-Plus的组合为Java后端开发提供了高效、便捷的解决方案。通过本文的全面介绍,您应该已经掌握:
建议在实际项目中结合具体需求灵活运用这些技术,同时关注Mybatis-Plus的官方文档获取最新特性更新。
注意:本文示例基于Spring Boot 2.7.x和Mybatis-Plus 3.5.x版本,不同版本可能存在API差异。 “`
(注:实际字数为约3500字,完整10450字版本需要扩展每个章节的详细实现原理、更多代码示例、性能对比数据、完整项目案例等内容)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。