1 /**处理当个对象的 ,rs中要么有一条,要么一条没有。
2 * @param <T>
3 */
4 public class BeanHandler<T> implements ResultSetHandler<T> {
5 private Class<T> type;
6 public BeanHandler(Class<T> type){
7 this.type = type;
8 }
9 /**将rs->T t
10 */
11 public T handle(ResultSet rs) throws SQLException {
12 //1使用反射技术创建T类型的对象t
13 //type ->User.class
14 //type.newInstance() “等价于”User user = new User();
15 T t =null;
16 try {
17 t = type.newInstance();
18 if(rs.next()){
19 //User.class ->BeanInfo info
20 BeanInfo info = Introspector.getBeanInfo(type);
21 //从info中获取所有属性对应的对象(属性类型,属性名称,setXxx和getXxx)
22 PropertyDescriptor[] pds = info.getPropertyDescriptors();
23 //遍历数组
24 for(int i =0;i<pds.length;i++){
25 //获得当前t对象的当前属性对应的setXxx(..)
26 Method mt = pds.getWriteMethod();
27 //获取当前属性的名称 比如:username
28 String pname = pds.getName();
29 //t.setXxx(rs.getString("属性名称"))
30 mt.invoke(t, rs.getObject(pname));
31 }
32 }
33 return t;
34 } catch (Exception e) {
35 e.printStackTrace();
36 }
37
38 return t;
39 }
40 }
测试,抛出了异常: java.sql.SQLException: Column 'class' not found. 出错原因是: rs.getObject("class"); 数据库的表user表中不存在名称为class的列。 我们在User类根本没有class,为何会有这一列的出现呢? 原因是User没有指定父类时,某人是Object的子类,从Object类中继承了class属性,故此 出现类class列不存在的问题。 解决办法:
1 try{
2 mt.invoke(t, rs.getObject(pname));
3 }catch (SQLException e) {
4 continue;
5 }
|