在JavaWeb的dao层根据用户id查询user表信息时,具体实现:
public User queryUserByName(int id) {
Connection connection = JDBCUtils.getConnection();
String sql = "select * from user where id = ?";
User user = null;
try{
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, name);
ResultSet rs = pstmt.executeQuery();
while(rs.next()){
user = new User(rs.getInt(1),
rs.getString(2),
rs.getString(3),
rs.getString(4));
}
JDBCUtils.release(connection, pstmt, rs);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return user;
}
这样做其实非常麻烦,要逐一的get查询的结果ResultSet类型的对象,get后在逐一的放到User对象的构造方法中。
不过现在可以通过反射机制获取到User的每一个成员变量,只要User对象有对应的set方法,就能设置其属性值,其次在利用泛型机制来定义对象,因为在传入对象之前,并不知道当前要创建的对象是什么类型的,具体实现代码:
public static <T> Object getResultRow(ResultSet rs, Class<T> c) throws Exception {
//创建对象
T obj = cls.getConstructor().newInstance();
//获取结果集元数据(获取此 ResultSet 对象的列的编号、类型和属性。)
ResultSetMetaData rd = rs.getMetaData();
//使用反射拿到cls中的方法
Method[] methods = cls.getDeclaredMethods();
// 查找相关属性的方法
Map<String, Method> columnNames = new HashMap<>();
for (int i = 1; i <= rd.getColumnCount(); i++) {
//获取列名
String columnName = rd.getColumnLabel(i);
//组合方法名,set+首字母大写+后续小写
String methodName = "set" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1);
//遍历method查找符合项并赋值
for (Method method : methods)
if (method.getName().equals(methodName))
method.invoke(obj, rs.getObject(columnName));
}
return obj;
}
上面的代码写到JDBC工具类中,然后之前的代码可以简化如下:
public User queryUserById(int id) {
Connection connection = DruidUtil.getConnection();
String sql = "select * from user where id = ?";
User user = null;
try{
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, id);
ResultSet rs = pstmt.executeQuery();
while(rs.next())
user = (User) DruidUtil.getResultRow(rs, User.class);
DruidUtil.release(connection, pstmt, rs);
} catch (Exception e) {
e.printStackTrace();
}
return user;
}