Skip to content

Commit 6493164

Browse files
ajie-devabel533
authored andcommitted
A 新增 根据实体中的属性进行查询指定属性
1 parent 33c95f1 commit 6493164

2 files changed

Lines changed: 192 additions & 0 deletions

File tree

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package tk.mybatis.mapper.additional.select;
2+
3+
import org.apache.ibatis.annotations.Param;
4+
import org.apache.ibatis.annotations.SelectProvider;
5+
import tk.mybatis.mapper.annotation.RegisterMapper;
6+
import tk.mybatis.mapper.weekend.Fn;
7+
8+
import java.util.List;
9+
10+
/**
11+
* 查询指定字段
12+
*
13+
* @param <T> 不能为空
14+
*
15+
* @author xiaodiwangjie
16+
* @date 2020/10/24
17+
*/
18+
@RegisterMapper
19+
public interface SelectSpecifyColumnsMapper<T> {
20+
21+
/**
22+
* 根据条件查询实体, 并指定字段
23+
*
24+
* @param record 查询实体条件
25+
* @param columns 指定的返回字段
26+
* @return
27+
*/
28+
@SelectProvider(
29+
type = SelectSpecifyColumnsProvider.class,
30+
method = "dynamicSQL"
31+
)
32+
List<T> selectByColumns(@Param("record") T record, @Param("columns") List<String> columns);
33+
34+
/**
35+
* 根据条件查询实体, 并指定属性
36+
*
37+
* @param record 查询实体条件
38+
* @param fns 指定的返回实体属性
39+
* @return
40+
*/
41+
@SelectProvider(
42+
type = SelectSpecifyColumnsProvider.class,
43+
method = "dynamicSQL"
44+
)
45+
List<T> selectByPropertys(@Param("record") T record, @Param("fns") List<Fn<T, ?>> fns);
46+
}
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
package tk.mybatis.mapper.additional.select;
2+
3+
import org.apache.ibatis.mapping.MappedStatement;
4+
import tk.mybatis.mapper.annotation.Version;
5+
import tk.mybatis.mapper.entity.EntityColumn;
6+
import tk.mybatis.mapper.entity.EntityTable;
7+
import tk.mybatis.mapper.mapperhelper.EntityHelper;
8+
import tk.mybatis.mapper.mapperhelper.MapperHelper;
9+
import tk.mybatis.mapper.mapperhelper.MapperTemplate;
10+
import tk.mybatis.mapper.mapperhelper.SqlHelper;
11+
12+
import java.util.Iterator;
13+
import java.util.Set;
14+
15+
/**
16+
* @author xiaodiwangjie
17+
* @date 2020/10/24
18+
*/
19+
public class SelectSpecifyColumnsProvider extends MapperTemplate {
20+
21+
public SelectSpecifyColumnsProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
22+
super(mapperClass, mapperHelper);
23+
}
24+
25+
public String selectByColumns(MappedStatement ms) {
26+
27+
Class<?> entityClass = this.getEntityClass(ms);
28+
this.setResultType(ms, entityClass);
29+
StringBuilder sql = new StringBuilder();
30+
sql.append("SELECT ");
31+
sql.append("<foreach collection=\"columns\" item=\"item\" open=\"\" separator=\",\" close=\"\">");
32+
sql.append("${item}");
33+
sql.append("</foreach>");
34+
sql.append(SqlHelper.fromTable(entityClass, this.tableName(entityClass)));
35+
sql.append(whereAllIfColumns(entityClass, this.isNotEmpty(), false));
36+
sql.append(SqlHelper.orderByDefault(entityClass));
37+
38+
return sql.toString();
39+
}
40+
41+
public String selectByPropertys(MappedStatement ms) {
42+
43+
String propertyHelper = SelectSpecifyColumnsProvider.class.getName();
44+
Class<?> entityClass = this.getEntityClass(ms);
45+
this.setResultType(ms, entityClass);
46+
StringBuilder sql = new StringBuilder();
47+
sql.append("SELECT ");
48+
String entityClassName = entityClass.getName();
49+
sql.append("<foreach collection=\"fns\" item=\"item\" open=\"\" separator=\",\" close=\"\">");
50+
String ognl = new StringBuilder("${@")
51+
.append(propertyHelper)
52+
.append("@getColumnByProperty(@java.lang.Class@forName(\"")
53+
.append(entityClassName)
54+
.append("\"), @tk.mybatis.mapper.weekend.reflection.Reflections@fnToFieldName(item))}").toString();
55+
sql.append(ognl);
56+
sql.append("</foreach>");
57+
sql.append(SqlHelper.fromTable(entityClass, this.tableName(entityClass)));
58+
sql.append(whereAllIfColumns(entityClass, this.isNotEmpty(), false));
59+
sql.append(SqlHelper.orderByDefault(entityClass));
60+
61+
return sql.toString();
62+
}
63+
64+
public static String whereAllIfColumns(Class<?> entityClass, boolean empty, boolean useVersion) {
65+
StringBuilder sql = new StringBuilder();
66+
sql.append("<where>");
67+
Set<EntityColumn> columnSet = EntityHelper.getColumns(entityClass);
68+
Iterator var5 = columnSet.iterator();
69+
70+
while (true) {
71+
EntityColumn column;
72+
do {
73+
if (!var5.hasNext()) {
74+
if (useVersion) {
75+
sql.append(SqlHelper.whereVersion(entityClass));
76+
}
77+
78+
sql.append("</where>");
79+
return sql.toString();
80+
}
81+
82+
column = (EntityColumn) var5.next();
83+
} while (useVersion && column.getEntityField().isAnnotationPresent(Version.class));
84+
85+
sql.append(getIfNotNull(column, " AND " + getColumnEqualsHolder(column), empty));
86+
}
87+
}
88+
89+
public static String getIfNotNull(EntityColumn column, String contents, boolean empty) {
90+
StringBuilder sql = new StringBuilder();
91+
sql.append("<if test=\"");
92+
93+
sql.append("record.").append(column.getProperty()).append(" != null");
94+
if (empty && column.getJavaType().equals(String.class)) {
95+
sql.append(" and ").append(column.getProperty()).append(" != '' ");
96+
}
97+
98+
sql.append("\">");
99+
sql.append(contents);
100+
sql.append("</if>");
101+
return sql.toString();
102+
}
103+
104+
public static String getColumnEqualsHolder(EntityColumn column) {
105+
106+
return column.getColumn() + " = " + getColumnHolder(column);
107+
}
108+
109+
public static String getColumnHolder(EntityColumn column) {
110+
111+
StringBuffer sb = new StringBuffer("#{");
112+
113+
sb.append("record.").append(column.getProperty());
114+
115+
if (column.getJdbcType() != null) {
116+
sb.append(", jdbcType=");
117+
sb.append(column.getJdbcType().toString());
118+
}
119+
120+
if (column.getTypeHandler() != null) {
121+
sb.append(", typeHandler=");
122+
sb.append(column.getTypeHandler().getCanonicalName());
123+
}
124+
125+
if (column.isUseJavaType() && !column.getJavaType().isArray()) {
126+
sb.append(", javaType=");
127+
sb.append(column.getJavaType().getCanonicalName());
128+
}
129+
130+
sb.append("}");
131+
132+
return sb.toString();
133+
}
134+
135+
/**
136+
* 根据实体Class和属性名获取对应的表字段名
137+
* @param entityClass 实体Class对象
138+
* @param property 属性名
139+
* @return
140+
*/
141+
public static String getColumnByProperty(Class<?> entityClass, String property) {
142+
EntityTable entityTable = EntityHelper.getEntityTable(entityClass);
143+
EntityColumn entityColumn = entityTable.getPropertyMap().get(property);
144+
return entityColumn.getColumn();
145+
}
146+
}

0 commit comments

Comments
 (0)