通过反射解析 jdbc中 的 ResultSet

private <T extends Object> T getResult(Class<?> className, String sql,
			String... params) {
		List<?> list = getResultList(className, sql, params);
		if (list != null && list.size() > 0) {
			return (T) list.get(0);
		}
		return null;
	}

	private <T extends List<?>> T getResultList(Class<?> className, String sql,
			String... params) {
		try {
			PreparedStatement st = conn.prepareStatement(sql);
			for (int i = 1; i <= params.length; i++) {
				st.setString(i, params[i - 1]);
			}
			List<Object> list = new ArrayList<>();
			ResultSet result = st.executeQuery();
			while (result.next()) {
				Object object = Class.forName(className.getName())
						.newInstance();
				Field[] fields = className.getFields();
				for (int i = 0; i < fields.length; i++) {
					Field field = fields[i];
					field.setAccessible(true);
					Class<?> typeClass = field.getType();
					Constructor<?> con = typeClass.getConstructor(typeClass);
					Object value = con.newInstance(result.getString(field
							.getName()));
					field.set(object, value);
				}
				list.add(object);
			}
			return (T) list;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

注意:类的变量名必须与数据表中的字段名相同.

时间: 2024-10-14 23:48:37

通过反射解析 jdbc中 的 ResultSet的相关文章

JDBC中的ResultSet

ResultSet:结果集.存放数据库中的数据,可以将它想象成一张数据表,通过Statement对象中的executeQuery()方法获得 import com.mysql.jdbc.Statement;import java.sql.Connection;import java.sql.Driver;import java.sql.ResultSet;import java.util.Properties; /** * Created by I am master on 2016/9/29.

为什么jdbc中的resultset只能取一次去第二次就报错了

引用 6 楼  的回复: 好吧各位,应该写getInt(1)但是我要问的是为什么第二次用会出错 啊,好古老的一个问题... 第二次出错的原因,是因为你创建Statement的时候,没有指定结果集(游标)模式! createStatement(int resultSetType, int resultSetConcurrency) resultSetType 就是结果集模式,取值范围是:ResultSet.TYPE_FORWARD_ONLY: cursor may move only forwar

[C#反射]C#中的反射解析及使用.

1.对C#反射机制的理解2.概念理解后,必须找到方法去完成,给出管理的主要语法3.最终给出实用的例子,反射出来dll中的方法 参考: C#反射,MSDN编程指南 反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等程序集内部的信息.使用反射可以看到一个程序集内部的接口.类.方法.字段.属性.特性等等信息.在System.Reflection命名空间内包含多个反射常用的类,下面表格列出了常用的几个类.类型               作用 Assembly        通过

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

先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 2 的对应的属性赋值:属性即为 Map 的键,值即为 Map 的值. 使用 JDBC 驱动程序处理元数据 Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信

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

我们的查询操作,对于不同的数据表examstudent和customers,会有不同的代码编写过程,利用反射和JDBC元数据可以编写通用的方法进行对不同数据表的查询. 在此之前我们是这样做的: 查询customers表中的字段以及字段值: 1 public Customer getCustomer(String sql, Object... args) { 2 Customer customer = null; 3 Connection connection = null; 4 Prepared

【转】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

通过query解析hibernate中的resultTransformer

任何包装jdbc的框架,都离不开将最终的数据封装成java对象的一个过程.在jdbc中,取得的数据被封装在resultset中,通过迭代resultset来一次次的取得相应的字段和数据值.数据库框架始终需要解决的问题在于将resultset中的字段名称信息和相应的字段值对应起来,然后封装成对象,最后将所有的对象形成一个集合,并最终返回给调用者.     任何数据库框架都逃不过这中间的处理逻辑,只不过如何将这些逻辑分散在上下的处理中.在Hibernate中,同样也有类似的东西,这个接口就叫做Res

JDBC课程5--利用反射及JDBC元数据(ResultSetMetaData)编写通用的查询方法

/**-利用反射及JDBC元数据编写通用的查询方法 * 1.先利用SQl语句进行查询,得到结果集--> * 2.查找到结果集的别名:id--> * 3.利用反射创建实体类的对象,创建author对象--> * 4.获取结果集的列的别名: id,nation,name * 5.再获得结果集的每一列的值, * 结合2得到一个map键值对: 键: 列的别名,值: 列的值: {id=1,nation=中国,name=莫言} * 6.再利用反射为2的对应的属性赋值,属性为Map 的键,值为Map

javaWeb_JDBC_面向对象编程在JDBC中的使用

jdbc中加入对象操作 1.改变 之前的操作都是使用sql语句对数据库中的表的字段进行一个操作,那个这一个改变的是对一个字段值的操作.那么我们在实际的开发中,使用的 是对对象的操作,也就是一条记录就是一个对象,字段就是这一个对象的对应属性,那么我们操作这一个对象的时候实际操作的是这一个数据库 中的记录. 2.操作步骤 (1).创建对象 创建的对象其实就是和数据库表中的字段一一对应. (2).创建数据库表 根据实体对象(也即是学生对象)编写数据库表以及对应的字段.[实体对象与数据库表之间的对应关系