Commit 5c0a802f authored by trumansdo's avatar trumansdo
Browse files

-

parent 94ebe838
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray; import cn.hutool.json.JSONArray;
...@@ -11,6 +12,7 @@ import com.ibeetl.admin.core.entity.CoreRoute; ...@@ -11,6 +12,7 @@ import com.ibeetl.admin.core.entity.CoreRoute;
import com.ibeetl.admin.core.entity.CoreRouteMeta; import com.ibeetl.admin.core.entity.CoreRouteMeta;
import com.ibeetl.admin.core.util.CacheUtil; import com.ibeetl.admin.core.util.CacheUtil;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
......
package processor; package processor;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import com.ibeetl.admin.core.util.CacheUtil; import com.ibeetl.admin.core.util.CacheUtil;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor; import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.ResultSetMetaData; import java.sql.ResultSetMetaData;
import java.sql.SQLException; import java.sql.SQLException;
import org.beetl.sql.core.BeetlSQLException; import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.beetl.sql.core.SQLManager; import org.beetl.sql.core.SQLManager;
import org.beetl.sql.core.Tail;
import org.beetl.sql.core.annotatoin.builder.AttributeBuilderHolder;
import org.beetl.sql.core.annotatoin.builder.AttributeSelectBuilder;
import org.beetl.sql.core.db.ClassAnnotation;
import org.beetl.sql.core.db.DBStyle;
import org.beetl.sql.core.kit.BeanKit; import org.beetl.sql.core.kit.BeanKit;
import org.beetl.sql.core.mapping.BeanProcessor; import org.beetl.sql.core.mapping.BeanProcessor;
import org.beetl.sql.core.mapping.type.JavaSqlTypeHandler; import resultmap.GridColumn;
import org.beetl.sql.core.mapping.type.TypeParameter; import resultmap.GridHeader;
import resultmap.GridMapping; import resultmap.GridMapping;
import resultmap.GridRow;
public class JsonBeanProcessor extends BeanProcessor { public class JsonBeanProcessor extends BeanProcessor {
...@@ -25,78 +28,108 @@ public class JsonBeanProcessor extends BeanProcessor { ...@@ -25,78 +28,108 @@ public class JsonBeanProcessor extends BeanProcessor {
super(sm); super(sm);
} }
@Override
public <T> List<T> toBeanList(String sqlId, ResultSet rs, Class<T> type) throws SQLException {
if (!rs.next()) {
return new ArrayList<T>(0);
}
List<T> results = new ArrayList<T>();
PropertyDescriptor[] props = this.propertyDescriptors(type);
ResultSetMetaData rsmd = rs.getMetaData();
int[] columnToProperty = this.mapColumnsToProperties(type, rsmd, props);
results.add(this.createBean(sqlId, rs, type, props, columnToProperty));
return results;
}
/** 创建 一个新的对象,并从ResultSet初始化 */ /** 创建 一个新的对象,并从ResultSet初始化 */
@Override @Override
protected <T> T createBean( protected <T> T createBean(
String sqlId, ResultSet rs, Class<T> type, PropertyDescriptor[] props, int[] columnToProperty) String sqlId, ResultSet rs, Class<T> type, PropertyDescriptor[] props, int[] columnToProperty)
throws SQLException { throws SQLException {
GridMapping gridMapping = (GridMapping) CacheUtil.get("Route_Mapping"); GridMapping gridMapping = (GridMapping) CacheUtil.get("Route_Mapping");
if (null == gridMapping) {
return super.createBean(sqlId, rs, type, props, columnToProperty);
}
T bean = this.newInstance(type); fillMappingRow(rs, gridMapping);
ResultSetMetaData meta = rs.getMetaData(); System.out.println(gridMapping);
TypeParameter tp = new TypeParameter(sqlId, this.dbName, type, rs, meta, 1); return null;
}
for (int i = 1; i < columnToProperty.length; i++) {
// Array.fill数组为-1 ,-1则无对应name
tp.setIndex(i);
if (columnToProperty[i] == PROPERTY_NOT_FOUND) {
String key = rs.getMetaData().getColumnLabel(i);
if ((dbType == DBStyle.DB_ORACLE || dbType == DBStyle.DB_SQLSERVER)
&& key.equalsIgnoreCase("beetl_rn")) {
// sql server 特殊处理,sql'server的翻页使用了额外列作为翻页参数,需要过滤
continue;
}
if (bean instanceof Tail) {
Tail bean2 = (Tail) bean;
Object value = noMappingValue(tp);
key = this.nc.getPropertyName(type, key);
bean2.set(key, value);
} else {
Method m = BeanKit.getTailMethod(type);
// 使用指定方法赋值
if (m != null) {
Object value = noMappingValue(tp); protected void fillMappingRow(ResultSet resultSet, GridMapping mapping) throws SQLException {
key = this.nc.getPropertyName(type, key); GridHeader header = mapping.getHeader();
try { mapping.nextRow();
m.invoke(bean, key, value); /** flag:用来判断结果集是否应该 next()。可能后期应该改成CacheRowSet更好,这样可以直接操作结果集光标回退一行就行了。 */
} catch (Exception ex) { Boolean flag = true;
throw new BeetlSQLException(BeetlSQLException.TAIL_CALL_ERROR, ex); while (true) {
} if (flag && !resultSet.next()) {
} else { break;
// 忽略这个结果集
}
}
continue;
} }
resultSet.previous();
GridRow row;
if (!flag) {
row = mapping.nextRow();
} else {
row = CollUtil.getLast(mapping.getNestedRows());
}
flag = fillRowColumn(resultSet, header, row);
}
}
/** flag:用来判断结果集是否 next() */
protected boolean fillRowColumn(ResultSet resultSet, GridHeader header, GridRow row)
throws SQLException {
boolean flag = true;
Map<String, Object> tempBeanMap = MapUtil.newHashMap();
/*第一步、先处理当前可以处理的*/
Map<String, String> javaToJdbcMap = header.getJavaToJdbcMap();
Set<Entry<String, String>> entrySet = javaToJdbcMap.entrySet();
for (Entry<String, String> entry : entrySet) {
tempBeanMap.put(entry.getKey(), resultSet.getObject(entry.getValue()));
}
Integer rowKey = row.getRowKey();
Integer calculateKey = GridColumn.calculateKey(tempBeanMap);
if (ObjectUtil.notEqual(rowKey, calculateKey)) {
if (ObjectUtil.isNull(row.getBelongColumn())) {
flag = false;
} else {
GridRow generateRow = GridRow.generateRowByHeader(header);
generateRow.setBelongColumn(row.getBelongColumn());
// columnToProperty[i]取出对应的在PropertyDescriptor[]中的下标 GridColumn tempColumn = new GridColumn();
PropertyDescriptor prop = props[columnToProperty[i]]; tempColumn.setMappingHeader(header);
Class<?> propType = prop.getPropertyType(); tempColumn.setResultType(header.getResultType());
tp.setTarget(propType); tempColumn.setBelongRow(row);
ClassAnnotation ca = ClassAnnotation.getClassAnnotation(type); tempColumn.setBeanMap(tempBeanMap);
Object value = null;
if (!ca.getColHandlers().isEmpty()) { generateRow.getNestedColumns().add(0, tempColumn);
AttributeBuilderHolder holder = row.getBelongColumn().getNestedRows().add(generateRow);
(AttributeBuilderHolder) ca.getColHandlers().get(prop.getName()); flag = true;
if (holder != null && holder.supportSelectMapping()) {
value =
((AttributeSelectBuilder) holder.getInstance())
.toObject(this.sm, holder.getBeanAnnotaton(), sqlId, tp, prop);
this.callSetter(bean, prop, value, propType);
continue;
}
} }
JavaSqlTypeHandler handler = this.handlers.get(propType); } else {
if (handler == null) { List<GridHeader> nestedHeaders = header.getNestedHeaders();
handler = this.defaultHandler; for (GridHeader nestedHeader : nestedHeaders) {
row = row.getGridColumnByMappingHeader(nestedHeader).getBelongRow();
flag = fillRowColumn(resultSet, nestedHeader, row);
} }
value = handler.getValue(tp);
this.callSetter(bean, prop, value, propType);
} }
return flag;
}
return bean; /**
* 根据class取得属性描述PropertyDescriptor
*
* @param c
* @return
* @throws SQLException
*/
private PropertyDescriptor[] propertyDescriptors(Class<?> c) throws SQLException {
try {
return BeanKit.propertyDescriptors(c);
} catch (IntrospectionException e) {
throw new SQLException("Bean introspection failed: " + e.getMessage());
}
} }
} }
package resultmap; package resultmap;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -18,12 +18,12 @@ import java.util.Set; ...@@ -18,12 +18,12 @@ import java.util.Set;
public class GridColumn implements Serializable { public class GridColumn implements Serializable {
/** 对应的属性与数据库中值的映射,用于map to Bean 转换 */ /** 对应的属性与数据库中值的映射,用于map to Bean 转换 */
Map<String, Object> beanMap; Map<String, Object> beanMap = MapUtil.newHashMap();
/** 映射类型 */ /** 映射类型 */
String resultType; String resultType;
/** 数据库记录对应的唯一key,用 beanMap 中所有非null值的hashcode相加得出 */ /** 一个网格列包含一个对象中的所有数据列,通过对这些数据列进行hash得到数据列的唯一性 */
Integer objKey; Integer objKey;
/** 包含的网格行 */ /** 包含的网格行 */
...@@ -32,6 +32,8 @@ public class GridColumn implements Serializable { ...@@ -32,6 +32,8 @@ public class GridColumn implements Serializable {
/** 归属的网格行 */ /** 归属的网格行 */
GridRow belongRow; GridRow belongRow;
GridHeader mappingHeader;
public Map<String, Object> getBeanMap() { public Map<String, Object> getBeanMap() {
return beanMap; return beanMap;
} }
...@@ -49,25 +51,18 @@ public class GridColumn implements Serializable { ...@@ -49,25 +51,18 @@ public class GridColumn implements Serializable {
} }
public Integer getObjKey() { public Integer getObjKey() {
int hs = 0; objKey = calculateKey(beanMap);
if (CollUtil.isNotEmpty(nestedRows)) {
for (GridRow nestedRow : nestedRows) {
hs = hs + nestedRow.getRowKey();
}
} else {
Set<Entry<String, Object>> entrySet = beanMap.entrySet();
for (Entry<String, Object> entry : entrySet) {
if (ObjectUtil.isNull(entry.getValue())) continue;
hs += entry.getValue().hashCode();
}
}
hs = hs / RandomUtil.randomInt(100);
objKey = hs;
return objKey; return objKey;
} }
public void setObjKey(Integer objKey) { public static Integer calculateKey(Map<String, Object> map) {
this.objKey = objKey; int hs = Integer.MIN_VALUE;
Set<Entry<String, Object>> entrySet = map.entrySet();
for (Entry<String, Object> entry : entrySet) {
if (ObjectUtil.isNull(entry.getValue())) continue;
hs += entry.getValue().hashCode();
}
return hs / 42;
} }
public List<GridRow> getNestedRows() { public List<GridRow> getNestedRows() {
...@@ -85,4 +80,12 @@ public class GridColumn implements Serializable { ...@@ -85,4 +80,12 @@ public class GridColumn implements Serializable {
public void setBelongRow(GridRow belongRow) { public void setBelongRow(GridRow belongRow) {
this.belongRow = belongRow; this.belongRow = belongRow;
} }
public void setMappingHeader(GridHeader mappingHeader) {
this.mappingHeader = mappingHeader;
}
public GridHeader getMappingHeader() {
return this.mappingHeader;
}
} }
...@@ -11,12 +11,12 @@ import java.io.Serializable; ...@@ -11,12 +11,12 @@ import java.io.Serializable;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
/** 网格映射数据结构: 包含一个网格头 {@link GridHeader} */ /** 网格映射数据结构: 包含一个网格头 {@link GridHeader}和多个网格行{@link GridRow} */
public class GridMapping implements Serializable { public class GridMapping implements Serializable {
/** 映射id */ /** 映射id */
String mappingId; String mappingId;
/** 映射类型 */ /** 当前映射配置对应的class类型 */
String resultType; String resultType;
/** 网格头 */ /** 网格头 */
......
...@@ -7,11 +7,11 @@ import java.util.List; ...@@ -7,11 +7,11 @@ import java.util.List;
/** /**
* 网格行,包含一个个网格列<br> * 网格行,包含一个个网格列<br>
* 一行一个对象,或者java类中的一个对象字段 * 一个网格行,对应着SQL select查询出的一个Java的逻辑对象
*/ */
public class GridRow implements Serializable { public class GridRow implements Serializable {
/** 包含的列 */ /** 包含的列,第0个列代表的是当前整个类的映射,从0列之后是内部对象字段的映射 */
List<GridColumn> nestedColumns = CollUtil.<GridColumn>newArrayList(); List<GridColumn> nestedColumns = CollUtil.<GridColumn>newArrayList();
/** 所属的列 */ /** 所属的列 */
...@@ -20,6 +20,7 @@ public class GridRow implements Serializable { ...@@ -20,6 +20,7 @@ public class GridRow implements Serializable {
/** 映射对象的类型名 */ /** 映射对象的类型名 */
String resultType; String resultType;
/** 通过每个列的key进行hash得到一个唯一row id */
Integer rowKey; Integer rowKey;
public GridRow() {} public GridRow() {}
...@@ -41,16 +42,7 @@ public class GridRow implements Serializable { ...@@ -41,16 +42,7 @@ public class GridRow implements Serializable {
} }
public Integer getRowKey() { public Integer getRowKey() {
int hs = 0; return this.nestedColumns.get(0).getObjKey();
for (GridColumn nestedColumn : nestedColumns) {
hs = hs + nestedColumn.getObjKey();
}
rowKey = hs;
return rowKey;
}
public void setRowKey(Integer rowKey) {
this.rowKey = rowKey;
} }
public GridColumn getBelongColumn() { public GridColumn getBelongColumn() {
...@@ -62,7 +54,7 @@ public class GridRow implements Serializable { ...@@ -62,7 +54,7 @@ public class GridRow implements Serializable {
} }
/** /**
* 根据网格头,生成对应的网格行结构 * 根据网格头,生成对应的网格行结构。 行套列或者列套行再套列两种。
* *
* @return * @return
*/ */
...@@ -71,12 +63,16 @@ public class GridRow implements Serializable { ...@@ -71,12 +63,16 @@ public class GridRow implements Serializable {
return null; return null;
} }
GridRow gridRow = new GridRow(); GridRow gridRow = new GridRow();
/*这个列才是真正的存储数据值的*/
GridColumn gridColumn = new GridColumn(); GridColumn gridColumn = new GridColumn();
gridRow.getNestedColumns().add(gridColumn); gridRow.getNestedColumns().add(gridColumn);
gridColumn.setBelongRow(gridRow); gridColumn.setBelongRow(gridRow);
List<GridHeader> headers = gridHeader.getNestedHeaders(); List<GridHeader> headers = gridHeader.getNestedHeaders();
for (GridHeader header : headers) { for (GridHeader header : headers) {
/*这只是外部的一个容器性质的列*/
GridColumn containerColumn = new GridColumn(); GridColumn containerColumn = new GridColumn();
GridRow nestedRow = generateRowByHeader(header); GridRow nestedRow = generateRowByHeader(header);
...@@ -87,8 +83,26 @@ public class GridRow implements Serializable { ...@@ -87,8 +83,26 @@ public class GridRow implements Serializable {
containerColumn.setBelongRow(gridRow); containerColumn.setBelongRow(gridRow);
} }
gridColumn.setMappingHeader(gridHeader);
gridColumn.setResultType(gridHeader.getResultType()); gridColumn.setResultType(gridHeader.getResultType());
gridRow.setResultType(gridHeader.getResultType()); gridRow.setResultType(gridHeader.getResultType());
return gridRow; return gridRow;
} }
public GridColumn getGridColumnByMappingHeader(GridHeader header) {
GridColumn obj = null;
for (GridColumn column : nestedColumns) {
if (CollUtil.isNotEmpty(column.getNestedRows())) {
List<GridRow> nestedRows = column.getNestedRows();
for (GridRow nestedRow : nestedRows) {
obj = nestedRow.getGridColumnByMappingHeader(header);
}
}
if (header.equals(column.getMappingHeader())) {
obj = column;
}
}
return obj;
}
} }
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment