JDBC学习笔记(16):利用反射技术奖查询结果封装为对象

 1 package com.xxyh.jdbc;
 2 import java.lang.reflect.InvocationTargetException;
 3 import java.lang.reflect.Method;
 4 import java.sql.Connection;
 5 import java.sql.PreparedStatement;
 6 import java.sql.ResultSet;
 7 import java.sql.ResultSetMetaData;
 8 import java.sql.SQLException;
 9 import com.xxyh.jdbc.domain.User;
10 public class ORMTest {
11
12     public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, SQLException {
13         User user = getUser("select id as Id, name as Name, birthday as Birthday, money as Money from user where id=1");
14         System.out.println(user);
15     }
16
17     static User getUser(String sql) throws SQLException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
18         Connection conn = null;
19         PreparedStatement ps = null;
20         ResultSet rs = null;
21         try {
22             conn = JdbcUtils.getConnection();
23             ps = conn.prepareStatement(sql);
24             rs = ps.executeQuery();
25
26             ResultSetMetaData rsmd = rs.getMetaData();
27             int count = rsmd.getColumnCount();
28             String[] colNames = new String[count];
29             for (int i = 1; i <= count; i++)
30                 colNames[i-1] = rsmd.getColumnLabel(i);
31
32             User user = null;
33
34             if (rs.next()) {
35                 user = new User();
36                 for (int i = 0; i < colNames.length; i++) {
37                     String colName = colNames[i];
38                     String methodName = "set" + colName;
39                     Method[] methods = user.getClass().getMethods();
40                     for (Method method : methods) {
41                         if (methodName.equals(method.getName())) {
42                             method.invoke(user, rs.getObject(colName));
43                         }
44                     }
45                 }
46             }
47             return user;
48         } finally {
49             JdbcUtils.close(rs, ps, conn);
50         }
51
52     }
53 }

【运行结果】:

[1,zhangs,1985-01-01,360.0]

注意:输出结果显示如上情形是由于User的toString方法经过重写:

@Override
public String toString() {
    return "[" + getId() + "," + getName() + "," + getBirthday() + "," + getMoney() + "]";
}

通过使用泛型提高程序的通用性,getObject方法与具体的类无关:

 1 package com.xxyh.jdbc;
 2 import java.lang.reflect.InvocationTargetException;
 3 import java.lang.reflect.Method;
 4 import java.sql.Connection;
 5 import java.sql.PreparedStatement;
 6 import java.sql.ResultSet;
 7 import java.sql.ResultSetMetaData;
 8 import java.sql.SQLException;
 9 import com.xxyh.jdbc.domain.User;
10 public class ORMTest {
11
12     public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, SQLException, InstantiationException {
13         User user = (User) getObject("select id as Id, name as Name, birthday as Birthday, money as Money from user where id=2",User.class);
14         System.out.println(user);
15     }
16
17     static Object getObject(String sql, Class<?> clazz) throws SQLException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
18         Connection conn = null;
19         PreparedStatement ps = null;
20         ResultSet rs = null;
21         try {
22             conn = JdbcUtils.getConnection();
23             ps = conn.prepareStatement(sql);
24             rs = ps.executeQuery();
25
26             ResultSetMetaData rsmd = rs.getMetaData();
27             int count = rsmd.getColumnCount();
28             String[] colNames = new String[count];
29             for (int i = 1; i <= count; i++)
30                 colNames[i-1] = rsmd.getColumnLabel(i);
31
32             Object object = null;
33             Method[] methods = clazz.getMethods();
34             if (rs.next()) {
35                 object = clazz.newInstance();// 创建一个对象
36                 for (int i = 0; i < colNames.length; i++) {
37                     String colName = colNames[i];
38                     String methodName = "set" + colName;
39                     for (Method method : methods) {
40                         if (methodName.equals(method.getName())) {
41                             method.invoke(object, rs.getObject(colName));
42                         }
43                     }
44                 }
45             }
46             return object;
47         } finally {
48             JdbcUtils.close(rs, ps, conn);
49         }
50
51     }
52 }

【运行结果】:

[2,lisi,1986-01-01,900.0]

时间: 2024-10-25 13:52:11

JDBC学习笔记(16):利用反射技术奖查询结果封装为对象的相关文章

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

转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 * 可以由Connection得到 */ 具体的应用代码: 1 @Test 2 public void testDatabaseMetaData(){ 3 Connection connection=null; 4 ResultSet resultSet=null; 5 try { 6 conne

MongoDB 学习笔记(二) 之查询

最简单的查询 个人认为mongoDB是面向对象的吧. 例如最简单的查询  整个数据集只有三条数据 第一查询姓名为张三的  数据 查询的条件比较好写 随意   db.collection.find(查询条件)   例如 15 得到的结果是这样 如果你不想返回某个字段呢 ,你可以自己定义返回的字段值 语法这样 db.collection.find({查询条件},{返回字段}) 16 我们看到每次查询 "_id" 这个字段 都返回  我们可以将它设置为0 这样的话就不会返回 如 查询条件里的

学习笔记:利用GDI+生成简单的验证码图片

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 学习笔记:利用GDI+生成简单的验证码图片 1 /// <summary> 2 /// 单击图片时切换图片 3 /// </summary> 4 /// <param name="sender">&

springmvc学习笔记(16)-异常处理器

springmvc学习笔记(16)-异常处理器 springmvc学习笔记16-异常处理器 异常处理思路 自定义异常类 全局异常处理器 错误页面 在springmvcxml配置全局异常处理器 异常测试 本文主要介绍springmvc中异常处理的思路,并展示如何自定义异常处理类以及全局异常处理器的配置 异常处理思路 系统中异常包括两类: 预期异常 运行时异常RuntimeException 前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生. 系统的dao

MongoDB 学习笔记(二) 高级查询

1.条件运算符 2.$all 匹配所有 3.$exists 判断字段是否存在 4.NUll 值处理 5.$mod 取模处理 6.$ne 不等于 7. $in 包含,与sql用法相同 8. $nin 不包含,与sql用法相同 9.$size 数组个数 10.正则表达式 11.$where 查询 12.javascript 查询 13.Count.skip. limit 14.sort 排序 15.游标 16.存储过程 javascript 写法 MongoDB 学习笔记(二) 高级查询

python基础教程_学习笔记16:标准库:一些最爱——random

标准库:一些最爱 random random模块包括返回随机数的函数,可以用于模拟或者用于任何产生随机输出的程序. 事实上,所产生的数字都是伪随机数,它们以一个可预测的系统作为基础,除非是为了强加密的目标,否则这些随机数还是足够随机的.如果真的需要随机性,可以使用os模块的urandom函数. 重要函数 函数 描述 random() 返回0<=n<1之间的随机实数n,其中0<n<=1 getrandbits(n) 以长整型形式返回n个随机位(二进制数) uniform(a,b) 返

linux学习笔记二:硬盘信息查询

在linux管理中,硬盘管理是很重要的一部分.包括阵列,分区,逻辑卷等操作,在对硬盘操作前,需要充分的了解硬盘的信息.常用的硬盘查询有以下几种: 1.df  查看文件系统空间使用情况: linux-lszd-db:~ # dfFilesystem     1K-blocks     Used Available Use% Mounted on/dev/sda6      809262496 37615092 770825244   5% /udev             8076412    

Ext.Net学习笔记16:Ext.Net GridPanel 折叠/展开行

Ext.Net学习笔记16:Ext.Net GridPanel 折叠/展开行 Ext.Net GridPanel的行支持折叠/展开功能,这个功能个人觉得还说很有用处的,尤其是数据中包含图片等内容的时候. 下面来看看效果: 使用行折叠/展开功能之后,在Ext.Net GridPanel的行头会出现一个展开图标,点击图标以后能够将这一行展开: 使用XTemplate实现行折叠/展开 这是最简单的一种实现,我们只需要在GridPanel的定义中加入下面的代码: <Plugins> <ext:R

JDBC学习笔记(一)

public static void main(String[] args) { ResultSet rs = null; Statement stmt = null; Connection conn = null; try { /** * 1.加载JDBC驱动程序: * 加载目标数据库驱动到JVM * 成功加载后,会将Driver类的实例注册到DriverManager类 * oracle-Driver:oracle.jdbc.driver.OracleDriver * MySQL-Drive