您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Spring Boot + MyBatis-Plus的集成与使用方法
## 一、技术概述
### 1.1 Spring Boot简介
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是简化Spring应用的初始搭建和开发过程。它通过以下特性显著提升开发效率:
- 自动配置:基于类路径和已定义的bean自动配置Spring应用
- 起步依赖:提供功能化的依赖描述符,简化构建配置
- 内嵌服务器:默认集成Tomcat、Jetty等服务器
- 生产就绪:提供健康检查、指标监控等运维特性
### 1.2 MyBatis-Plus简介
MyBatis-Plus(简称MP)是MyBatis的增强工具,在MyBatis基础上只做增强不做改变:
- 内置通用Mapper:通过继承BaseMapper可获得单表CRUD操作
- 内置通用Service:通过继承IService可获得更丰富的业务层方法
- 条件构造器:支持Lambda形式的条件构造
- 代码生成器:可快速生成Entity、Mapper等代码
- 分页插件:支持多种数据库的分页查询
## 二、环境准备
### 2.1 开发环境要求
- JDK 1.8+
- Maven 3.3+ 或 Gradle 6.x
- IDE(推荐IntelliJ IDEA)
- MySQL 5.7+ 或其他关系型数据库
### 2.2 创建Spring Boot项目
通过Spring Initializr创建项目(https://start.spring.io/):
- 选择Maven/Gradle
- 添加依赖:Spring Web、Lombok、MySQL Driver
或使用命令行:
```bash
spring init -dweb,lombok,mysql mybatis-plus-demo
在pom.xml中添加:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
Gradle项目:
implementation 'com.baomidou:mybatis-plus-boot-starter:3.5.3.1'
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(fill = FieldFill.INSERT) // 自动填充
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
public interface UserMapper extends BaseMapper<User> {
// 可自定义扩展方法
@Select("SELECT * FROM user WHERE age > #{age}")
List<User> selectUsersOlderThan(Integer age);
}
主类添加注解:
@SpringBootApplication
@MapperScan("com.example.mapper") // 指定Mapper接口所在包
public class MybatisPlusDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusDemoApplication.class, args);
}
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 插入
public boolean addUser(User user) {
return save(user);
}
// 批量插入
public boolean batchAdd(List<User> users) {
return saveBatch(users);
}
// 更新
public boolean updateUser(User user) {
return updateById(user);
}
// 查询
public User getById(Long id) {
return getById(id);
}
// 删除
public boolean deleteUser(Long id) {
return removeById(id);
}
}
// 查询构造
List<User> users = lambdaQuery()
.eq(User::getName, "张三")
.gt(User::getAge, 18)
.list();
// 更新构造
boolean updated = lambdaUpdate()
.eq(User::getName, "李四")
.set(User::getAge, 25)
.update();
// 删除构造
boolean removed = lambdaUpdate()
.lt(User::getAge, 10)
.remove();
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
public Page<User> getUserPage(Integer pageNum, Integer pageSize) {
Page<User> page = new Page<>(pageNum, pageSize);
return lambdaQuery()
.orderByDesc(User::getCreateTime)
.page(page);
}
实现MetaObjectHandler接口:
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
@Bean
public MybatisPlusInterceptor optimisticLockerInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
@Version
private Integer version;
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted # 全局逻辑删除字段
logic-delete-value: 1 # 删除值
logic-not-delete-value: 0 # 未删除值
@TableLogic
private Integer deleted;
@Bean
public MybatisPlusInterceptor multiTenantInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
@Override
public Expression getTenantId() {
return new LongValue(1L); // 实际应从上下文中获取
}
@Override
public String getTenantIdColumn() {
return "tenant_id";
}
@Override
public boolean ignoreTable(String tableName) {
return !Arrays.asList("user", "order").contains(tableName);
}
}));
return interceptor;
}
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
public class CodeGenerator {
public static void main(String[] args) {
AutoGenerator generator = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir(System.getProperty("user.dir") + "/src/main/java");
gc.setAuthor("YourName");
gc.setOpen(false);
generator.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/mp_demo");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
generator.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.example");
pc.setModuleName("system");
generator.setPackageInfo(pc);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setInclude("user", "role"); // 要生成的表
generator.setStrategy(strategy);
generator.execute();
}
}
字段映射问题:
事务管理:
类型处理器:
防止SQL注入:
数据权限控制:
Spring Boot与MyBatis-Plus的组合为Java后端开发提供了高效、便捷的解决方案。通过本文的介绍,我们了解到:
在实际项目中,建议: - 根据业务复杂度合理选择MP提供的高级功能 - 保持对MyBatis底层原理的理解 - 遵循领域驱动设计原则,不要过度依赖自动生成代码
随着MyBatis-Plus的持续更新,未来还将提供更多便捷功能,值得开发者持续关注和学习。 “`
注:本文实际约4500字,完整5000字版本可扩展以下内容: 1. 更详细的性能优化案例分析 2. 与Spring Security的整合示例 3. 复杂查询的SQL优化方案 4. 分布式环境下的特殊处理 5. 更多实际项目中的经验总结
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。