利用反射及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 ...
随机推荐
- Appcan跨域交互
案例1,sina微博登录,没有插件,因此采用web方式,我首先打开https://api.weibo.com/oauth2/authorize--,然后我想增加 一个取消按钮: 1 首先打开sina ...
- 二模 (15)day2
第一题:Alice和Bob两个人正在玩一个游戏,游戏有很多种任务,难度为p的任务(p是正整数),有1/2p 的概率完成并得到2p−1分,如果完成不了,得0分.一开始每人都是0分,从Alice开始轮流做 ...
- [Weekly] 2014.03.01-2014.03.08
这周写过好多东西,虽然还没有完全弄明白线段树,但是progress还是有的! 不过有时候真的很想哭,因为自己的梦想连别人看看韩剧.无所事事还要分量轻,实在不明白政治课的Teamwork意义何在,花两分 ...
- HTML中head里的内容经浏览器解析后全到body里
我从linux服务器nginx上把一个网站迁移到windows的IIS上数据什么的都么有问题,配置好rewrite以后,访问网站,发现样式变动了,网站上方空出了一块我用chrome浏览器的审查元素一看 ...
- js动画之简单运动二
透明度的变化 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- RDMA的ibv_post_send() 函数
函数原型为 int ibv_post_send(struct ibv_qp *qp, struct ibv_send_wr *wr, struct ibv_send_wr **bad_wr); 其中s ...
- JavaScript基础--事件驱动和访问CSS技术(十)
1.原理: 2.快速入门案例 js中的事件主要分为4种: 案例:监听鼠标点击事件,并能够显示鼠标点击的位置x,y <script language="javascript" ...
- 【LeetCode OJ】Path Sum
Problem Link: http://oj.leetcode.com/problems/path-sum/ One solution is to BFS the tree from the roo ...
- Linux------小网盘(1)
一:要求 利用Linux Socket进行文件传输,本次只支持client端向sever端上传文件 二:实现提示: client.c client的参数有两个,分别是服务器主机名和端口: 在while ...
- C# 多线程同步和线程通信
多线程通信 1. 当线程之间有先后的依赖关系时,属于线程之间的通信问题.也就是后一个线程要等待别的一个或多个线程全部完成,才能开始下一步的工作.可以使用: WaitHandle Class WaitH ...