`
zpball
  • 浏览: 921995 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ResultSet转为实体对象

阅读更多
package org.test;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
* <p>
* Title: LoonFramework
* </p>
* <p>
* Description:
* </p>
* <p>
* Copyright: Copyright (c) 2007
* </p>
* <p>
* Company: LoonFramework
* </p>
* 
* @author chenpeng
* @email:ceponline@yahoo.com.cn
* @version 0.1
*/
public class ConnectionTest {

   /**
   * 匹配指定class中数据,并返回包含get和set方法的object
   * 
   * @author chenpeng
   * @param clazz
   * @param beanProperty
   * @return
   */
   private Object[] beanMatch(Class clazz, String beanProperty) {
       Object[] result = new Object[2];
       char beanPropertyChars[] = beanProperty.toCharArray();
       beanPropertyChars[0] = Character.toUpperCase(beanPropertyChars[0]);
       String s = new String(beanPropertyChars);
       String names[] = { ("set" + s).intern(), ("get" + s).intern(),
               ("is" + s).intern(), ("write" + s).intern(),
               ("read" + s).intern() };
       Method getter = null;
       Method setter = null;
       Method methods[] = clazz.getMethods();
       for (int i = 0; i < methods.length; i++) {
           Method method = methods[i];
           // 只取公共字段
           if (!Modifier.isPublic(method.getModifiers()))
               continue;
           String methodName = method.getName().intern();
           for (int j = 0; j < names.length; j++) {
               String name = names[j];
               if (!name.equals(methodName))
                   continue;
               if (methodName.startsWith("set")
                       || methodName.startsWith("read"))
                   setter = method;
               else
                   getter = method;
           }
       }
       result[0] = getter;
       result[1] = setter;
       return result;
   }

   /**
   * 为bean自动注入数据
   * 
   * @author chenpeng
   * @param object
   * @param beanProperty
   */
   private void beanRegister(Object object, String beanProperty, String value) {
       Object[] beanObject = beanMatch(object.getClass(), beanProperty);
       Object[] cache = new Object[1];
       Method getter = (Method) beanObject[0];
       Method setter = (Method) beanObject[1];
       try {
           // 通过get获得方法类型
           String methodType = getter.getReturnType().getName();
           if (methodType.equalsIgnoreCase("long")) {
               cache[0] = new Long(value);
               setter.invoke(object, cache);
           } else if (methodType.equalsIgnoreCase("int")
                   || methodType.equalsIgnoreCase("integer")) {
               cache[0] = new Integer(value);
               setter.invoke(object, cache);
           } else if (methodType.equalsIgnoreCase("short")) {
               cache[0] = new Short(value);
               setter.invoke(object, cache);
           } else if (methodType.equalsIgnoreCase("float")) {
               cache[0] = new Float(value);
               setter.invoke(object, cache);
           } else if (methodType.equalsIgnoreCase("double")) {
               cache[0] = new Double(value);
               setter.invoke(object, cache);
           } else if (methodType.equalsIgnoreCase("boolean")) {
               cache[0] = new Boolean(value);
               setter.invoke(object, cache);
           } else if (methodType.equalsIgnoreCase("java.lang.String")) {
               cache[0] = value;
               setter.invoke(object, cache);
           } else if (methodType.equalsIgnoreCase("java.io.InputStream")) {
           } else if (methodType.equalsIgnoreCase("char")) {
               cache[0] = (Character.valueOf(value.charAt(0)));
               setter.invoke(object, cache);
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
   }

   /**
   * 转换connection查询结果为指定对象实体集合。
   * 
   * @author chenpeng
   * @param connection
   * @param clazz
   * @param sql
   * @return
   */
   public Collection get(final Connection connection, final Class clazz,
           final String sql) {
       // 创建PreparedStatement
       PreparedStatement ptmt = null;
       // 创建resultset
       ResultSet rset = null;
       // 创建collection
       Collection collection = null;
       try {
           // 赋予实例
           ptmt = connection.prepareStatement(sql);
           rset = ptmt.executeQuery();
           collection = get(rset, clazz);
       } catch (SQLException e) {
           System.err.println(e.getMessage());
       } finally {
           try {
               // 关闭rs并释放资源
               if (rset != null) {
                   rset.close();
                   rset = null;
               }
               // 关闭ps并释放资源
               if (ptmt != null) {
                   ptmt.close();
                   ptmt = null;
               }
           } catch (SQLException e) {
               System.err.println(e.getMessage());
           }
       }
       return collection;
   }

   public Collection get(final ResultSet result, final Class clazz) {
       // 创建collection
       Collection collection = null;
       try {
           ResultSetMetaData rsmd = result.getMetaData();
           // 获得数据列数
           int cols = rsmd.getColumnCount();
           // 创建等同数据列数的arraylist类型collection实例
           collection = new ArrayList(cols);
           // 遍历结果集
           while (result.next()) {
               // 创建对象
               Object object = null;
               try {
                   // 从class获得对象实体
                   object = clazz.newInstance();
               } catch (Exception e) {
               }
               // 循环每条记录
               for (int i = 1; i <= cols; i++) {
                   beanRegister(object, rsmd.getColumnName(i), result
                           .getString(i));
               }
               // 将数据插入collection
               collection.add(object);
           }
       } catch (SQLException e) {
           System.err.println(e.getMessage());
       } finally {

       }
       return collection;
   }

   public static void main(String[] args) {
       try {
           Class.forName("org.gjt.mm.mysql.Driver");
       } catch (ClassNotFoundException e) {
           e.printStackTrace();
       }
       String url = "jdbc:mysql://localhost:3306/test?useUnicode=true";
       Connection connection = null;
       PreparedStatement ps = null;
       ResultSet rs = null;
       try {
           connection = DriverManager.getConnection(url, "root", "xxxx");
           ConnectionTest test = new ConnectionTest();
           // Ltest是我测试用类,实际操作请注入相关对象,支持set,get,is,read,writer为前缀数据对,更多请继续添加。
           Collection collection = test.get(connection, Ltest.class,
                   "select * from ltest");
           for (Iterator it = collection.iterator(); it.hasNext();) {
               Ltest ltest = (Ltest) it.next();
               System.out.println(ltest.getId() + ":" + ltest.getName());
           }
       }
       // SQL异常,用于抛出SQL语句处理中所引发的错误。
       catch (SQLException e) {
           System.err.println(e.getMessage());
       }
       // finally,此标识用以包含必须访问的内容。
       finally {
           try {
               // 关闭rs并释放资源
               if (rs != null) {
                   rs.close();
                   rs = null;
               }
               // 关闭ps并释放资源
               if (ps != null) {
                   ps.close();
                   ps = null;
               }
               // 关闭connection并释放资源
               if (connection != null) {
                   connection.close();
                   connection = null;
               }
               // 如果关闭时产生异常将由此抛出
           } catch (SQLException e) {
               System.err.println(e.getMessage());
           }

       }
   }
}
________________________
前一阵写loonframework-db时,写过类似的处理方法,只不过为了效率我都是直接操作的数组对象,现改为集合对象,减少了一些处理,但大体流程如此。我框架中cache一直没有做完,所以没有为您添加,您可以用map之类做一个简单的cache来使用,目前万条数据会较慢于 ResultSet,但是可以正常使用。
分享到:
评论
1 楼 naicj 2012-04-23  
楼主,可不可以给一个Ltest类啊,缺少Ltest类

相关推荐

    ResultSet 转为listmap

    ResultSet 转为 List ResultSet 转为 List&lt;Map&gt; 是一种常见的数据处理操作。在 Java 中,使用 JDBC 连接数据库时,通常会返回一个 ResultSet 对象,该对象包含了查询结果集的所有记录。为了方便数据处理和使用,...

    通过反射从数据库返回集合ResultSet中得到实体对象的list集合

    通过反射从数据库返回集合ResultSet中得到实体对象的list集合

    ResultSet对象获取数据的各种方法

    ### ResultSet对象获取数据的各种方法 在Java编程语言中,`ResultSet`对象是处理数据库查询结果的核心组件之一。它充当一个可滚动的、可更新的数据表,用于存储从数据库执行SQL语句后返回的结果集。本文将详细介绍...

    ResultSet

    当你执行SQL查询并从数据库获取数据时,结果会被封装在ResultSet对象中。在本篇文章中,我们将深入探讨ResultSet的主要概念、操作方法以及相关知识点。 1. ResultSet的创建:ResultSet对象是由Statement或...

    java数据库连接ResultSet

    在使用 ResultSet 之前,需要先执行 SQL 语句,并将结果存储到 ResultSet 对象中。例如: ```java java.sql.Statement stmt = conn.createStatement(); ResultSet r = stmt.executeQuery("SELECT a, b, c FROM ...

    javaResultSet常用方法.pdf

    在使用ResultSet之前,需要首先创建一个Statement对象,该对象将生成具有给定类型和并发性的ResultSet对象。Statement对象可以通过createStatement()方法或prepareStatement()方法创建,例如: ```java Statement ...

    JDBC基础教程之ResultSet对象.doc )

    ### JDBC基础教程之ResultSet对象详解 #### 一、ResultSet对象概览 `ResultSet`对象是Java Database Connectivity (JDBC) API中的一个核心组件,用于处理SQL查询结果。它充当了一个临时的数据存储,其中包含了所有...

    数据库实体对象转换JavaBean_数据库对象转Javabean_

    本文将详细讲解如何将数据库实体对象转换为Java Bean对象,以实现数据的有效封装和处理。 首先,我们需要理解数据库实体对象和Java Bean的概念。数据库实体对象通常指的是在数据库中的一条记录,它包含了表中的所有...

    支持ResultSet的JTable

    2. **SQL查询**:执行`Statement`或`PreparedStatement`对象的`executeQuery()`方法来执行SQL查询,这会返回一个`ResultSet`对象。 3. **处理ResultSet**:`ResultSet`是一个游标,可以按照顺序读取查询结果。我们...

    Blog-Art.-09-Java-ResultSet-To-List:将结果集转换为地图对象列表

    Blog-Art.-09-Java-ResultSet-To-List 将ResultSet转换为Map对象的列表。 JdbcUtil类与静态方法一起使用。 该项目是使用NetBeans 8开发的。 环聊SpringMVC: ://youtu.be/clBK-R8LChM Spring-MYBATIS: ://youtu.be...

    ResultSet转化为json,json转化为List

    2. 创建一个Java对象来映射ResultSet中的数据: 假设我们的ResultSet包含用户信息,我们可以创建一个User类: ```java public class User { private String name; private int age; // 构造方法,getters和...

    JAVA 版本ResultSet 转换为JAVABEAN的工具类

    在Java编程中,ResultSet是处理数据库查询结果的主要接口,它由Statement或PreparedStatement对象执行SQL查询后返回。而JavaBean是一种符合特定规范的Java类,通常用于封装数据,便于数据的传输和操作。当我们从...

    resultset2xml

    在IT行业中,数据库查询结果通常以ResultSet对象的形式返回,它是一种存储查询结果的接口,源自Java的JDBC(Java Database Connectivity)API。当需要将这些数据转换为XML格式时,以便于数据交换、存储或进一步处理...

    poi根据ResultSet到处Excle源码

    将ResultSet转换为Excel,首先需要创建一个HSSFWorkbook对象(对于.xls文件)或XSSFWorkbook对象(对于.xlsx文件),然后通过创建Sheet对象来创建Excel工作表。接着,遍历ResultSet,为每一行数据创建Row对象,并在...

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

    将ResultSet中得到的一行或多行结果集封装成对象的实例 将ResultSet中得到的一行或多行结果集封装成对象的实例是指在使用JDBC连接数据库时,将查询结果集转换成对象的实例,以便更方便地访问和操作数据库中的数据。...

    ResultSet的属性

    当执行SQL查询后,结果会被封装成ResultSet对象,允许我们逐行遍历并访问查询返回的数据。在处理ResultSet时,了解其属性和元数据是至关重要的。 ResultSetMetaData是另一个关键接口,它提供了关于ResultSet中列的...

    Java-JDBC【源码】实现ORM,结果集映射实体类(ResultSet、注解、反射)

    Java-JDBC【之】实现ORM,结果集映射实体类(ResultSet、注解、反射) 1.ORM实现思路 2.@Table、@Column、标识实体类 2.1.创建注解 @Table、@Column 2.2.标识实体类 2.3.数据库表 3.结果集解析,注解加反射填充实体...

    ResultSet用法集锦

    `Statement`或`PreparedStatement`对象执行SQL后,会返回一个`ResultSet`。你可以通过设置`Statement`的属性来改变`ResultSet`的行为,例如设置其类型和并发性。 8. 实用工具和库: 一些第三方库如Apache Commons ...

    ResultSet_to_json.jar

    标签“O2J ResultSe Json”可以解释为“Object to JSON Result Set”,暗示了该程序专注于将Java对象(如ResultSet)转换为JSON格式。"ResultSe"可能是"ResultSet"的简写,而"Json"则代表JSON。 压缩包中的文件是该...

    获得结果集的字段名称_ResultSet的属性要调用ResultSetMetaData的方法

    通过调用ResultSet对象的getMetaData()方法,可以获取ResultSetMetaData对象,然后使用该对象的方法来获取结果集的字段名称和其他信息。 下面是一些常用的ResultSetMetaData方法: 1. getColumnCount():返回...

Global site tag (gtag.js) - Google Analytics