热爱技术,追求卓越
不断求索,精益求精

【17】引入MyBatis-Flex

从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());
		}
	}

}
赞(0)
未经允许不得转载:LoveCTO » 【17】引入MyBatis-Flex

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

热爱技术 追求卓越 精益求精