JDBC系列教程之十四:用反射ResultSetMetaData将查询结果读入对象中

2013-08-31|来源: 领悟书生

反射入门参考源代码(ReflectTest.java)

l  用反射ResultSetMetaData将查询结果读入对象中(简单的O/RMapping)

        1)让SQL语句中列别名和要读入的对象属性名一样;

        2)通过ResultSetMetaData获得结果列数和列别名;

        3)通过反射将对象的所有setXxx方法找到;

        4)将3)找到的方法setXxx和2)找到的列别名进行匹配(即方法中的xxx于列别名相等);

        5)由上一步找到的方法和列别名对应关系进行赋值

        Method.invoke(obj,rs.getObject(columnAliasName));

ORMTest.java

package com.hyneng.jdbc;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

import com.hyneng.jdbc.domain.User;

/**

*

* 201-10-11

* @author HuangYineng

*

*/

public class ORMTest {

   /**

    * @param args

    * @throws Exception

    * @throws  InvocationTargetException

    * @throws  IllegalAccessException

    * @throws  SQLException

    */

   public static void main(String[] args) throws  SQLException,

          IllegalAccessException,  InvocationTargetException, Exception {

      User user = (User) getObject(

             "select id as Id, name as Name, birthday as Birthday, money as  Money  from user where id=1",

             User.class);

      System.out.println(user);

      Bean b = (Bean) getObject(

             "select id as Id, name as Name, birthday as Birthday, money as  Money from user where id=1",

             Bean.class);

      System.out.println(b);

   }

   static Object getObject(String sql,  Class clazz) throws SQLException,

          Exception, IllegalAccessException,  InvocationTargetException {

      Connection conn = null;

      PreparedStatement ps = null;

      ResultSet rs = null;

      try {

          conn = JdbcUtils.getConnection();

          ps = conn.prepareStatement(sql);

          rs = ps.executeQuery();

          String[] colNames = getColNames(rs);

          Object object = null;

          Method[] ms = clazz.getMethods();

          if (rs.next()) {

             object = clazz.newInstance();

             for (int i = 0; i < colNames.length; i++) {

                 String colName =  colNames[i];

                 String methodName = "set" + colName;

                 // Object value = rs.getObject(colName);

                 // try {

                 // Method m = clazz

                 // .getMethod(methodName, value.getClass());

                 // if (m != null)

                 // m.invoke(object, value);

                 // } catch (NoSuchMethodException e) {

                 // e.printStackTrace();

                 // //

                 // }

                 for (Method m : ms) {

                    if  (methodName.equals(m.getName())) {

                        m.invoke(object,  rs.getObject(colName));

                        break;

                    }

                 }

             }

          }

          return object;

      } finally {

          JdbcUtils.free(rs, ps,  conn);

      }

   }

}


本文链接:JDBC系列教程之十四:用反射ResultSetMetaData将查询结果读入对象中,转自请注明:http://www.656463.com/article/818

相关问答

更多

java中的反射和对象的克隆常用不?

反射很常用,所有framework都会用到反射;克隆很少用

mysql中如何在上一次的查询结果中再次查询

不太明白,按照您的思路,使用子查询就可以了。但是直接用and把查询条件联起来和使用子查询不是一样吗?如果是想把查询结果保存起来,下次查询的时候用,就建一个临时表。

android 怎么用反射获取对象

通过类名获取类。 Class serviceManager = Class.forName("Android.os.ServiceManager"); 获取方法 Method method = serviceManager.getMethod("getService", String.class); 调用方法 method.invoke(serviceManager.newInstance(), "phone"); 侯捷谈Java反射机制 http://blog.csdn.net/njchenyi ...

java中当表中没有记录,为空的时候,用jpa查询的结果返回的是null吗?

即使数据库表中的记录为空,jpa查询的结果也不是null,而是一个List列表对象数为空的列表。 你之所以查询结果为空,是因为使用hibernate(如果你是用hibernate作为jpa的实现框架的话)创建的service对象没有创建的缘故。为什么没有创建,请粘贴源代码分析一下。 很简单的道理,你的service这个对象没有初始化,或者叫没有创建。因为没有创建这个对象,所以也就没法调用find()这个方法,所以会抛出空指针异常,之所以model==null可以,是因为server.find()当 ...

易语言查询MySQL结果 显示在编辑框中

.版本 2 .支持库 mysql .版本 2 .子程序 _按钮1_被单击 .局部变量 记录集句柄, 整数型 .局部变量 临时, 文本型 执行SQL语句 (MySQL句柄, “SELECT item.name FROM item WHERE ID = '10'”) 子记录集句柄 = 取记录集 (MySQL句柄) .计次循环首 (取记录集行数 (记录集句柄), ) 读字段值 (记录集句柄, “name”, 临时) 编辑框1.内容 = 临时 到下一行 (记录集句柄) .计次循环尾 () 释放记录集 (记 ...

专题教程

JAVA概述
第一部分:java入门基础
第二部分:java常用类
第三部分:jdbc系列教程
第四部分:java高级特征
Gson教程
快速了解 jdk8 新特征

相关文章

更多

最近更新

更多