通过反射机制,将查询的结果集,直接映射到 JAVA 实体
1. ResultSetUtil
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ResultSetUtil {
/**
* 根据结果集合,映射到实体
*
* @param rs 结果集
* @param clazz 实体类
* @param <T> 实体
* @return
*/
public static <T> T readEntity(ResultSet rs, Class<T> clazz) {
ResultSetMetaData rsmd = null;
Method method = null;
T t = null;
try {
rsmd = rs.getMetaData();
String columnName;
String key;
if (rs.next()) {
t = clazz.newInstance();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
columnName = rsmd.getColumnName(i);
key = StringUtil.toJavaAttributeName(columnName);
method = clazz.getDeclaredMethod(StringUtil.asserSetMethodName(key), String.class);
method.invoke(t, rs.getString(columnName));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
/**
* 根据结果集合,返回map结构
* @param rs 结果集
* @return
*/
public static Map readEntity(ResultSet rs) {
ResultSetMetaData rsmd = null;
Method s = null;
Map<String,Object> map = new HashMap<>();
try {
rsmd = rs.getMetaData();
String columnName;
String key;
if (rs.next()) {
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
columnName = rsmd.getColumnName(i);
key = StringUtil.toJavaAttributeName(columnName);
map.put(key, rs.getObject(columnName));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
/**
* 根据结果集合,映射到实体
* @param rs 结果集
* @param clazz 实体类
* @param <T> 实体
* @return
*/
public static <T> List<T> readList(ResultSet rs, Class<T> clazz) {
ResultSetMetaData rsmd = null;
List<T> list = new ArrayList<T>();
Method method = null;
T t = null;
try {
rsmd = rs.getMetaData();
String columnName;
String key;
while (rs.next()) {
t = clazz.newInstance();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
columnName = rsmd.getColumnName(i);
key = StringUtil.toJavaAttributeName(columnName);
method = clazz.getDeclaredMethod(StringUtil.asserSetMethodName(key), String.class);
method.invoke(t, rs.getString(columnName));
}
list.add(t);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
/**
* 根据结果集合,映射到Map
* @param rs 结果集
* @return
*/
public static List<Map> readList(ResultSet rs) {
ResultSetMetaData rsmd;
List<Map> list = new ArrayList<>();
try {
rsmd = rs.getMetaData();
String columnName;
String key;
while (rs.next()) {
Map<String,Object> map = new HashMap<>();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
columnName = rsmd.getColumnName(i);
key = StringUtil.toJavaAttributeName(columnName);
map.put(key, rs.getObject(columnName));
}
list.add(map);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}
2. StringUtil
public class StringUtil {
/**
* 下划线转驼峰命名
* @param dbColumnName 列名
* @return 驼峰命名
*/
public static String toJavaAttributeName(String dbColumnName) {
char ch[] = dbColumnName.toCharArray();
for (int i = 0; i < ch.length; i++) {
if (i == 0) {
ch[i] = Character.toLowerCase(ch[i]);
}
if ((i + 1) < ch.length) {
if (ch[i] == '_') {
ch[i + 1] = Character.toUpperCase(ch[i + 1]);
} else {
ch[i + 1] = Character.toLowerCase(ch[i + 1]);
}
}
}
return new String(ch).replace("_", "");
}
/**
* 返回实体类的set方法
* @param attributeName 实体属性
* @return set方法
*/
public static String asserSetMethodName(String attributeName) {
StringBuffer sb = new StringBuffer(16);
char[] ch = attributeName.toCharArray();
ch[0] = Character.toUpperCase(ch[0]);
sb.append("set");
sb.append(new String(ch));
return sb.toString();
}
}