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中的字段名匹配。

  • 相关阅读:
    MFC关闭子窗口 如何把父窗口也一起关闭
    VS2010创建动态链接库并且使用动态链接库DLL
    Linux文件处理命令
    Centos ftp服务器安装配置
    PHP数字价格格式化,保留两位小数
    PHP中file_put_contents追加和换行
    如何查看Laravel版本号的三种方法
    性能优化系列一:性能优化介绍与优化的范围
    只需两步获取任何微信小程序源码
    前端网页、php与mysql数据库字符编码(解决中文等乱码问题
  • 原文地址:https://www.cnblogs.com/wangdahui/p/14551895.html
Copyright © 2011-2022 走看看