元数据:描述数据的数据,ResultSetMetaData是描述ResultSet的元数据对象,从它可以得到数据集有多少了,每一列的列名。。。

ResultSetMetaData可以通过ResultSet类的getMetaData()获得。

ResultSetMetaData中的方法:

  ->getColumnCount():获取数据集有多少列

  ->getColumnLabel(int column):获取指定列的列名,索引从1开始

步骤:

1、利用sql进行查询,得到结果集,查询时应该给出列的别名,别名要和类的对象的属性名对应;

2、利用反射创建实体类的对象;

3、获取结果集的列的别名;

4、再获取结果集中每一列的值,结合步骤3得到一个Map,键为列名,值为对应的值;

5、利用反射给实体对象的属性赋值。

 public <T> T get(Class<T> clazz, String sql,Object ... args){
T entity = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null; try {
//1、进行sql查询,获取resultSet对象
connection = jdbcTools.getConnection();
preparedStatement = connection.prepareStatement(sql); for(i=0;i<args.length;i++){
preparedStatement.setObject(i+1,args[i]);
}
resultSet = preparedStatement.executeQuery(); //2、获取数据集元数据,即ResultSetMetaData对象
ResultSetMetaData rsmd = resultSet.getMetaData(); //3和4,获取列名和值,创建map对象
Map<String,Object> values = new HashMap<String,Object>(); while(resultSet.next()){
for(int i = 0;i<rsmd.getColumnCount();i++){ String columnLabel = rsmd.getColumnLabel(i+1);
Object columnValue = resultSet.getObject(columnLabel);
values.put(columnLabel,columnValue); }
} //5、创建实例,并通过反射赋值
entity = clazz.newInstance(); for(Map.Entry<String,Object> entry: values.entrySet()){
String fieldName = entry.getKey();
Object fieldValue = entry.getValue();
///反射工具类需要自己实现
//ReflectUtils.setFieldValue(entity,fieldName,fieldValue);
          BeanUtils.setProperty(entity,fieldname,fieldValue);
} }catch (Exception e){
e.printStackTrace(); }finally {
jdbcTools.releaseResource(resultSet,preparedStatement,connection);
}
return entity;
}

上面的方法是返回一个对象,如果需要返回多条记录,则需要重新写一个方法

  public <T> List<T> getForList(Class<T> clazz, String sql, Object...args) throws Exception{
List<T> list = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null; try{
connection = jdbcTools.getConnection();
preparedStatement = connection.prepareStatement(sql);
for(int i = 0;i<args.length;i++){
preparedStatement.setObject(i+1,args[i]);
} resultSet = preparedStatement.executeQuery();
ResultSetMetaData rsmd = resultSet.getMetaData();
List<Map<String,Object>> values = new ArrayList<Map<String, Object>>(); Map<String,Object> map = null; while(resultSet.next()){
map = new HashMap<String, Object>();
for(int i = 0;i< rsmd.getColumnCount();i++){
String fieldName = rsmd.getColumnLabel(i+1);
Object object = resultSet.getObject(i+1);
map.put(fieldName,object);
}
values.add(map);
} T bean = null;
if(values != null ){
for(Map<String,Object> m: values){
for(Map.Entry<String,Object> entry : m.entrySet()) {
String fieldName = entry.getKey();
Object fieldValue = entry.getValue();
bean = clazz.newInstance();
BeanUtils.setProperty(bean,fieldName,fieldValue); }
list.add(bean);
}
} }catch (Exception e){
e.printStackTrace();
}finally {
jdbcTools.releaseResource(resultSet,preparedStatement,connection);
} return list; }

利用反射及JDBC元数据编写通用查询方法的更多相关文章

  1. Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法

    先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 ...

  2. JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法

    JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 * 可以由Connection得到 */ 具体的应用代码: @Te ...

  3. 【转】JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法

    转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 ...

  4. <五>JDBC_利用反射及JDBC元数据编写通用的查询方法

    此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...

  5. MYSQL 之 JDBC(六): 增删改查(四)利用反射及JDBC元数据编写通用的查询

    1.先利用SQL进行查询,得到结果集2.利用反射创建实体类的对象:创建Student对象3.获取结果集的列的别名:idCard.studentName4.再获取结果集的每一列的值,结合3得到一个Map ...

  6. 利用反射及jdbc元数据实现通用的查询方法

    ---------------------------------------------------------------------------------------------------- ...

  7. 利用反射和JDBC元数据实现更加通用的查询方法

    package com.at221.jdbc; import java.io.IOException; import java.io.InputStream; import java.sql.*; i ...

  8. JDBC--利用反射及JDBC元数据编写通用的查询方法

    1.JDBC元数据(ResuleSetMetaData):描述ResultSet的元数据对象,可以从中获取到结果集中的列数和列名等: --使用ResultSet类的getMetaData()方法获得R ...

  9. java攻城狮之路--复习JDBC(利用BeanUtils、JDBC元数据编写通用的查询方法;元数据;Blob;事务;批量处理)

    1.利用BeanUtils的前提得要加入以下两个jar包: commons-beanutils-1.8.0.jar commons-logging-1.1.1.jar package com.shel ...

随机推荐

  1. SAP Adapter启动报错

    在启动Adapter的时候,抛出GateWay Service Exception 当时用的gateway service是“sapgw00” 解决方法:这是由于当sap系统向本机注册服务的时候出错, ...

  2. Swift语言—常量、变量、类型赋值

    常量:常量在作用域内不能被赋值且不会发生改变,只读不写,每个常量都必须有唯一的名字和内存空间:关键字:let   变量:变量在作用区域内可以它的值可以被改变,可读可写可覆盖,每个常量都必须有唯一的名字 ...

  3. 绑定hosts

    测试过程中需绑定hosts.将测试环境IP绑定域名,输入域名即可连接到测试环境. 1  hosts文件地址:C:\WINDOWS\system32\drivers\etc 2  用记事本打开hosts ...

  4. rails常用验证方法 (转)

    validates_presence_of       :login,  :message => "用户名不能为空!" validates_length_of         ...

  5. css中的display以及position属性

    我们都知道,元素分为行内元素和块级元素,在页面布局中,我们常常需要让行内元素具有块级元素的特性,或者使块级元素转换成行内元素,这就要使用我们的display属性了. 我们先定义三个div: 以上的三个 ...

  6. iOS学习之沙盒

    1.iOS沙盒 iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. 1 ...

  7. codeforces 446B(优先队列)

    题目链接:http://codeforces.com/problemset/problem/446/B #include<bits/stdc++.h> using namespace st ...

  8. Python12期培训班-day1-登陆验证代码分享

    #!/usr/bin/env python import sys import getpass afile = 'afile' bfile = 'bfile' circulation_num=0 #循 ...

  9. IOS7 ~ Xcode5 制作 framework

    一.Framework 简介(Introduction to Framework Programming Guide) Mac OS X 扩展了 framework 的功能,让我们能够利用它来共享代码 ...

  10. C#中的GDI+图形绘制方法

    GDI+图形绘制方法 1.首先对于绘制图形,必须的先将命名空间导入:using System.Drawing.Drawing2D; 2.然后在一个事件中写入程序 首先先将Graphics这个对象实例化 ...