Skip to content

Commit 5d8f7af

Browse files
committed
JDBC类型的主键策略可以配置多个,就相当于keyProperties="id1,id2..."
1 parent 5ce9dd3 commit 5d8f7af

File tree

3 files changed

+69
-16
lines changed

3 files changed

+69
-16
lines changed

src/main/java/com/github/abel533/mapper/MapperProvider.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,17 +156,21 @@ public SqlNode insert(MappedStatement ms) {
156156
//序列的情况,直接写入sql中,不需要额外的获取值
157157
if (column.getSequenceName() != null && column.getSequenceName().length() > 0) {
158158
} else if (column.isIdentity()) {
159+
//这种情况下,如果原先的字段有值,需要先缓存起来,否则就一定会使用自动增长
160+
//这是一个bind节点
161+
sqlNodes.add(new VarDeclSqlNode(column.getProperty() + "_cache", column.getProperty()));
159162
//如果是Identity列,就需要插入selectKey
160163
//如果已经存在Identity列,抛出异常
161164
if (hasIdentityKey) {
165+
//jdbc类型只需要添加一次
166+
if (column.getGenerator() != null && column.getGenerator().equals("JDBC")) {
167+
continue;
168+
}
162169
throw new RuntimeException(ms.getId() + "对应的实体类" + entityClass.getCanonicalName() + "中包含多个MySql的自动增长列,最多只能有一个!");
163170
}
164171
//插入selectKey
165172
newSelectKeyMappedStatement(ms, column);
166173
hasIdentityKey = true;
167-
//这种情况下,如果原先的字段有值,需要先缓存起来,否则就一定会使用自动增长
168-
//这是一个bind节点
169-
sqlNodes.add(new VarDeclSqlNode(column.getProperty() + "_cache", column.getProperty()));
170174
} else if (column.isUuid()) {
171175
//uuid的情况,直接插入bind节点
172176
sqlNodes.add(new VarDeclSqlNode(column.getProperty() + "_bind", getUUID()));
@@ -226,16 +230,20 @@ public SqlNode insertSelective(MappedStatement ms) {
226230
//直接将列加进去
227231
ifNodes.add(new StaticTextSqlNode(column.getColumn() + ","));
228232
} else if (column.isIdentity()) {
233+
//这种情况下,如果原先的字段有值,需要先缓存起来,否则就一定会使用自动增长
234+
sqlNodes.add(new VarDeclSqlNode(column.getProperty() + "_cache", column.getProperty()));
229235
if (hasIdentityKey) {
236+
//jdbc类型只需要添加一次
237+
if (column.getGenerator() != null && column.getGenerator().equals("JDBC")) {
238+
continue;
239+
}
230240
throw new RuntimeException(ms.getId() + "对应的实体类" + entityClass.getCanonicalName() + "中包含多个MySql的自动增长列,最多只能有一个!");
231241
}
232242
//新增一个selectKey-MS
233243
newSelectKeyMappedStatement(ms, column);
234244
hasIdentityKey = true;
235245
//加入该列
236246
ifNodes.add(new StaticTextSqlNode(column.getColumn() + ","));
237-
//这种情况下,如果原先的字段有值,需要先缓存起来,否则就一定会使用自动增长
238-
sqlNodes.add(new VarDeclSqlNode(column.getProperty() + "_cache", column.getProperty()));
239247
} else if (column.isUuid()) {
240248
//将UUID的值加入bind节点
241249
sqlNodes.add(new VarDeclSqlNode(column.getProperty() + "_bind", getUUID()));

src/main/java/com/github/abel533/mapperhelper/EntityHelper.java

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ public static class EntityTable {
5656
private Set<EntityColumn> entityClassPKColumns;
5757
//字段名和属性名的映射
5858
private Map<String, String> aliasMap;
59+
//useGenerator包含多列的时候需要用到
60+
private List<String> keyProperties;
61+
private List<String> keyColumns;
5962

6063
public void setTable(Table table) {
6164
this.name = table.name();
@@ -96,12 +99,45 @@ public Set<EntityColumn> getEntityClassPKColumns() {
9699
public Map<String, String> getAliasMap() {
97100
return aliasMap;
98101
}
102+
103+
public String[] getKeyProperties() {
104+
if (keyProperties != null && keyProperties.size() > 0) {
105+
return keyProperties.toArray(new String[]{});
106+
}
107+
return new String[]{};
108+
}
109+
110+
public void setKeyProperties(String keyProperty) {
111+
if (this.keyProperties == null) {
112+
this.keyProperties = new ArrayList<String>();
113+
this.keyProperties.add(keyProperty);
114+
} else {
115+
this.keyProperties.add(keyProperty);
116+
}
117+
}
118+
119+
public String[] getKeyColumns() {
120+
if (keyColumns != null && keyColumns.size() > 0) {
121+
return keyColumns.toArray(new String[]{});
122+
}
123+
return new String[]{};
124+
}
125+
126+
public void setKeyColumns(String keyColumn) {
127+
if (this.keyColumns == null) {
128+
this.keyColumns = new ArrayList<String>();
129+
this.keyColumns.add(keyColumn);
130+
} else {
131+
this.keyColumns.add(keyColumn);
132+
}
133+
}
99134
}
100135

101136
/**
102137
* 实体字段对应数据库列的信息
103138
*/
104139
public static class EntityColumn {
140+
private EntityTable table;
105141
private String property;
106142
private String column;
107143
private Class<?> javaType;
@@ -110,9 +146,23 @@ public static class EntityColumn {
110146
private boolean uuid = false;
111147
private boolean identity = false;
112148
private String generator;
113-
private String keyProperties;//useGenerator包含多列的时候需要用到
114149
private String orderBy;
115150

151+
public EntityColumn() {
152+
}
153+
154+
public EntityColumn(EntityTable table) {
155+
this.table = table;
156+
}
157+
158+
public EntityTable getTable() {
159+
return table;
160+
}
161+
162+
public void setTable(EntityTable table) {
163+
this.table = table;
164+
}
165+
116166
public String getProperty() {
117167
return property;
118168
}
@@ -177,14 +227,6 @@ public void setGenerator(String generator) {
177227
this.generator = generator;
178228
}
179229

180-
public String getKeyProperties() {
181-
return keyProperties;
182-
}
183-
184-
public void setKeyProperties(String keyProperties) {
185-
this.keyProperties = keyProperties;
186-
}
187-
188230
public String getOrderBy() {
189231
return orderBy;
190232
}
@@ -398,7 +440,7 @@ public static synchronized void initEntityNameMap(Class<?> entityClass) {
398440
if (field.isAnnotationPresent(Transient.class)) {
399441
continue;
400442
}
401-
EntityColumn entityColumn = new EntityColumn();
443+
EntityColumn entityColumn = new EntityColumn(entityTable);
402444
if (field.isAnnotationPresent(Id.class)) {
403445
entityColumn.setId(true);
404446
}
@@ -436,6 +478,8 @@ public static synchronized void initEntityNameMap(Class<?> entityClass) {
436478
} else if (generatedValue.generator().equals("JDBC")) {
437479
entityColumn.setIdentity(true);
438480
entityColumn.setGenerator("JDBC");
481+
entityTable.setKeyProperties(entityColumn.getProperty());
482+
entityTable.setKeyColumns(entityColumn.getColumn());
439483
} else {
440484
//允许通过generator来设置获取id的sql,例如mysql=CALL IDENTITY(),hsqldb=SELECT SCOPE_IDENTITY()
441485
//允许通过拦截器参数设置公共的generator

src/main/java/com/github/abel533/mapperhelper/MapperTemplate.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,8 @@ protected void newSelectKeyMappedStatement(MappedStatement ms, EntityHelper.Enti
449449
try {
450450
MetaObject msObject = forObject(ms);
451451
msObject.setValue("keyGenerator", keyGenerator);
452-
msObject.setValue("keyProperties", new String[]{column.getProperty()});
452+
msObject.setValue("keyProperties", column.getTable().getKeyProperties());
453+
msObject.setValue("keyColumns", column.getTable().getKeyColumns());
453454
} catch (Exception e) {
454455
//ignore
455456
}

0 commit comments

Comments
 (0)