ruoyi-vue-x/update.md

275 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

ruoyi mybatis-plus版
------------------
### 改造
#### 依赖配置
> 1. [pom.xml](pom.xml)
```xml
<mybatis-plus.version>3.5.5</mybatis-plus.version>
<!--mybatis-plus配置适配SpringBoot2-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
```
> 2.增加mybatis-plus [ruoyi-admin/pom.xml](ruoyi-admin/pom.xml)
```xml
<!-- pagehelper 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<exclusions>
<!--移除mybatis的依赖-->
<exclusion>
<artifactId>mybatis</artifactId>
<groupId>org.mybatis</groupId>
</exclusion>
</exclusions>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
```
#### 代码改修
> 1.关掉mybatis的配置 [MyBatisConfig.java](ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java)
```java
@Configuration
@ConditionalOnProperty(name = "ruoyi.mybatis.enable", matchIfMissing = false)
public class MyBatisConfig
```
> 2.追加mybatisPlus的配置覆盖mybatis的配置 [MybatisPlusConfig.java](ruoyi-admin/src/main/java/com/ruoyi/web/core/config/MybatisPlusConfig.java)
<details>
<summary>点我展开看代码</summary>
<pre><code>
package com.ruoyi.web.core.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* MybatisPlus 配置文件
*
* @author maxf
* @version 1.0
* @ClassName MybatisPlusConfig
* @Description
* @date 2018/12/13 11:34
*/
//Spring boot方式
@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {
/**
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//新的分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
//乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
@Bean
@ConditionalOnMissingBean
public MetaObjectHandler metaObjectHandler() {
return new MplusMetaObjectHandler();
}
/**
* 注入sql注入器
*/
@Bean
@ConditionalOnMissingBean
public DefaultSqlInjector sqlInjector() {
return new DefaultSqlInjector();
}
}
</code></pre>
</details>
>公共字段的自动填充处理(1)[BaseEntity.java](ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java)
```java
/** 搜索值 该字段数据库不需要*/
@TableField(exist = false)
@JsonIgnore
private String searchValue;
/** 创建者 新增时自动填充*/
@TableField(fill = FieldFill.INSERT)
private String createBy;
/** 创建时间 新增时自动填充*/
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/** 更新者 新增和修改时自动填充*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
/** 更新时间 新增和修改时自动填充*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/** 备注 */
private String remark;
/** 请求参数 该字段数据库不需要*/
@TableField(exist = false)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
private Map<String, Object> params;
```
>公共字段的自动填充处理(2) [MplusMetaObjectHandler.java](ruoyi-admin/src/main/java/com/ruoyi/web/core/config/MplusMetaObjectHandler.java)
<details>
<summary>点我展开看代码</summary>
<pre><code>
package com.ruoyi.web.core.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import java.util.Date;
/**
* 注入公共字段自动填充,任选注入方式即可
* <h2>
* 继承使用
* </h2>
* <p>
* 继承后<i>重写 {@link #getOperator()}</i><i>重新注入 Bean</i>
* </p>
* <pre>
* @author yexuejc
* @Bean
* public MyMetaObjectHandler metaObjectHandler() {
* return new MyMetaObjectHandler();
* }
* </pre>
*/
public class MplusMetaObjectHandler implements MetaObjectHandler {
/**
* 创建时间
*/
protected String crtTimeColumn = "createTime";
/**
* 创建人
*/
protected String crtByColumn = "createBy";
/**
* 最后操作时间
*/
protected String updateTimeColumn = "updateTime";
/**
* 最后操作人
*/
protected String updateByColumn = "updateBy";
/**
* 设置操作者
* <p>
* 应设置登录账号为操作者,这里由每个工程具体实现
* </p>
* <p>
* 返回null时会查找consumerId作为操作者找不到会设置默认值
* <br/>
* 返回"" 时,会存""
* </p>
*
* @return
*/
protected String getOperator() {
return "";
}
@Override
public void insertFill(MetaObject metaObject) {
Object crtTime = metaObject.getValue(crtTimeColumn);
if (crtTime == null) {
this.strictInsertFill(metaObject, crtTimeColumn, Date.class, new Date());
}
Object crtBy = metaObject.getValue(crtByColumn);
if (crtBy == null) {
this.strictInsertFill(metaObject, crtByColumn, String.class, getOperator());
}
Object mdfyTime = metaObject.getValue(updateTimeColumn);
if (mdfyTime == null) {
this.strictInsertFill(metaObject, updateTimeColumn, Date.class, new Date());
}
Object mdfyBy = metaObject.getValue(updateByColumn);
if (mdfyBy == null) {
this.strictInsertFill(metaObject, updateByColumn, String.class, getOperator());
}
}
@Override
public void updateFill(MetaObject metaObject) {
Object mdfyTime = metaObject.getValue(updateTimeColumn);
if (mdfyTime == null) {
this.strictInsertFill(metaObject, updateTimeColumn, Date.class, new Date());
}
Object mdfyBy = metaObject.getValue(updateByColumn);
if (mdfyBy == null) {
this.strictInsertFill(metaObject, updateByColumn, String.class, getOperator());
}
}
}
</code></pre>
</details>
> 4.自动获取操作者的实现(需要注入为bean) [RuoyiMetaObjectHandler.java](ruoyi-admin/src/main/java/com/ruoyi/web/core/config/RuoyiMetaObjectHandler.java)
```
package com.ruoyi.web.core.config;
import com.ruoyi.common.utils.SecurityUtils;
/**
* @author: yexuejc
* @date: 2020-10-13 15:25:28
*/
public class RuoyiMetaObjectHandler extends MplusMetaObjectHandler {
@Override
protected String getOperator() {
return SecurityUtils.getUsername();
}
}
```
#### 配置
> mybatis的配置改为mybatis-plus的配置ruoyi-admin/src/main/resources/application.yml
```properties
# MyBatis配置(plus)
mybatis-plus:
# 搜索指定包别名
typeAliasesPackage: com.ruoyi.**.domain
# 配置mapper的扫描找到所有的mapper.xml映射文件
mapperLocations: classpath*:mapper/**/*Mapper.xml
# 加载全局的配置文件
configLocation: classpath:mybatis/mybatis-config.xml
```
### 多出的功能
* [mybatis-plus-test](mybatis-plus-test) 集成mybatis-plus后的测试demo
> 先创建demo表[init.sql](mybatis-plus-test/src/main/resources/init.sql);执行参照[UserOrderServiceTest.java](mybatis-plus-test/src/test/java/com/ruoyi/mp/service/UserOrderServiceTest.java)