最近接手一个项目从gaussDB转到oracle。需要自增主键。但是oracle不支持自动递增,只能通过序列。同时如果所有PO上加@KeySequence又会很麻烦。
经过查看源码发现,MybatisPlus设置TableInfo在
public abstract class AbstractSqlInjector implements ISqlInjector {
private static final Log logger = LogFactory.getLog(AbstractSqlInjector.class);
@Override
public void inspectInject(MapperBuilderAssistant builderAssistant, Class<?> mapperClass) {
Class<?> modelClass = extractModelClass(mapperClass);
if (modelClass != null) {
String className = mapperClass.toString();
Set<String> mapperRegistryCache = GlobalConfigUtils.getMapperRegistryCache(builderAssistant.getConfiguration());
if (!mapperRegistryCache.contains(className)) {
List<AbstractMethod> methodList = this.getMethodList(mapperClass);
if (CollectionUtils.isNotEmpty(methodList)) {
TableInfo tableInfo = TableInfoHelper.initTableInfo(builderAssistant, modelClass);
// 循环注入自定义方法
methodList.forEach(m -> m.inject(builderAssistant, mapperClass, modelClass, tableInfo));
} else {
logger.debug(mapperClass.toString() + ", No effective injection method was found.");
}
mapperRegistryCache.add(className);
}
}
}
}
查看其上层,发现可以经过
GlobalConfig
来配置。
所以可以对其进行扩展。
首先创建Oracle序列
create sequence spc start with 1;
1.创建类 BasePO
@KeySequence(value = "spc")
public class BasePO {
}
2.扩展AbstractSqlInjector
@Slf4j
public class SpcSqlInjector extends AbstractSqlInjector {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
return Stream.of(
new Insert(),
new Delete(),
new DeleteByMap(),
new DeleteById(),
new DeleteBatchByIds(),
new Update(),
new UpdateById(),
new SelectById(),
new SelectBatchByIds(),
new SelectByMap(),
new SelectOne(),
new SelectCount(),
new SelectMaps(),
new SelectMapsPage(),
new SelectObjs(),
new SelectList(),
new SelectPage()
).collect(toList());
}
@Override
public void inspectInject(MapperBuilderAssistant builderAssistant, Class<?> mapperClass) {
KeySequence baseKeySeq = BasePO.class.getDeclaredAnnotation(KeySequence.class);
Class<?> modelClass = extractModelClass(mapperClass);
if (modelClass != null) {
String className = mapperClass.toString();
Set<String> mapperRegistryCache = GlobalConfigUtils.getMapperRegistryCache(builderAssistant.getConfiguration());
if (!mapperRegistryCache.contains(className)) {
List<AbstractMethod> methodList = this.getMethodList(mapperClass);
if (CollectionUtils.isNotEmpty(methodList)) {
TableInfo tableInfo = TableInfoHelper.initTableInfo(builderAssistant, modelClass);
try {
Field keySequenceField = tableInfo.getClass().getDeclaredField("keySequence");
keySequenceField.setAccessible(true);
keySequenceField.set(tableInfo, baseKeySeq);
log.info("class name:【{}】 sequenceName:【{}】", mapperClass.getName(), tableInfo.getKeySequence().value());
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
// 循环注入自定义方法
methodList.forEach(m -> m.inject(builderAssistant, mapperClass, modelClass, tableInfo));
} else {
log.debug(mapperClass.toString() + ", No effective injection method was found.");
}
mapperRegistryCache.add(className);
}
}
}
}
3.创建Bean
@Bean
public SpcSqlInjector spcSqlInjector(){
return new SpcSqlInjector();
}
完成。
当然也可以把所有PO都继承BasePO,不过这样和所有类上加注解一样麻烦了。