JdbcTemplate已经简单的封装了JDBC的操作,我们可以通过注解的方式直接拿到:
@Autowired
private JdbcTemplate template;
然后通过表名获取所有字段(代码仅为片段):
DatabaseMetaData dbmd = conn.getMetaData();
ResultSet rs = dbmd.getColumns(conn.getCatalog(), null, mapping.getTable(), null);
while (rs.next()) {
// String tb = rs.getString("TABLE_NAME");
String cln = rs.getString("COLUMN_NAME").toUpperCase();
int dt = rs.getInt("DATA_TYPE");
Fields tbfield = new Fields();
tbfield.setFieldName(cln);
String javaType = "java.lang.String";
switch (dt) {
case Types.BIGINT:
javaType = "java.lang.Long";
break;
case Types.INTEGER:
case Types.SMALLINT:
case Types.TINYINT:
javaType = "java.lang.Integer";
break;
case Types.FLOAT:
javaType = "java.lang.Float";
break;
case Types.DOUBLE:
javaType = "java.lang.Double";
break;
case Types.DATE:
case Types.TIMESTAMP:
case Types.TIMESTAMP_WITH_TIMEZONE:
javaType = "java.util.Date";
break;
default:
break;
}
tbfield.setJavaType(javaType);
propetyMap.put(cln, Class.forName(javaType));
}
sb.append(" FROM ");
sb.append(mapping.getTable());
sb.append(" WHERE 1=1 AND ");
sb.append(mapping.getPk());
sb.append(" = ?");
Map<String,Object> resultMap = template.queryForMap(sb.toString(),key);
获得字段后通过CGLIB动态生成对象:
public class ResultObject {
private Object result;
private BeanMap beanMap = null;
public ResultObject(String className, Map<String, Class<?>> propertyMap){
this.result = generateBean(className,propertyMap);
//result关联beanMap,修改beanMap的同时会修改result的属性
this.beanMap = BeanMap.create(this.result);
}
public ResultObject(String code, String msg) {
this.result = new MessageObject(code,msg);
}
private Object generateBean(String className, Map<String, Class<?>> propertyMap) {
BeanGenerator generator = new BeanGenerator();
generator.setSuperclass(BaseEntity.class);
generator.setNamingPolicy(new NamingPolicy() {
@Override
public String getClassName(String arg0, String arg1, Object arg2, Predicate arg3) {
return Contact.ENTITY_PATH+"."+className;
}
});
Set<String> keySet = propertyMap.keySet();
for (Iterator<String> i = keySet.iterator(); i.hasNext();) {
String key = (String) i.next();
generator.addProperty(key, propertyMap.get(key));
}
return generator.create();
}
public Object getResult() {
this.beanMap = BeanMap.create(this.result);
return result;
}
public void setValue(String property, Object value) {
beanMap.put(property, value);
}
public Object getValue(String property) {
return beanMap.get(property);
}
}
使用方式为:
ResultObject result = new ResultObject(表名,propetyMap(字段属性map));
return result.getResult();
最后将查询出来的数据根据字段名注入到对象中:
Map<String,Object> resultMap = template.queryForMap(sb.toString(),key);//查询SQL
将值通过CGLIB注入到对象中:
for (String k : resultMap.keySet()) {
result.setValue(k.toUpperCase(),resultMap.get(k));
}
后续可以考虑多表关联查询。