项⽬集成seata和mybatis-plus冲突问题解决⽅案:(分页插件
失效,⾃动填充失效。。。
项⽬集成seata和mybatis-plus,seata与mybatis-plus冲突问题(所有插件失效,⾃动填充失效,不到mapper⽂件解决⽅案)
⾃动填充代码:
package batis.handler;
import date.DateUtil;
import handlers.MetaObjectHandler;
import org.flection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MyBatisMetaObjectHandler implements MetaObjectHandler {
/**
* ⾃定义插⼊时填充规则
*/
@Override
public void insertFill(MetaObject metaObject) {
// 注意是类属性字段名称,不是表字段名称
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("delFlag", 0, metaObject);
}
/**
* ⾃定义更新时填充规则
*/
@Override
public void updateFill(MetaObject metaObject) {
String now = w();
// 注意是类属性字段名称,不是表字段名称
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
id⽣成器代码:
package fig;
import java.util.Date;
import java.util.UUID;
/**
* compressed id generator, result id not great than 53bits before 2318-06-04.
*/
public class IdGenerator {
private static IdGenerator instance = new IdGenerator(0);
public static IdGenerator initDefaultInstance(int machineId) {
instance = new IdGenerator(machineId);
return instance;
}
public static IdGenerator getInstance() {
return instance;
}
public static long generateId() {
Id();
}
// total bits=53(max 2^53-1:9007199254740992-1)
// private final static long TIME_BIT = 40; // max: 2318-06-04
private final static long MACHINE_BIT = 5; // max 31
private final static long SEQUENCE_BIT = 8; // 256/10ms
/**
* mask/max value
*/
private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);
private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);
private final static long MACHINE_LEFT = SEQUENCE_BIT;
private final static long TIMESTMP_LEFT = MACHINE_BIT + SEQUENCE_BIT;
private long machineId;
private long sequence = 0L;
private long lastStmp = -1L;
private IdGenerator(long machineId) {
if (machineId > MAX_MACHINE_NUM || machineId < 0) {
throw new IllegalArgumentException(
"machineId can't be greater than " + MAX_MACHINE_NUM + " or less than 0");        }
this.machineId = machineId;
}
/**
* generate new ID
*
* @return
*/
public synchronized long nextId() {
long currStmp = getTimestamp();
if (currStmp < lastStmp) {
throw new RuntimeException("Clock moved backwards.  Refusing to generate id");        }
if (currStmp == lastStmp) {
sequence = (sequence + 1) & MAX_SEQUENCE;
if (sequence == 0L) {
currStmp = getNextTimestamp();
}
} else {
sequence = 0L;
}
lastStmp = currStmp;
return currStmp << TIMESTMP_LEFT //
| machineId << MACHINE_LEFT //
| sequence;
}
private long getNextTimestamp() {
long mill = getTimestamp();
while (mill <= lastStmp) {
mill = getTimestamp();
}
return mill;
}
private long getTimestamp() {
// per 10ms
return System.currentTimeMillis() / 10;// 10ms
}
public static Date parseIdTimestamp(long id) {
return new Date((id >>> TIMESTMP_LEFT) * 10);
}
public static String uuid() {
return UUID.randomUUID().toString().replaceAll("-", "");
}
}
package fig;
import incrementer.IdentifierGenerator;
import org.springframework.stereotype.Component;
@Component
public class CustomerIdGenerator implements IdentifierGenerator {
@Override
public Long nextId(Object entity) {
// 填充⾃⼰的Id⽣成器,
ateId();
}
}
具体代理配置:
package com.fig;
import com.alibaba.druid.pool.DruidDataSource;
import batisplus.annotation.DbType;
import batisplus.autoconfigure.MybatisPlusProperties;
import MybatisConfiguration;
import fig.GlobalConfig;
import sion.plugins.MybatisPlusInterceptor;
import sion.plugins.inner.PaginationInnerInterceptor;
import sion.spring.MybatisSqlSessionFactoryBean;
import fig.CustomerIdGenerator;
import batis.handler.MyBatisMetaObjectHandler;
import datasource.DataSourceProxy;
ansaction.SpringManagedTransactionFactory;
import org.t.properties.ConfigurationProperties;
import org.t.properties.EnableConfigurationProperties;
import t.annotation.Bean;分页查询插件
import t.annotation.Configuration;
import t.annotation.Primary;
import io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
import java.io.IOException;
@Configuration
@EnableConfigurationProperties({MybatisPlusProperties.class})
public class DataSourcesProxyConfig {
//⾃动填充注⼊
@Bean
public MyBatisMetaObjectHandler myBatisMetaObjectHandler() {
return new MyBatisMetaObjectHandler();
}
//id⽣成器注⼊
@Bean
public CustomerIdGenerator customerIdGenerator() {
return new CustomerIdGenerator();
}
//获取数据源
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource() {
return new DruidDataSource();
}
//配种数据源
@Primary//@Primary标识必须配置在代码数据源上,否则本地事务失效
@Bean
public DataSourceProxy dataSourceProxy(DataSource druidDataSource) {
return new DataSourceProxy(druidDataSource);
}
private MybatisPlusProperties properties;
public DataSourcesProxyConfig(MybatisPlusProperties properties) {
this.properties = properties;
}
//配置mybatisplus的数据源,所有插件会失效,所以注⼊进来,配置给代理数据源
@Bean
public MybatisSqlSessionFactoryBean sqlSessionFactory(DataSourceProxy dataSourceProxy) throws Exception { // 这⾥必须⽤ MybatisSqlSessionFactoryBean 代替了 SqlSessionFactoryBean,否则 MyBatisPlus 不会⽣效
MybatisSqlSessionFactoryBean sqlBean = new MybatisSqlSessionFactoryBean();
sqlBean.setDataSource(dataSourceProxy);
sqlBean.setTransactionFactory(new SpringManagedTransactionFactory());
try {
//注意:这个如果写的有sql,须有该配置,try cach以下,打开不捕获异常的化,没sql会报错
sqlBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:/mapper/**/*.xml"));
} catch (IOException ignored) {
}
MybatisConfiguration configuration = Configuration();
if (configuration == null) {
configuration = new MybatisConfiguration();
}
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//向代理数据源添加分页
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
sqlBean.setPlugins(interceptor);
//代理数据源添加id⽣成器,字段⾃动填充
sqlBean.setGlobalConfig(new GlobalConfig()
.setMetaObjectHandler(myBatisMetaObjectHandler())                .setIdentifierGenerator(customerIdGenerator()));
sqlBean.setConfiguration(configuration);
return sqlBean;
}
}
关于seata服务端和客户端集成配置,可以看另⼀篇⽂章!