在编码的过程中,常常会遇到这样的情景:
1、从数据库中查找出该学生
2、new Student
3、调用setter方法将学生的信息录进去
例如:(仅供演示)
public List<Student> getAllStudent() {
List<Student> students = new LinkedList<Student>();
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
conn = DBConnection.getConnection();
st = conn.createStatement();
String sql = "select * from controllerinfo";
rs = st.executeQuery(sql);
while (rs.next()) {
Student student = new Student();
student.setId(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setAddress(rs.getString("address"));
students.add(student);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBConnection.close(rs, st, conn);
}
return students;
}
那么,为何我们不用反射写一个简单的工具类呢?参照ORM映射的思想,即使不去处理R关系,只做bean的生成,也非常有价值!
主要代码:(这里只实现一层bean转换)
public static <T> T inflate(ResultSet rs, Class<T> clas) throws InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
T ins = clas.newInstance();
Field[] fields = ins.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
try {
Object object = rs.getObject(field.getName());
if (null != object) {
field.set(ins, object);
}
} catch (SQLException e) {
// do next field
}
}
return ins;
}
有了上面的方法,Student的操作就变成了这样:
public List<Student> getAllStudent() {
List<Student> students = new LinkedList<Student>();
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try {
conn = DBConnection.getConnection();
st = conn.createStatement();
String sql = "select * from controllerinfo";
rs = st.executeQuery(sql);
while (rs.next()) {
/* 这里发生了变化 */
Student student = inflate(rs, Student.class);
students.add(student);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBConnection.close(rs, st, conn);
}
return students;
}
虽然仅仅是少了几行代码,但是创造的价值不敢小觑。不过大项目都会有ORM类似的组件,当然也不用考虑这个问题了。
思路来自于Gson项目。欢迎大佬指正。