在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 staticObject getResultRow(ResultSet rs, Class c) throws Exception { //创建对象 T obj = cls.getConstructor().newInstance(); //获取结果集元数据(获取此 ResultSet 对象的列的编号、类型和属性。) ResultSetmetaData rd = rs.getmetaData(); //使用反射拿到cls中的方法 Method[] methods = cls.getDeclaredMethods(); // 查找相关属性的方法 Map 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;
}



