Skip to content

Commit 0090c4d

Browse files
committed
支持动态表名。
1 parent 9fe8926 commit 0090c4d

16 files changed

+244
-92
lines changed

src/main/java/tk/mybatis/mapper/mapperhelper/EntityHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public static String getPrimaryKeyWhere(Class<?> entityClass) {
165165
Set<EntityColumn> entityColumns = getPKColumns(entityClass);
166166
StringBuilder whereBuilder = new StringBuilder();
167167
for (EntityColumn column : entityColumns) {
168-
whereBuilder.append(column.getColumn()).append(" = ?").append(" AND ");
168+
whereBuilder.append(column.getColumn()).append(" = #{").append(column.getProperty()).append("} AND ");
169169
}
170170
return whereBuilder.substring(0, whereBuilder.length() - 4);
171171
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package tk.mybatis.mapper.mapperhelper;
2+
3+
/**
4+
* 实现动态表名时,实体类实现该接口
5+
*
6+
* @author liuzh
7+
* @since 2015-10-28 22:20
8+
*/
9+
public interface IDynamicTableName {
10+
11+
/**
12+
* 获取动态表名 - 这个方法是关键,只要有返回值,不是null和'',就会用返回值作为表名
13+
*
14+
* @return
15+
*/
16+
String getDynamicTableName();
17+
18+
/**
19+
* 设置动态表名 - 这个方法没有绝对的作用,仅仅是为了和上面的get方法配套
20+
*
21+
* @param dynamicTableName
22+
*/
23+
void setDynamicTableName(String dynamicTableName);
24+
}

src/main/java/tk/mybatis/mapper/mapperhelper/MapperTemplate.java

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,80 @@ protected String tableName(Class<?> entityClass) {
332332
return entityTable.getName();
333333
}
334334

335+
/**
336+
* 获取表名 - 支持动态表名
337+
*
338+
* @param entityClass
339+
* @return
340+
*/
341+
protected SqlNode getDynamicTableNameNode(Class<?> entityClass) {
342+
if (IDynamicTableName.class.isAssignableFrom(entityClass)) {
343+
List<SqlNode> ifSqlNodes = new ArrayList<SqlNode>();
344+
ifSqlNodes.add(new IfSqlNode(new TextSqlNode("${dynamicTableName}"), "@tk.mybatis.mapper.util.OGNL@isDynamicParameter(_parameter) and dynamicTableName != null and dynamicTableName != ''"));
345+
ifSqlNodes.add(new IfSqlNode(new StaticTextSqlNode(tableName(entityClass)), "@tk.mybatis.mapper.util.OGNL@isNotDynamicParameter(_parameter) or dynamicTableName == null or dynamicTableName == ''"));
346+
return new MixedSqlNode(ifSqlNodes);
347+
} else {
348+
return new StaticTextSqlNode(tableName(entityClass));
349+
}
350+
}
351+
352+
/**
353+
* 获取表名 - 支持动态表名,该方法用于多个入参时,通过parameterName指定入参中实体类的@Param的注解值
354+
*
355+
* @param entityClass
356+
* @param parameterName
357+
* @return
358+
*/
359+
protected SqlNode getDynamicTableNameNode(Class<?> entityClass, String parameterName) {
360+
if (IDynamicTableName.class.isAssignableFrom(entityClass)) {
361+
List<SqlNode> ifSqlNodes = new ArrayList<SqlNode>();
362+
ifSqlNodes.add(new IfSqlNode(new TextSqlNode("${" + parameterName + ".dynamicTableName}"), "@tk.mybatis.mapper.util.OGNL@isDynamicParameter(" + parameterName + ") and " + parameterName + ".dynamicTableName != null and " + parameterName + ".dynamicTableName != ''"));
363+
ifSqlNodes.add(new IfSqlNode(new StaticTextSqlNode(tableName(entityClass)), "@tk.mybatis.mapper.util.OGNL@isNotDynamicParameter(" + parameterName + ") or " + parameterName + ".dynamicTableName == null or " + parameterName + ".dynamicTableName == ''"));
364+
return new MixedSqlNode(ifSqlNodes);
365+
} else {
366+
return new StaticTextSqlNode(tableName(entityClass));
367+
}
368+
}
369+
370+
/**
371+
* 获取表名 - 支持动态表名
372+
*
373+
* @param entityClass
374+
* @return
375+
*/
376+
protected String getDynamicTableName(Class<?> entityClass) {
377+
if (IDynamicTableName.class.isAssignableFrom(entityClass)) {
378+
return "<if test=\"@tk.mybatis.mapper.util.OGNL@isDynamicParameter(_parameter) and dynamicTableName != null and dynamicTableName != ''\">\n" +
379+
"${dynamicTableName}\n" +
380+
"</if>\n" +
381+
"<if test=\"@tk.mybatis.mapper.util.OGNL@isNotDynamicParameter(_parameter) or dynamicTableName == null or dynamicTableName == ''\">\n" +
382+
tableName(entityClass) + "\n" +
383+
"</if>";
384+
} else {
385+
return tableName(entityClass);
386+
}
387+
}
388+
389+
/**
390+
* 获取表名 - 支持动态表名,该方法用于多个入参时,通过parameterName指定入参中实体类的@Param的注解值
391+
*
392+
* @param entityClass
393+
* @param parameterName
394+
* @return
395+
*/
396+
protected String getDynamicTableName(Class<?> entityClass, String parameterName) {
397+
if (IDynamicTableName.class.isAssignableFrom(entityClass)) {
398+
return "<if test=\"@tk.mybatis.mapper.util.OGNL@isDynamicParameter(" + parameterName + ") and " + parameterName + ".dynamicTableName != null and " + parameterName + ".dynamicTableName != ''\">\n" +
399+
"${" + parameterName + ".dynamicTableName}\n" +
400+
"</if>\n" +
401+
"<if test=\"@tk.mybatis.mapper.util.OGNL@isNotDynamicParameter(" + parameterName + ") or " + parameterName + ".dynamicTableName == null or " + parameterName + ".dynamicTableName == ''\">\n" +
402+
tableName(entityClass) + "\n" +
403+
"</if>";
404+
} else {
405+
return tableName(entityClass);
406+
}
407+
}
408+
335409
/**
336410
* 返回if条件的sqlNode
337411
* <p>一般类型:<code>&lt;if test="property!=null"&gt;columnNode&lt;/if&gt;</code></p>

src/main/java/tk/mybatis/mapper/provider/ExampleProvider.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ public SqlNode selectCountByExample(MappedStatement ms) {
5757

5858
List<SqlNode> sqlNodes = new LinkedList<SqlNode>();
5959
//静态的sql部分:select column ... from table
60-
sqlNodes.add(new StaticTextSqlNode("SELECT COUNT(*) FROM " + tableName(entityClass)));
60+
sqlNodes.add(new StaticTextSqlNode("SELECT COUNT(*) FROM "));
61+
sqlNodes.add(getDynamicTableNameNode(entityClass));
62+
6163
IfSqlNode ifNullSqlNode = new IfSqlNode(exampleWhereClause(ms.getConfiguration()), "_parameter != null");
6264
sqlNodes.add(ifNullSqlNode);
6365
return new MixedSqlNode(sqlNodes);
@@ -74,7 +76,9 @@ public SqlNode deleteByExample(MappedStatement ms) {
7476

7577
List<SqlNode> sqlNodes = new LinkedList<SqlNode>();
7678
//静态的sql部分:select column ... from table
77-
sqlNodes.add(new StaticTextSqlNode("DELETE FROM " + tableName(entityClass)));
79+
sqlNodes.add(new StaticTextSqlNode("DELETE FROM "));
80+
sqlNodes.add(getDynamicTableNameNode(entityClass));
81+
7882
IfSqlNode ifNullSqlNode = new IfSqlNode(exampleWhereClause(ms.getConfiguration()), "_parameter != null");
7983
sqlNodes.add(ifNullSqlNode);
8084
return new MixedSqlNode(sqlNodes);
@@ -104,7 +108,9 @@ public SqlNode selectByExample(MappedStatement ms) {
104108
IfSqlNode ifNoSelectColumns = new IfSqlNode(new StaticTextSqlNode(EntityHelper.getSelectColumns(entityClass)), "@tk.mybatis.mapper.util.OGNL@hasNoSelectColumns(_parameter)");
105109
sqlNodes.add(ifNoSelectColumns);
106110

107-
sqlNodes.add(new StaticTextSqlNode(" FROM " + tableName(entityClass)));
111+
sqlNodes.add(new StaticTextSqlNode(" FROM "));
112+
sqlNodes.add(getDynamicTableNameNode(entityClass));
113+
108114
IfSqlNode ifNullSqlNode = new IfSqlNode(exampleWhereClause(ms.getConfiguration()), "_parameter != null");
109115
sqlNodes.add(ifNullSqlNode);
110116
IfSqlNode orderByClauseSqlNode = new IfSqlNode(new TextSqlNode("order by ${orderByClause}"), "orderByClause != null");
@@ -137,7 +143,9 @@ public SqlNode updateByExampleSelective(MappedStatement ms) {
137143
Class<?> entityClass = getSelectReturnType(ms);
138144
List<SqlNode> sqlNodes = new LinkedList<SqlNode>();
139145
//update table
140-
sqlNodes.add(new StaticTextSqlNode("UPDATE " + tableName(entityClass)));
146+
sqlNodes.add(new StaticTextSqlNode("UPDATE "));
147+
sqlNodes.add(getDynamicTableNameNode(entityClass, "record"));
148+
141149
//获取全部列
142150
Set<EntityColumn> columnList = EntityHelper.getColumns(entityClass);
143151
List<SqlNode> ifNodes = new LinkedList<SqlNode>();
@@ -165,7 +173,9 @@ public SqlNode updateByExample(MappedStatement ms) {
165173
Class<?> entityClass = getSelectReturnType(ms);
166174
List<SqlNode> sqlNodes = new LinkedList<SqlNode>();
167175
//update table
168-
sqlNodes.add(new StaticTextSqlNode("UPDATE " + tableName(entityClass)));
176+
sqlNodes.add(new StaticTextSqlNode("UPDATE "));
177+
sqlNodes.add(getDynamicTableNameNode(entityClass, "record"));
178+
169179
//获取全部列
170180
Set<EntityColumn> columnList = EntityHelper.getColumns(entityClass);
171181
List<SqlNode> setSqlNodes = new LinkedList<SqlNode>();

src/main/java/tk/mybatis/mapper/provider/SpecialProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public String insertList(MappedStatement ms) {
5353
//开始拼sql
5454
StringBuilder sql = new StringBuilder();
5555
sql.append("insert into ");
56-
sql.append(table.getName());
56+
sql.append(getDynamicTableName(entityClass));
5757
sql.append("(");
5858
boolean first = true;
5959
for (EntityColumn column : table.getEntityClassColumns()) {
@@ -96,7 +96,7 @@ public String insertUseGeneratedKeys(MappedStatement ms) {
9696
//开始拼sql
9797
StringBuilder sql = new StringBuilder();
9898
sql.append("insert into ");
99-
sql.append(table.getName());
99+
sql.append(getDynamicTableName(entityClass));
100100
sql.append("(");
101101
boolean first = true;
102102
for (EntityColumn column : table.getEntityClassColumns()) {

src/main/java/tk/mybatis/mapper/provider/SqlServerProvider.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public String insert(MappedStatement ms) {
5858
//开始拼sql
5959
StringBuilder sql = new StringBuilder();
6060
sql.append("insert into ");
61-
sql.append(table.getName());
61+
sql.append(getDynamicTableName(entityClass));
6262
sql.append("(");
6363
boolean first = true;
6464
for (EntityColumn column : table.getEntityClassColumns()) {
@@ -97,7 +97,9 @@ public SqlNode insertSelective(MappedStatement ms) {
9797
Class<?> entityClass = getSelectReturnType(ms);
9898
List<SqlNode> sqlNodes = new LinkedList<SqlNode>();
9999
//insert into table
100-
sqlNodes.add(new StaticTextSqlNode("INSERT INTO " + tableName(entityClass)));
100+
sqlNodes.add(new StaticTextSqlNode("INSERT INTO "));
101+
sqlNodes.add(getDynamicTableNameNode(entityClass));
102+
101103
//获取全部列
102104
Set<EntityColumn> columnList = EntityHelper.getColumns(entityClass);
103105
List<SqlNode> ifNodes = new LinkedList<SqlNode>();

src/main/java/tk/mybatis/mapper/provider/base/BaseDeleteProvider.java

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,7 @@
2424

2525
package tk.mybatis.mapper.provider.base;
2626

27-
import org.apache.ibatis.builder.StaticSqlSource;
28-
import org.apache.ibatis.jdbc.SQL;
2927
import org.apache.ibatis.mapping.MappedStatement;
30-
import org.apache.ibatis.mapping.ParameterMapping;
3128
import org.apache.ibatis.scripting.xmltags.MixedSqlNode;
3229
import org.apache.ibatis.scripting.xmltags.SqlNode;
3330
import org.apache.ibatis.scripting.xmltags.StaticTextSqlNode;
@@ -60,7 +57,8 @@ public SqlNode delete(MappedStatement ms) {
6057
Class<?> entityClass = getSelectReturnType(ms);
6158
List<SqlNode> sqlNodes = new LinkedList<SqlNode>();
6259
//delete from table
63-
sqlNodes.add(new StaticTextSqlNode("DELETE FROM " + tableName(entityClass)));
60+
sqlNodes.add(new StaticTextSqlNode("DELETE FROM "));
61+
sqlNodes.add(getDynamicTableNameNode(entityClass));
6462
//where/if判断条件
6563
sqlNodes.add(new WhereSqlNode(ms.getConfiguration(), getAllIfColumnNode(entityClass)));
6664
return new MixedSqlNode(sqlNodes);
@@ -71,19 +69,13 @@ public SqlNode delete(MappedStatement ms) {
7169
*
7270
* @param ms
7371
*/
74-
public void deleteByPrimaryKey(MappedStatement ms) {
72+
public String deleteByPrimaryKey(MappedStatement ms) {
7573
final Class<?> entityClass = getSelectReturnType(ms);
76-
List<ParameterMapping> parameterMappings = getPrimaryKeyParameterMappings(ms);
77-
//开始拼sql
78-
String sql = new SQL() {{
79-
//delete from table
80-
DELETE_FROM(tableName(entityClass));
81-
//where 主键=#{property} 条件
82-
WHERE(EntityHelper.getPrimaryKeyWhere(entityClass));
83-
}}.toString();
84-
//静态SqlSource
85-
StaticSqlSource sqlSource = new StaticSqlSource(ms.getConfiguration(), sql, parameterMappings);
86-
//替换原有的SqlSource
87-
setSqlSource(ms, sqlSource);
74+
StringBuilder sql = new StringBuilder();
75+
sql.append("delete from ");
76+
sql.append(getDynamicTableName(entityClass));
77+
sql.append(" where ");
78+
sql.append(EntityHelper.getPrimaryKeyWhere(entityClass));
79+
return sql.toString();
8880
}
8981
}

src/main/java/tk/mybatis/mapper/provider/base/BaseInsertProvider.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@ public SqlNode insert(MappedStatement ms) {
5757
Class<?> entityClass = getSelectReturnType(ms);
5858
List<SqlNode> sqlNodes = new LinkedList<SqlNode>();
5959
//insert into table
60-
sqlNodes.add(new StaticTextSqlNode("INSERT INTO " + tableName(entityClass)));
60+
sqlNodes.add(new StaticTextSqlNode("INSERT INTO "));
61+
sqlNodes.add(getDynamicTableNameNode(entityClass));
62+
6163
//获取全部列
6264
Set<EntityColumn> columnList = EntityHelper.getColumns(entityClass);
6365
//Identity列只能有一个
@@ -128,7 +130,9 @@ public SqlNode insertSelective(MappedStatement ms) {
128130
Class<?> entityClass = getSelectReturnType(ms);
129131
List<SqlNode> sqlNodes = new LinkedList<SqlNode>();
130132
//insert into table
131-
sqlNodes.add(new StaticTextSqlNode("INSERT INTO " + tableName(entityClass)));
133+
sqlNodes.add(new StaticTextSqlNode("INSERT INTO "));
134+
sqlNodes.add(getDynamicTableNameNode(entityClass));
135+
132136
//获取全部列
133137
Set<EntityColumn> columnList = EntityHelper.getColumns(entityClass);
134138
List<SqlNode> ifNodes = new LinkedList<SqlNode>();

src/main/java/tk/mybatis/mapper/provider/base/BaseSelectProvider.java

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,7 @@
2424

2525
package tk.mybatis.mapper.provider.base;
2626

27-
import org.apache.ibatis.builder.StaticSqlSource;
28-
import org.apache.ibatis.jdbc.SQL;
2927
import org.apache.ibatis.mapping.MappedStatement;
30-
import org.apache.ibatis.mapping.ParameterMapping;
3128
import org.apache.ibatis.scripting.xmltags.MixedSqlNode;
3229
import org.apache.ibatis.scripting.xmltags.SqlNode;
3330
import org.apache.ibatis.scripting.xmltags.StaticTextSqlNode;
@@ -64,8 +61,8 @@ public SqlNode selectOne(MappedStatement ms) {
6461
//静态的sql部分:select column ... from table
6562
sqlNodes.add(new StaticTextSqlNode("SELECT "
6663
+ EntityHelper.getSelectColumns(entityClass)
67-
+ " FROM "
68-
+ tableName(entityClass)));
64+
+ " FROM "));
65+
sqlNodes.add(getDynamicTableNameNode(entityClass));
6966
//将if添加到<where>
7067
sqlNodes.add(new WhereSqlNode(ms.getConfiguration(), getAllIfColumnNode(entityClass)));
7168
return new MixedSqlNode(sqlNodes);
@@ -85,8 +82,8 @@ public SqlNode select(MappedStatement ms) {
8582
//静态的sql部分:select column ... from table
8683
sqlNodes.add(new StaticTextSqlNode("SELECT "
8784
+ EntityHelper.getSelectColumns(entityClass)
88-
+ " FROM "
89-
+ tableName(entityClass)));
85+
+ " FROM "));
86+
sqlNodes.add(getDynamicTableNameNode(entityClass));
9087
//将if添加到<where>
9188
sqlNodes.add(new WhereSqlNode(ms.getConfiguration(), getAllIfColumnNode(entityClass)));
9289
String orderByClause = EntityHelper.getOrderByClause(entityClass);
@@ -111,25 +108,18 @@ public SqlNode selectByRowBounds(MappedStatement ms) {
111108
*
112109
* @param ms
113110
*/
114-
public void selectByPrimaryKey(MappedStatement ms) {
111+
public String selectByPrimaryKey(MappedStatement ms) {
115112
final Class<?> entityClass = getSelectReturnType(ms);
116-
//获取主键字段映射
117-
List<ParameterMapping> parameterMappings = getPrimaryKeyParameterMappings(ms);
118-
//开始拼sql
119-
String sql = new SQL() {{
120-
//select全部列
121-
SELECT(EntityHelper.getSelectColumns(entityClass));
122-
//from表
123-
FROM(tableName(entityClass));
124-
//where条件,主键字段=#{property}
125-
WHERE(EntityHelper.getPrimaryKeyWhere(entityClass));
126-
}}.toString();
127-
//使用静态SqlSource
128-
StaticSqlSource sqlSource = new StaticSqlSource(ms.getConfiguration(), sql, parameterMappings);
129-
//替换原有的SqlSource
130-
setSqlSource(ms, sqlSource);
131113
//将返回值修改为实体类型
132114
setResultType(ms, entityClass);
115+
StringBuilder sql = new StringBuilder();
116+
sql.append("select ");
117+
sql.append(EntityHelper.getSelectColumns(entityClass));
118+
sql.append(" from ");
119+
sql.append(getDynamicTableName(entityClass));
120+
sql.append(" where ");
121+
sql.append(EntityHelper.getPrimaryKeyWhere(entityClass));
122+
return sql.toString();
133123
}
134124

135125
/**
@@ -142,7 +132,8 @@ public SqlNode selectCount(MappedStatement ms) {
142132
Class<?> entityClass = getSelectReturnType(ms);
143133
List<SqlNode> sqlNodes = new LinkedList<SqlNode>();
144134
//select count(*) from table
145-
sqlNodes.add(new StaticTextSqlNode("SELECT COUNT(*) FROM " + tableName(entityClass)));
135+
sqlNodes.add(new StaticTextSqlNode("SELECT COUNT(*) FROM "));
136+
sqlNodes.add(getDynamicTableNameNode(entityClass));
146137
//获取全部列的where,if条件
147138
sqlNodes.add(new WhereSqlNode(ms.getConfiguration(), getAllIfColumnNode(entityClass)));
148139
return new MixedSqlNode(sqlNodes);
@@ -161,6 +152,7 @@ public String selectAll(MappedStatement ms) {
161152
//开始拼sql
162153
StringBuilder sql = new StringBuilder();
163154
sql.append("select ").append(EntityHelper.getSelectColumns(entityClass)).append(" from ");
155+
//不支持动态表名,因为没参数...
164156
sql.append(tableName(entityClass));
165157

166158
String orderByClause = EntityHelper.getOrderByClause(entityClass);

src/main/java/tk/mybatis/mapper/provider/base/BaseUpdateProvider.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ public SqlNode updateByPrimaryKey(MappedStatement ms) {
5555
Class<?> entityClass = getSelectReturnType(ms);
5656
List<SqlNode> sqlNodes = new LinkedList<SqlNode>();
5757
//update table
58-
sqlNodes.add(new StaticTextSqlNode("UPDATE " + tableName(entityClass)));
58+
sqlNodes.add(new StaticTextSqlNode("UPDATE "));
59+
sqlNodes.add(getDynamicTableNameNode(entityClass));
60+
5961
//获取全部列
6062
Set<EntityColumn> columnList = EntityHelper.getColumns(entityClass);
6163
List<SqlNode> ifNodes = new LinkedList<SqlNode>();
@@ -88,7 +90,9 @@ public SqlNode updateByPrimaryKeySelective(MappedStatement ms) {
8890
Class<?> entityClass = getSelectReturnType(ms);
8991
List<SqlNode> sqlNodes = new LinkedList<SqlNode>();
9092
//update table
91-
sqlNodes.add(new StaticTextSqlNode("UPDATE " + tableName(entityClass)));
93+
sqlNodes.add(new StaticTextSqlNode("UPDATE "));
94+
sqlNodes.add(getDynamicTableNameNode(entityClass));
95+
9296
//获取全部列
9397
Set<EntityColumn> columnList = EntityHelper.getColumns(entityClass);
9498
List<SqlNode> ifNodes = new LinkedList<SqlNode>();

0 commit comments

Comments
 (0)