从0开始搭建后台管理系统,这是No17。上一篇我们讲到了:前端UI框架Arco design。这一节,我们来引入MyBatis-Flex。
为什么引入MyBatis-Flex
MyBatis-Flex有诸多优点,大家可官网了解
https://mybatis-flex.com/
引入MyBatis-Flex
1、加入依赖,当前所用版本为
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-spring-boot3-starter</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
版本说明:
<mybatis.flex.version>1.11.4</mybatis.flex.version>
<mybatis.version>3.5.19</mybatis.version>
<mybatis.spring.version>3.0.4</mybatis.spring.version>
2、mybatis-flex配置
配置多租户、逻辑删除、主键ID生成方式、乐观锁相关。
package cn.lovecto.yuen.framework.mybatisflex.config;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.core.FlexGlobalConfig;
import com.mybatisflex.core.FlexGlobalConfig.KeyConfig;
import com.mybatisflex.core.keygen.KeyGenerators;
import com.mybatisflex.core.tenant.TenantFactory;
import cn.lovecto.yuen.common.tenant.YuenTenantProperties;
import cn.lovecto.yuen.common.utils.TenantUtils;
import cn.lovecto.yuen.framework.mybatisflex.domain.FlexBaseEntity;
import cn.lovecto.yuen.framework.mybatisflex.listener.FlexInsertListener;
import cn.lovecto.yuen.framework.mybatisflex.listener.FlexUpdateListener;
@AutoConfiguration
@EnableTransactionManagement(proxyTargetClass = true)
@MapperScan("cn.lovecto.yuen.**.mapper")
@EnableConfigurationProperties(YuenTenantProperties.class)
public class YuenMybatisflexAutoConfiguration {
public YuenMybatisflexAutoConfiguration() {
//全局设置多租户字段,这样就可以省略实体类属性上的 @Column(tenantId = true)注解
FlexGlobalConfig config = FlexGlobalConfig.getDefaultConfig();
config.setTenantColumn("tenant");
config.setLogicDeleteColumn("deleted");
config.setNormalValueOfLogicDelete(0);
config.setDeletedValueOfLogicDelete(1);
config.setVersionColumn("version");
config.registerInsertListener(new FlexInsertListener(), FlexBaseEntity.class);
config.registerUpdateListener(new FlexUpdateListener(), FlexBaseEntity.class);
KeyConfig keyConfig = new KeyConfig();
keyConfig.setKeyType(KeyType.Generator);
keyConfig.setValue(KeyGenerators.snowFlakeId);
keyConfig.setBefore(true);
config.setKeyConfig(keyConfig);
}
/**
* 获取租户配置
* @return
*/
@Bean
public TenantFactory tenantFactory(){
TenantFactory tenantFactory = new TenantFactory() {
@Override
public Object[] getTenantIds() {
Integer tenant = TenantUtils.getTenant();
if(tenant == null) {
return null;
}else {
return new Object[]{tenant};
}
}
};
return tenantFactory;
}
}
插入数据时自动填充:
package cn.lovecto.yuen.framework.mybatisflex.listener;
import java.util.Date;
import com.mybatisflex.annotation.InsertListener;
import cn.hutool.core.util.ObjectUtil;
import cn.lovecto.yuen.common.utils.LoginUtils;
import cn.lovecto.yuen.framework.mybatisflex.domain.FlexBaseEntity;
/**
*
* @ClassName: FlexInsertListener
* @Description: 插入数据监听
* @author Jun.Yang 24696026@qq.com
* @date 2025年12月24日 下午6:10:50
*
*/
public class FlexInsertListener implements InsertListener{
/**
* 插入时填充时间、创建人等信息
*/
@Override
public void onInsert(Object entity) {
if(ObjectUtil.isNull(entity)) {
return;
}
if(!(entity instanceof FlexBaseEntity)) {
return;
}
FlexBaseEntity fe = (FlexBaseEntity)entity;
Date now = new Date();
fe.setCreateTime(now);
fe.setUpdateTime(now);
if(ObjectUtil.isNull(fe.getCreater())) {
fe.setCreater(LoginUtils.getLoginUserId());
}
}
}
修改数据时自动填充
package cn.lovecto.yuen.framework.mybatisflex.listener;
import java.util.Date;
import com.mybatisflex.annotation.UpdateListener;
import cn.hutool.core.util.ObjectUtil;
import cn.lovecto.yuen.common.utils.LoginUtils;
import cn.lovecto.yuen.framework.mybatisflex.domain.FlexBaseEntity;
/**
*
* @ClassName: FlexUpdateListener
* @Description: 修改时监听
* @author Jun.Yang 24696026@qq.com
* @date 2025年12月24日 下午6:16:24
*
*/
public class FlexUpdateListener implements UpdateListener{
@Override
public void onUpdate(Object entity) {
if(ObjectUtil.isNull(entity)) {
return;
}
if(!(entity instanceof FlexBaseEntity)) {
return;
}
FlexBaseEntity fe = (FlexBaseEntity)entity;
Date now = new Date();
fe.setUpdateTime(now);
if(ObjectUtil.isNull(fe.getUpdater())) {
fe.setUpdater(LoginUtils.getLoginUserId());
}
}
}
LoveCTO

