JAVA概述
第一部分:java入门基础
第二部分:java常用类
第三部分:jdbc系列教程
第四部分:java高级特征
java8新特征详解
java文件操作专题教程

知识点

相关文章

更多

最近更新

更多

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

2019-03-28 00: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

相关问答

更多
  • 反射很常用,所有framework都会用到反射;克隆很少用
  • 对不起答案我没有,我想作业上的题对你来说是很简单的,你只是不想做而已,自己要多总结多思考,这样作业对你才能起到提高的作用,作业是对你学过的知识的巩固和加深了解,请你千万不要把它当成负担。
  • WDCP 隐藏Nginx版本号教程各大门户都隐藏nginx的版本号 他们如此做必有道理所以我们也学习吧总共两步!第一步:先到 /www/wdlinux/nginx-1.4.1(我升级了版本)/conf 下 找到 nginx.conf 文件然后打开找到 tcp_nodelay on;在下面那一行添加 server_tokens off; 即可如:keepalive_timeout60; tcp_nodelay on;server_tokens off;这样就行了 (高手别笑,教程本来就是要方便简便)第二步:如 ...
  • 您链接的文档适用于非常老的驱动程序。 最近版本的Oracle JDBC驱动程序文档在使用结果集元数据扩展中明确指出: oracle.jdbc.OracleResultSetMetaData接口符合JDBC 2.0标准,但不实现getSchemaName和getTableName方法,因为Oracle数据库不能实现这一点。 换句话说,你不能为Oracle获取这些数据。 The documentation you link is for a very old driver. A recent version o ...
  • 如果有多个用户(线程)竞争资源,则需要尝试使用资源,例如在多用户Web应用程序中。 在这些情况下, close()实际上不会关闭连接,它只会将其返回到池中,因此可供其他线程检出。 如果您正在创建单个用户Swing应用程序,那么将Connection保持打开状态并不会有害,因为您是唯一使用它的人。 A try-with-resources is necessary if there are multiple users (threads) competing for the resource, such as ...
  • 您正在查看这些结果,因为它是UNION查询。 这样的查询完全有可能做类似的事情 SELECT Col1 AS Field1 FROM Table1 UNION SELECT Col2 AS Field1 FROM Table2 在这种情况下,如果getColumnName尝试返回结果中基础列的名称,则没有单一的“正确”答案:它应该返回“Col1”还是“Col2”? 由于UNION查询的结果集中的任何列都可以从多个基础列派生,因此getColumnName只能返回该列的有效名称,即上例中的Field1 。 ...
  • 得到它了。 答案是搜索“获取列别名”: http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSetMetaData.html 变成: ResultSetMetaData md = rs.getMetaData(); int columns = md.getColumnCount(); ArrayList list = new ArrayList(50); while (rs.next()){ ...
  • Oracle无法基于视图或count(*)返回类型,因为它未显式声明。 您的视图可以返回任何精度或比例,具体取决于视图的底层表。 要解决此问题,您需要在查询或视图中强制转换类型,如下所示: select CAST (count(*) AS NUMBER(30)) Oracle can not return a type based on a view or the count(*) as it was not explicitly declared. Your view could return any ...