将jdbc结果集转换成对象列表

参考url:http://llying.iteye.com/blog/219020

备注:如果运行提示类型转换错误,可能model个别对象属性需要设置为BigInteger(参考对应表的字段属性)。java对象不支持Long类型。

注意:java对象属性需与数据库字段完全配置,不支持驼峰法命名。r如:数据库:user_name ,则java中需为:user_name.(userName则失败)

1,工具代码

  
import java.lang.reflect.Field;  
import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.ResultSet;  
import java.sql.ResultSetMetaData;  
import java.sql.SQLException;  
import java.util.ArrayList;  
import java.util.List;


import com.uei.sms.service.SmsService;  
  
public class DbUtils {  
    private static String url = "jdbc:mysql://UEIDATABASE:3306/uei?useUnicode=true&characterEncoding=UTF-8";  
    private static String username = "uei";  
    private static String password = "uei123";  
    private static String driverClass = "com.mysql.jdbc.Driver";  
    public static Connection getConn(){  
        Connection conn = null;  
        try {  
            Class.forName(driverClass);  
            conn = DriverManager.getConnection(url,username,password);  
        } catch (ClassNotFoundException e) {  
            e.printStackTrace();  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
          
        return conn;  
    }  
    /* 
     * 将rs结果转换成对象列表 
     * @param rs jdbc结果集 
     * @param clazz 对象的映射类 
     * return 封装了对象的结果列表 
     */  
    public static  <T> List populate(ResultSet rs , Class clazz) throws SQLException, InstantiationException, IllegalAccessException{  
        //结果集的元素对象   
        ResultSetMetaData rsmd = rs.getMetaData();  
        //获取结果集的元素个数  
         int colCount = rsmd.getColumnCount();  
         //返回结果的列表集合  
         List list = new ArrayList<T>();  
         //业务对象的属性数组  
         Field[] fields = clazz.getDeclaredFields();  
         while(rs.next()){//对每一条记录进行操作  
             Object obj = clazz.newInstance();//构造业务对象实体  
             //将每一个字段取出进行赋值  
             for(int i = 1;i<=colCount;i++){  
                 Object value = rs.getObject(i);  
                 //寻找该列对应的对象属性  
                 for(int j=0;j<fields.length;j++){  
                     Field f = fields[j];  
                     //如果匹配进行赋值  
                     if(f.getName().equalsIgnoreCase(rsmd.getColumnName(i))){  
                         boolean flag = f.isAccessible();  
                         System.out.println(f.getName());
                         System.out.println(f.getType());
                         f.setAccessible(true);  
                         System.out.println(value);
                         System.out.println(obj);
                         f.set(obj, value);  
                         f.setAccessible(flag);  
                     }  
                 }  
             }  
             list.add((T)obj);  
         }  
        return list;  
    }  
}  


2,使用样例:

 String sql = "SELECT * FROM  TABLES ";
        Connection conn;
        try {
            conn = DriverManager.getConnection(configParams.connectionURL, configParams.userName,
                    configParams.password);
            PreparedStatement pst = conn.prepareStatement(sql);// 准备执行语句
            ResultSet rst = pst.executeQuery();
            try {
                List<TableModel> list = DbUtils.populate(rst, TableModel.class);
                
            } catch (InstantiationException | IllegalAccessException e) {
                e.printStackTrace();
            }  
            
            rst.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值