diff --git a/extra/src/main/java/tk/mybatis/mapper/additional/select/SelectSpecifyColumnsMapper.java b/extra/src/main/java/tk/mybatis/mapper/additional/select/SelectSpecifyColumnsMapper.java new file mode 100644 index 000000000..3d1b500c5 --- /dev/null +++ b/extra/src/main/java/tk/mybatis/mapper/additional/select/SelectSpecifyColumnsMapper.java @@ -0,0 +1,46 @@ +package tk.mybatis.mapper.additional.select; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.SelectProvider; +import tk.mybatis.mapper.annotation.RegisterMapper; +import tk.mybatis.mapper.weekend.Fn; + +import java.util.List; + +/** + * 查询指定字段 + * + * @param 不能为空 + * + * @author xiaodiwangjie + * @date 2020/10/24 + */ +@RegisterMapper +public interface SelectSpecifyColumnsMapper { + + /** + * 根据条件查询实体, 并指定字段 + * + * @param record 查询实体条件 + * @param columns 指定的返回字段 + * @return + */ + @SelectProvider( + type = SelectSpecifyColumnsProvider.class, + method = "dynamicSQL" + ) + List selectByColumns(@Param("record") T record, @Param("columns") List columns); + + /** + * 根据条件查询实体, 并指定属性 + * + * @param record 查询实体条件 + * @param fns 指定的返回实体属性 + * @return + */ + @SelectProvider( + type = SelectSpecifyColumnsProvider.class, + method = "dynamicSQL" + ) + List selectByPropertys(@Param("record") T record, @Param("fns") List> fns); +} diff --git a/extra/src/main/java/tk/mybatis/mapper/additional/select/SelectSpecifyColumnsProvider.java b/extra/src/main/java/tk/mybatis/mapper/additional/select/SelectSpecifyColumnsProvider.java new file mode 100644 index 000000000..911bfa5fd --- /dev/null +++ b/extra/src/main/java/tk/mybatis/mapper/additional/select/SelectSpecifyColumnsProvider.java @@ -0,0 +1,146 @@ +package tk.mybatis.mapper.additional.select; + +import org.apache.ibatis.mapping.MappedStatement; +import tk.mybatis.mapper.annotation.Version; +import tk.mybatis.mapper.entity.EntityColumn; +import tk.mybatis.mapper.entity.EntityTable; +import tk.mybatis.mapper.mapperhelper.EntityHelper; +import tk.mybatis.mapper.mapperhelper.MapperHelper; +import tk.mybatis.mapper.mapperhelper.MapperTemplate; +import tk.mybatis.mapper.mapperhelper.SqlHelper; + +import java.util.Iterator; +import java.util.Set; + +/** + * @author xiaodiwangjie + * @date 2020/10/24 + */ +public class SelectSpecifyColumnsProvider extends MapperTemplate { + + public SelectSpecifyColumnsProvider(Class mapperClass, MapperHelper mapperHelper) { + super(mapperClass, mapperHelper); + } + + public String selectByColumns(MappedStatement ms) { + + Class entityClass = this.getEntityClass(ms); + this.setResultType(ms, entityClass); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT "); + sql.append(""); + sql.append("${item}"); + sql.append(""); + sql.append(SqlHelper.fromTable(entityClass, this.tableName(entityClass))); + sql.append(whereAllIfColumns(entityClass, this.isNotEmpty(), false)); + sql.append(SqlHelper.orderByDefault(entityClass)); + + return sql.toString(); + } + + public String selectByPropertys(MappedStatement ms) { + + String propertyHelper = SelectSpecifyColumnsProvider.class.getName(); + Class entityClass = this.getEntityClass(ms); + this.setResultType(ms, entityClass); + StringBuilder sql = new StringBuilder(); + sql.append("SELECT "); + String entityClassName = entityClass.getName(); + sql.append(""); + String ognl = new StringBuilder("${@") + .append(propertyHelper) + .append("@getColumnByProperty(@java.lang.Class@forName(\"") + .append(entityClassName) + .append("\"), @tk.mybatis.mapper.weekend.reflection.Reflections@fnToFieldName(item))}").toString(); + sql.append(ognl); + sql.append(""); + sql.append(SqlHelper.fromTable(entityClass, this.tableName(entityClass))); + sql.append(whereAllIfColumns(entityClass, this.isNotEmpty(), false)); + sql.append(SqlHelper.orderByDefault(entityClass)); + + return sql.toString(); + } + + public static String whereAllIfColumns(Class entityClass, boolean empty, boolean useVersion) { + StringBuilder sql = new StringBuilder(); + sql.append(""); + Set columnSet = EntityHelper.getColumns(entityClass); + Iterator var5 = columnSet.iterator(); + + while (true) { + EntityColumn column; + do { + if (!var5.hasNext()) { + if (useVersion) { + sql.append(SqlHelper.whereVersion(entityClass)); + } + + sql.append(""); + return sql.toString(); + } + + column = (EntityColumn) var5.next(); + } while (useVersion && column.getEntityField().isAnnotationPresent(Version.class)); + + sql.append(getIfNotNull(column, " AND " + getColumnEqualsHolder(column), empty)); + } + } + + public static String getIfNotNull(EntityColumn column, String contents, boolean empty) { + StringBuilder sql = new StringBuilder(); + sql.append(""); + sql.append(contents); + sql.append(""); + return sql.toString(); + } + + public static String getColumnEqualsHolder(EntityColumn column) { + + return column.getColumn() + " = " + getColumnHolder(column); + } + + public static String getColumnHolder(EntityColumn column) { + + StringBuffer sb = new StringBuffer("#{"); + + sb.append("record.").append(column.getProperty()); + + if (column.getJdbcType() != null) { + sb.append(", jdbcType="); + sb.append(column.getJdbcType().toString()); + } + + if (column.getTypeHandler() != null) { + sb.append(", typeHandler="); + sb.append(column.getTypeHandler().getCanonicalName()); + } + + if (column.isUseJavaType() && !column.getJavaType().isArray()) { + sb.append(", javaType="); + sb.append(column.getJavaType().getCanonicalName()); + } + + sb.append("}"); + + return sb.toString(); + } + + /** + * 根据实体Class和属性名获取对应的表字段名 + * @param entityClass 实体Class对象 + * @param property 属性名 + * @return + */ + public static String getColumnByProperty(Class entityClass, String property) { + EntityTable entityTable = EntityHelper.getEntityTable(entityClass); + EntityColumn entityColumn = entityTable.getPropertyMap().get(property); + return entityColumn.getColumn(); + } +}