mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-06 16:48:24 +08:00
add: 添加主键生成的全局配置,可以不用为每个 entity 单独配置
This commit is contained in:
parent
19bf420627
commit
d20475480f
@ -29,7 +29,7 @@ public @interface Id {
|
||||
*
|
||||
* @return 生成策略
|
||||
*/
|
||||
KeyType keyType() default KeyType.Auto;
|
||||
KeyType keyType() default KeyType.None;
|
||||
|
||||
/**
|
||||
* 若 keyType 类型是 sequence, value 则代表的是
|
||||
|
||||
@ -16,6 +16,8 @@
|
||||
package com.mybatisflex.core;
|
||||
|
||||
import com.mybatisflex.core.dialect.DbType;
|
||||
import com.mybatisflex.core.enums.KeyType;
|
||||
import org.apache.ibatis.session.Configuration;
|
||||
import org.apache.ibatis.session.SqlSessionFactory;
|
||||
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
@ -36,6 +38,12 @@ public class FlexGlobalConfig {
|
||||
private SqlSessionFactory sqlSessionFactory;
|
||||
|
||||
|
||||
/**
|
||||
* 全局的 ID 生成策略配置,当 @Id 未配置 或者 配置 KeyType 为 None 时
|
||||
* 使用当前全局配置
|
||||
*/
|
||||
private KeyConfig keyConfig;
|
||||
|
||||
|
||||
public DbType getDbType() {
|
||||
return dbType;
|
||||
@ -53,6 +61,47 @@ public class FlexGlobalConfig {
|
||||
this.sqlSessionFactory = sqlSessionFactory;
|
||||
}
|
||||
|
||||
public KeyConfig getKeyConfig() {
|
||||
return keyConfig;
|
||||
}
|
||||
|
||||
public void setKeyConfig(KeyConfig keyConfig) {
|
||||
this.keyConfig = keyConfig;
|
||||
}
|
||||
|
||||
/**
|
||||
* 对应的是 注解 {@link com.mybatisflex.annotation.Id} 的配置
|
||||
*/
|
||||
public static class KeyConfig {
|
||||
private KeyType keyType;
|
||||
private String value;
|
||||
private boolean before = true;
|
||||
|
||||
public KeyType getKeyType() {
|
||||
return keyType;
|
||||
}
|
||||
|
||||
public void setKeyType(KeyType keyType) {
|
||||
this.keyType = keyType;
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public void setValue(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public boolean isBefore() {
|
||||
return before;
|
||||
}
|
||||
|
||||
public void setBefore(boolean before) {
|
||||
this.before = before;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/////static factory methods/////
|
||||
private static ConcurrentHashMap<String, FlexGlobalConfig> globalConfigs = new ConcurrentHashMap();
|
||||
@ -66,6 +115,10 @@ public class FlexGlobalConfig {
|
||||
defaultConfig = config;
|
||||
}
|
||||
|
||||
public static FlexGlobalConfig getConfig(Configuration configuration) {
|
||||
return globalConfigs.get(configuration.getEnvironment().getId());
|
||||
}
|
||||
|
||||
public static FlexGlobalConfig getConfig(String environmentId) {
|
||||
return globalConfigs.get(environmentId);
|
||||
}
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
package com.mybatisflex.core.key;
|
||||
|
||||
import com.mybatisflex.core.FlexConsts;
|
||||
import com.mybatisflex.core.FlexGlobalConfig;
|
||||
import com.mybatisflex.core.exception.FlexExceptions;
|
||||
import com.mybatisflex.core.table.IdInfo;
|
||||
import com.mybatisflex.core.table.TableInfo;
|
||||
@ -44,7 +45,9 @@ public class CustomKeyGenerator implements KeyGenerator {
|
||||
|
||||
public CustomKeyGenerator(Configuration configuration, TableInfo tableInfo, IdInfo idInfo) {
|
||||
this.configuration = configuration;
|
||||
this.keyGenerator = KeyGeneratorFactory.getKeyGenerator(idInfo.getValue());
|
||||
FlexGlobalConfig.KeyConfig globalKeyConfig = FlexGlobalConfig.getConfig(configuration).getKeyConfig();
|
||||
String keyValue = MybatisKeyGeneratorUtil.getKeyValue(idInfo, globalKeyConfig);
|
||||
this.keyGenerator = KeyGeneratorFactory.getKeyGenerator(keyValue);
|
||||
this.tableInfo = tableInfo;
|
||||
this.idInfo = idInfo;
|
||||
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
package com.mybatisflex.core.key;
|
||||
|
||||
import com.mybatisflex.core.FlexConsts;
|
||||
import com.mybatisflex.core.FlexGlobalConfig;
|
||||
import com.mybatisflex.core.enums.KeyType;
|
||||
import com.mybatisflex.core.exception.FlexExceptions;
|
||||
import com.mybatisflex.core.table.IdInfo;
|
||||
@ -53,22 +54,25 @@ public class MybatisKeyGeneratorUtil {
|
||||
|
||||
|
||||
public static KeyGenerator createIdKeyGenerator(TableInfo tableInfo, MappedStatement ms, IdInfo idInfo) {
|
||||
if (idInfo.getKeyType() == KeyType.None) {
|
||||
FlexGlobalConfig.KeyConfig globalKeyConfig = FlexGlobalConfig.getConfig(ms.getConfiguration()).getKeyConfig();
|
||||
KeyType keyType = getKeyType(idInfo, globalKeyConfig);
|
||||
|
||||
if (keyType == KeyType.None) {
|
||||
return NoKeyGenerator.INSTANCE;
|
||||
}
|
||||
|
||||
//自增主键
|
||||
if (idInfo.getKeyType() == KeyType.Auto) {
|
||||
if (keyType == KeyType.Auto) {
|
||||
return Jdbc3KeyGenerator.INSTANCE;
|
||||
}
|
||||
|
||||
//通过 java 生成的主键
|
||||
if (idInfo.getKeyType() == KeyType.Generator) {
|
||||
if (keyType == KeyType.Generator) {
|
||||
return new CustomKeyGenerator(ms.getConfiguration(), tableInfo, idInfo);
|
||||
}
|
||||
|
||||
//通过序列生成的注解
|
||||
String sequence = idInfo.getValue();
|
||||
String sequence = getKeyValue(idInfo, globalKeyConfig);
|
||||
if (StringUtil.isBlank(sequence)) {
|
||||
throw FlexExceptions.wrap("please config @Id(value=\"...\") for field: %s in class: %s"
|
||||
, idInfo.getProperty()
|
||||
@ -103,8 +107,7 @@ public class MybatisKeyGeneratorUtil {
|
||||
//因为只有在 xml 解析的时候,才可能存在多一个 MappedStatement 拥有同一个 keyGenerator 的情况
|
||||
//当前每个方法都拥有一个自己的 keyGenerator 了,没必要添加
|
||||
//this.addKeyGenerator(selectId, keyGenerator);
|
||||
|
||||
return new SelectKeyGenerator(keyMappedStatement, idInfo.isBefore());
|
||||
return new SelectKeyGenerator(keyMappedStatement, isKeyBefore(idInfo, globalKeyConfig));
|
||||
}
|
||||
|
||||
|
||||
@ -115,4 +118,40 @@ public class MybatisKeyGeneratorUtil {
|
||||
return Arrays.asList(resultMap);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取主键的 keyType,优先通过 @id 获取,获取不到通过全局配置获取
|
||||
*/
|
||||
public static KeyType getKeyType(IdInfo idInfo, FlexGlobalConfig.KeyConfig keyConfig) {
|
||||
KeyType keyType = idInfo.getKeyType();
|
||||
if (keyType != KeyType.None) {
|
||||
return keyType;
|
||||
}
|
||||
|
||||
if (keyConfig != null) {
|
||||
return keyConfig.getKeyType();
|
||||
}
|
||||
|
||||
return keyType;
|
||||
}
|
||||
|
||||
|
||||
public static String getKeyValue(IdInfo idInfo, FlexGlobalConfig.KeyConfig keyConfig) {
|
||||
String value = idInfo.getValue();
|
||||
if (StringUtil.isBlank(value)) {
|
||||
value = keyConfig.getValue();
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
public static boolean isKeyBefore(IdInfo idInfo, FlexGlobalConfig.KeyConfig keyConfig) {
|
||||
Boolean before = idInfo.getBefore();
|
||||
if (before == null) {
|
||||
return keyConfig.isBefore();
|
||||
} else {
|
||||
return before;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -38,7 +38,7 @@ public class RowMapperInvoker {
|
||||
|
||||
public RowMapperInvoker(SqlSessionFactory sqlSessionFactory) {
|
||||
this.sqlSessionFactory = sqlSessionFactory;
|
||||
this.dbType = FlexGlobalConfig.getConfig(sqlSessionFactory.getConfiguration().getEnvironment().getId()).getDbType();
|
||||
this.dbType = FlexGlobalConfig.getConfig(sqlSessionFactory.getConfiguration()).getDbType();
|
||||
}
|
||||
|
||||
public RowSessionManager getRowSessionManager() {
|
||||
|
||||
@ -23,7 +23,7 @@ public class IdInfo extends ColumnInfo {
|
||||
/**
|
||||
* id 生成策略
|
||||
*/
|
||||
private KeyType keyType;
|
||||
private KeyType keyType = KeyType.None;
|
||||
|
||||
/**
|
||||
* 若 keyType 类型是 sequence, value 则代表的是
|
||||
@ -40,7 +40,7 @@ public class IdInfo extends ColumnInfo {
|
||||
*
|
||||
* @see org.apache.ibatis.executor.keygen.SelectKeyGenerator
|
||||
*/
|
||||
private boolean before;
|
||||
private Boolean before;
|
||||
|
||||
|
||||
public IdInfo(ColumnInfo columnInfo) {
|
||||
@ -81,11 +81,11 @@ public class IdInfo extends ColumnInfo {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public boolean isBefore() {
|
||||
public Boolean getBefore() {
|
||||
return before;
|
||||
}
|
||||
|
||||
public void setBefore(boolean before) {
|
||||
public void setBefore(Boolean before) {
|
||||
this.before = before;
|
||||
}
|
||||
}
|
||||
|
||||
@ -228,7 +228,7 @@ public class TableInfo {
|
||||
IdInfo idInfo = primaryKeyList.get(i);
|
||||
primaryKeys[i] = idInfo.getColumn();
|
||||
|
||||
if (idInfo.getKeyType() != KeyType.Auto && idInfo.isBefore()) {
|
||||
if (idInfo.getKeyType() != KeyType.Auto || (idInfo.getBefore() != null && idInfo.getBefore())) {
|
||||
insertIdFields.add(idInfo.getColumn());
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user