广告位联系
返回顶部
分享到

将ResultSet中得到的一行或多行结果集封装成对象

java 来源:互联网搜集 作者:秩名 发布时间:2020-05-03 20:48:58 人浏览
摘要

首先说一下这个使用场景,我们在使用jdbc连接数据库的时候,执行查询语句时候会得到一个结果集,如果想要再获取这个结果集中的值,就需要我们将他转换成一个对象,然后通过对象的get和set方法来获取到数据库中的值。 public class BaseDao E { private Class

首先说一下这个使用场景,我们在使用jdbc连接数据库的时候,执行查询语句时候会得到一个结果集,如果想要再获取这个结果集中的值,就需要我们将他转换成一个对象,然后通过对象的get和set方法来获取到数据库中的值。

 
public class BaseDao <E> {
 private Class<?> cls;
 public BaseDao() {
 //得到父类的泛型
 Type sType=getClass().getGenericSuperclass();
 //得到实际的类型参数数组
 Type[] generics=((ParameterizedType) sType).getActualTypeArguments();
  //得到第一个泛型的Class
 cls=(Class<?>) (generics[0]);
 }
 
/**
     * 单表多条查询,将查询到的多条记录传入一个对象,然后再将这些存入一个集合中,返回这个集合
     * @param sql 传入对应的sql查询语句
     * @param parameters 传入对应的占位符的值
     * @return 返回查询到的记录转化成的对象的集合
     */
    //Object...parameters是sql语句中对应的占位符的值,是一个不定长可变参数,我们需要写一个函数来获取他
    public List<E> list(String sql,Object...parameters) {
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        List<E> list = new ArrayList<>();
        
        try {
            conn = JdbcUtil.getConnection();
            st = conn.prepareStatement(sql);
            setParameters(st, parameters);
            rs = st.executeQuery();
            while(rs.next()) {
        //将获取到的结果集存入一个对象中,这个我们也单独写一个函数来实现
                E obj = oneRowToObject(rs);
        //然后将对象存入一个集合中返回
                list.add(obj);
            }          
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            JdbcUtil.closeAll(rs, st, conn);
        }  
        return list;
    }
 
 

首先来写一下获取不定长可变参数的方法

 
/**
 * 设置占位符
 * @param st 预处理
 * @param parameters 占位符数组
     * @return 返回存储占位符对应的对象的数组
 */
 private void setParameters(PreparedStatement st, Object[] parameters) {
        //判断是否有结果集,结果集中是否有记录
 if(parameters!=null&&parameters.length>0) {
  for(int i=0;i<parameters.length;i++) {
  try {
   st.setObject(i+1,parameters[i] );
  } catch (SQLException e) {
   e.printStackTrace();
  }
  }
 }
 }
 
 

然后再把一个结果集转化成一个对象的方法写一下

 
* 把得到的一列数据存入到一个对象中
     * @param rs
     * @return
     * @throws InstantiationException
     * @throws IllegalAccessException
     * @throws SQLException
     * @throws NoSuchMethodException
     * @throws SecurityException
     * @throws IllegalArgumentException
     * @throws InvocationTargetException
     */
    @SuppressWarnings("unchecked")
    private E oneRowToObject(ResultSet rs) throws InstantiationException, IllegalAccessException, SQLException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
        E obj;
        obj=(E) cls.newInstance();
        //获取结果集元数据(获取此 ResultSet 对象的列的编号、类型和属性。)
        ResultSetMetaData rd=rs.getMetaData();
        for (int i = 0; i < rd.getColumnCount(); i++) {
            //获取列名
            String columnName=rd.getColumnLabel(i+1);
            //组合方法名
            String methodName="set"+columnName.substring(0, 1).toUpperCase()+columnName.substring(1);
            //获取列类型
            int columnType=rd.getColumnType(i+1);
            Method method=null;
            switch(columnType) {
            case java.sql.Types.VARCHAR:
            case java.sql.Types.CHAR:
                method=cls.getMethod(methodName, String.class);
                if(method!=null) {
                    method.invoke(obj, rs.getString(columnName));  
                }
                break;         
            case java.sql.Types.INTEGER:
            case java.sql.Types.SMALLINT:
                method=cls.getMethod(methodName, int.class);
                if(method!=null) {
                    method.invoke(obj, rs.getInt(columnName)); 
                }
                break;
            case java.sql.Types.BIGINT:
                method=cls.getMethod(methodName, long.class);
                if(method!=null) {
                    method.invoke(obj, rs.getLong(columnName));
                }
                break;
            case java.sql.Types.DATE:
            case java.sql.Types.TIMESTAMP:
                try {
                    method=cls.getMethod(methodName, Date.class);
                    if(method!=null) {                     
                        method.invoke(obj, rs.getTimestamp(columnName));   
                    }
                } catch(Exception e) {
                    method=cls.getMethod(methodName, String.class);
                    if(method!=null) {
                        method.invoke(obj, rs.getString(columnName));  
                    }
                }              
                break;
            case java.sql.Types.DECIMAL:
                method=cls.getMethod(methodName, BigDecimal.class);
                if(method!=null) {
                    method.invoke(obj, rs.getBigDecimal(columnName));  
                }
                break;
            case java.sql.Types.DOUBLE:
            case java.sql.Types.NUMERIC:
                method=cls.getMethod(methodName, double.class);
                if(method!=null) {
                    method.invoke(obj, rs.getDouble(columnName));  
                }
                break;
            case java.sql.Types.BIT:
                method=cls.getMethod(methodName, boolean.class);
                if(method!=null) {
                    method.invoke(obj, rs.getBoolean(columnName)); 
                }
                break;
            default:
                break;
            }  
        }
        return obj;
    }  
 
 

使用的话就是写一个实体类Dao继承BaseDao

public class UserDao extends BaseDao <User>{
}

测试一下:

 
public class test {
 public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, SQLException, IntrospectionException {
 UserDao userdao = new UserDao();
        List<User> list=userdao.list("select * from user");
 System.out.println("uid\t"+"uname\t"+"state\t"+"flag");
 for (User user : list) {
  System.out.println(user.getUid()+"\t"+user.getUname()+"\t"+user.getState()+"\t"+user.getFlag());
 }
}
}
 
 


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。

您可能感兴趣的文章 :

原文链接 : https://blog.csdn.net/qq_40180411/article/details/81697723
    Tag :
相关文章
  • SpringBoot自定义错误处理逻辑介绍

    SpringBoot自定义错误处理逻辑介绍
    1. 自定义错误页面 将自定义错误页面放在 templates 的 error 文件夹下,SpringBoot 精确匹配错误信息,使用 4xx.html 或者 5xx.html 页面可以打印错误
  • Java实现手写一个线程池的代码

    Java实现手写一个线程池的代码
    线程池技术想必大家都不陌生把,相信在平时的工作中没有少用,而且这也是面试频率非常高的一个知识点,那么大家知道它的实现原理和
  • Java实现断点续传功能的代码

    Java实现断点续传功能的代码
    题目实现:网络资源的断点续传功能。 二、解题思路 获取要下载的资源网址 显示网络资源的大小 上次读取到的字节位置以及未读取的字节
  • 你可知HashMap为什么是线程不安全的
    HashMap 的线程不安全 HashMap 的线程不安全主要体现在下面两个方面 在 jdk 1.7 中,当并发执行扩容操作时会造成环形链和数据丢失的情况 在
  • ArrayList的动态扩容机制的介绍

    ArrayList的动态扩容机制的介绍
    对于 ArrayList 的动态扩容机制想必大家都听说过,之前的文章中也谈到过,不过由于时间久远,早已忘却。 所以利用这篇文章做做笔记,加
  • JVM基础之字节码的增强技术介绍

    JVM基础之字节码的增强技术介绍
    字节码增强技术 在上文中,着重介绍了字节码的结构,这为我们了解字节码增强技术的实现打下了基础。字节码增强技术就是一类对现有字
  • Java中的字节码增强技术

    Java中的字节码增强技术
    1.字节码增强技术 字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。 参考地址 2.常见技术 技术分类 类
  • Redis BloomFilter布隆过滤器原理与实现

    Redis BloomFilter布隆过滤器原理与实现
    Bloom Filter 概念 布隆过滤器(英语:Bloom Filter)是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射
  • Java C++算法题解leetcode801使序列递增的最小交换次

    Java C++算法题解leetcode801使序列递增的最小交换次
    题目要求 思路:状态机DP 实现一:状态机 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution { public int minSwap(int[] nums1, int[] nums2) { int n
  • Mybatis结果集映射与生命周期介绍

    Mybatis结果集映射与生命周期介绍
    一、ResultMap结果集映射 1、设计思想 对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了 2、resultMap的应用场
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计