zoukankan      html  css  js  c++  java
  • 将JDBC结果集转换成实体对象

    在JDBC工具类中加入转换方法,用于结果集转换成对象。

    package lo.utils;
     
    import java.lang.reflect.Field;
    import java.sql.*;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.UUID;
     
    /**
     * JDBC 工具类
     * @author pengYi
     *
     */
    public class JDBCUtils {
         
         public static Connection connection = null;
         public static PreparedStatement preparedStatement = null;
         public static ResultSet resultSet = null;
             
         /**
          * 连接数据库
          * @return
          */
         public static Connection getConnection(){
             String url = "jdbc:mysql://localhost:3306/chartroom";
             String user = "root";
             String password = "root";
             try {
                 Class.forName("com.mysql.jdbc.Driver");
                 connection = DriverManager.getConnection(url, user, password);
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
             return connection;
         }
         /**
          * 关闭资源
          */
         public static void close(){
             try{
                 if(connection != null){
                    connection.close(); 
                    connection = null;
                 }
                 if(preparedStatement != null){
                     preparedStatement.close();
                     preparedStatement = null;
                 }
                 if(resultSet!= null){
                     resultSet.close();
                     resultSet = null;
                 }
             }catch(SQLException e){
                 e.printStackTrace();
             }
             
         }
         /**
          * 将结果集转换成实体对象集合
          * @param res 结果集
          * @param c 实体对象映射类
          * @return
         * @throws SQLException 
         * @throws IllegalAccessException 
         * @throws InstantiationException 
          */
         public static List Populate(ResultSet rs,Class cc) throws SQLException, InstantiationException, IllegalAccessException{
             
             //结果集 中列的名称和类型的信息
             ResultSetMetaData rsm = rs.getMetaData();
             int colNumber = rsm.getColumnCount();
             List list = new ArrayList();
             Field[] fields = cc.getDeclaredFields();
             
             //遍历每条记录
             while(rs.next()){
                 //实例化对象
                 Object obj = cc.newInstance(); 
                 //取出每一个字段进行赋值
                 for(int i=1;i<=colNumber;i++){
                     Object value = rs.getObject(i);
                     //匹配实体类中对应的属性
                     for(int j = 0;j<fields.length;j++){
                         Field f = fields[j];
                         if(f.getName().equals(rsm.getColumnName(i))){
                             boolean flag = f.isAccessible();
                             f.setAccessible(true);
                             f.set(obj, value);
                             f.setAccessible(flag);
                             break;
                         }
                     }
                      
                 }
                 list.add(obj);
             }
             return list;
         }
    }

    创建测试类

    package lo.utils;
     
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.List;
     
    import lo.user.vo.User;
     
    public class Test{
         
        public static void main(String[] args) throws InstantiationException, IllegalAccessException {
            Connection conn = JDBCUtils.getConnection();      //JDBCUtils 自己定义的一个类
            PreparedStatement pre = null;
            ResultSet res = null;
            String sql = "select * from user where username=?";
            try {
                pre = conn.prepareStatement(sql);
                pre.setString(1,"wqq");
                res = pre.executeQuery();
                //调用将结果集转换成实体对象方法
                List list = JDBCUtils.Populate(res, User.class);
                //循环遍历结果
                for(int i=0;i<list.size();i++){
                    User user = (User) list.get(i);
                    System.out.println("[username = "+ user.getUsername()+",passwd = "+ user.getPassword()+"]");
                }
             
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    总结:

      重点在于 populate (ResultSet res,Class cc)转换方法。

      根据穿过来的 cc 创建实例 cc.newInstance();

      ResultSetMetaData 获得结果集中列的名称和类型的信息。

      Field 用来放实体类中的字段,这里的每一个字段都是对象。可以通过set(Obj,value) 给字段赋值

        匹配思路:

        1.先遍历结果集中的每一条记录。

        2.用ResultSetMetaData 获得 getColumnCount 列数和getColumnName 列名

        3.结果集中的列名和Field中的字段名匹配。

  • 相关阅读:
    Oracle 推出 ODAC for Entity Framework 和 LINQ to Entities Beta版
    Entity Framework Feature CTP 5系列文章
    MonoDroid相关资源
    MSDN杂志上的Windows Phone相关文章
    微软学Android Market推出 Web Windows Phone Marketplace
    使用 Visual Studio Agent 2010 进行负载压力测试的安装指南
    MonoMac 1.0正式发布
    Shawn Wildermuth的《Architecting WP7 》系列文章
    使用.NET Mobile API即51Degrees.mobi检测UserAgent
    MongoDB 客户端 MongoVue
  • 原文地址:https://www.cnblogs.com/wangdahui/p/14551895.html
Copyright © 2011-2022 走看看