利用反射及JDBC元数据编写通用查询方法
元数据:描述数据的数据,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元数据编写通用查询方法的更多相关文章
- Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法
先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 ...
- JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法
JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 * 可以由Connection得到 */ 具体的应用代码: @Te ...
- 【转】JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法
转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 ...
- <五>JDBC_利用反射及JDBC元数据编写通用的查询方法
此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...
- MYSQL 之 JDBC(六): 增删改查(四)利用反射及JDBC元数据编写通用的查询
1.先利用SQL进行查询,得到结果集2.利用反射创建实体类的对象:创建Student对象3.获取结果集的列的别名:idCard.studentName4.再获取结果集的每一列的值,结合3得到一个Map ...
- 利用反射及jdbc元数据实现通用的查询方法
---------------------------------------------------------------------------------------------------- ...
- 利用反射和JDBC元数据实现更加通用的查询方法
package com.at221.jdbc; import java.io.IOException; import java.io.InputStream; import java.sql.*; i ...
- JDBC--利用反射及JDBC元数据编写通用的查询方法
1.JDBC元数据(ResuleSetMetaData):描述ResultSet的元数据对象,可以从中获取到结果集中的列数和列名等: --使用ResultSet类的getMetaData()方法获得R ...
- java攻城狮之路--复习JDBC(利用BeanUtils、JDBC元数据编写通用的查询方法;元数据;Blob;事务;批量处理)
1.利用BeanUtils的前提得要加入以下两个jar包: commons-beanutils-1.8.0.jar commons-logging-1.1.1.jar package com.shel ...
随机推荐
- QT快速使用ntohs
QT快速使用ntohs,需要注意3点:1. ntohs只是转换相邻的2个字节2. 引入头文件#include <windows.h>3. 需要加上win32{LIBS+=-lws2_32} ...
- Ubuntu中查看32还是64
安装ubuntu在pc上,不推荐在32位pc安装64位操作系统,64位pc安装32位操作系统 方法/步骤 1 按ctrl+shift+t 快捷键,打开终端,输入sudo uname --m ,按下 ...
- Map/Reduce个人实战--生成数据测试集
背景: 在大数据领域, 由于各方面的原因. 有时需要自己来生成测试数据集, 由于测试数据集较大, 因此采用Map/Reduce的方式去生成. 在这小编(mumuxinfei)结合自身的一些实战经历, ...
- linux常见目录的作用
根目录下的bin 和sbin,usr目录下的bin和sbin四个都是保存系统命令.bin下的普通用户都可以使用,sbin下只有超级用户root可以使用 pro和syc不能直接操作,是内存的过载点 / ...
- iwork 09 可以用的序列号
E4RJ-YKHP-9ER4-WK9Y-H4UM-5S2G9MU-9U9J-KN4M-4PAE-DYNA-5S2EGMU-3PKP-NN9G-3JW4-3RAD-5S2
- CCombox使用
1.得到选中的combox的文本信息 int nIndex = m_SType.GetCurSel();//样本类型 m_SType.GetLBText(nIndex, m_data->STyp ...
- 不同操作系统上屏蔽oracle的操作系统认证方式
windows系统上>如果不想用户通过操作系统验证方式登录,可以修改 sqlnet.ora文件,把 SQLNET.AUTHENTICATION_SERVICES=NTS 前面加#注释掉就可以了. ...
- 【线性代数】 06 - Jordan标准型
现在就来研究将空间分割为不变子空间的方法,最困难的是我们还不知道从哪里着手.你可能想到从循环子空间出发,一块一块地进行分割,但这个方案的存在性和唯一性都不能解决.不变子空间分割不仅要求每个子空间\(V ...
- 使Maven 2在package、install等阶段跳过运行Test的配置
方法1: To skip running the tests for a particular project, set the skipTests property to true.<proj ...
- Java学习总结(二)----Java语言基础
1. Java语言基础 2.1 关键字 定义:被java语言赋予特殊含义的单词 特点:关键字中的字母都为小写 用于定义数据类型的关键字 class,interface,byte,short,i ...