`

将jdbc结果集转换成对象列表

    博客分类:
  • J2SE
阅读更多
将jdbc结果集转换成对象列表
估计hibernate就是用得这种方式进行转换的。
实体对象
package test;
//实体对象,该对象的属性与数据库中的字段相同,当然可以改变具体看需求
public class Person {
	private int id;
	private int age;
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}


package test;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

public class Main {
	//用于测试的方法
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, ClassNotFoundException {
		Connection conn = DbUtils.getConn();
		ResultSet rs = null;
		PreparedStatement psmt = null;
		System.out.println(conn);
		try {
			psmt = conn.prepareStatement("select * from person");
			rs = psmt.executeQuery();
			List list = DbUtils.populate(rs, Person.class);
			for(int i = 0 ; i<list.size() ; i++){
				Person per = (Person) list.get(i);
				System.out.println("person : id = "+per.getId()+" name = "+per.getName()+" age = "+per.getAge());
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			if(rs!=null){
				try {
					rs.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				rs=null;
			}
			if(psmt!=null){
				try {
					psmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				psmt=null;
			}
			if(conn!=null){
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
				conn=null;
			}
		}
		
	}

}


具体的工具类
package test;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class DbUtils {
	private static String url = "jdbc:mysql://localhost:3306/test";
	private static String username = "root";
	private static String password = "";
	private static String driverClass = "com.mysql.jdbc.Driver";
	//没什么好说的,获取数据库连接
	public static Connection getConn(){
		Connection conn = null;
		try {
			Class.forName(driverClass);
			conn = DriverManager.getConnection(url,username,password);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return conn;
	}
	/*
	 * 将rs结果转换成对象列表
	 * @param rs jdbc结果集
	 * @param clazz 对象的映射类
	 * return 封装了对象的结果列表
	 */
	public static List populate(ResultSet rs , Class clazz) throws SQLException, InstantiationException, IllegalAccessException{
		//结果集的元素对象 
		ResultSetMetaData rsmd = rs.getMetaData();
		//获取结果集的元素个数
		 int colCount = rsmd.getColumnCount();
//		 System.out.println("#");
//		 for(int i = 1;i<=colCount;i++){
//			 System.out.println(rsmd.getColumnName(i));
//			 System.out.println(rsmd.getColumnClassName(i));
//			 System.out.println("#");
//		 }
		 //返回结果的列表集合
		 List list = new ArrayList();
		 //业务对象的属性数组
		 Field[] fields = clazz.getDeclaredFields();
		 while(rs.next()){//对每一条记录进行操作
			 Object obj = clazz.newInstance();//构造业务对象实体
			 //将每一个字段取出进行赋值
			 for(int i = 1;i<=colCount;i++){
				 Object value = rs.getObject(i);
				 //寻找该列对应的对象属性
				 for(int j=0;j<fields.length;j++){
					 Field f = fields[j];
					 //如果匹配进行赋值
					 if(f.getName().equalsIgnoreCase(rsmd.getColumnName(i))){
						 boolean flag = f.isAccessible();
						 f.setAccessible(true);
						 f.set(obj, value);
						 f.setAccessible(flag);
					 }
				 }
			 }
			 list.add(obj);
		 }
		return list;
	}
}

分享到:
评论
1 楼 u010778233 2016-08-26  
写得很不错,已经用起来了,谢谢

相关推荐

    JDBC 3.0数据库开发与设计

    目录 第1章 JDBC概述 1.1 JDBC简介 1.2 JDBC3.0规范 1.3 JDBC3.0 API的新特点 1.3.1 JDBC 3.0 API的一致性 ...9.3.2 将数据库的图象二进制数据显示成图片 9.4 Java开发中的其他技术 9.5 本章小结

    DbUtils应用开发例子--DbUtilsExample.zip

    3.BeanListHandlerExample.java,演示BeanListHandler如何使用,BeanListHandler实现类将结果集转换成指定对象类型的集合。 4.InsertUpdateExample.java,演示如何执行添加和更新。 5.ResultSetHandlerExample.java,...

    40道MyBatis面试题带答案(很全)

    MyBatis对JDBC访问数据库的过程进行了封装,简化了JDBC代码,解决了JDBC将结果集封装为Java对象的麻烦。对查询SQL执行后返回的ResultSet对象,Mybatis会帮我们处理,转换成Java对象。 此外,MyBatis还支持自定义SQL...

    jdbc操作文档,数据库基本操作文档集合

    MySQl语句 show databases; 打开数据库 create database 数据库名; 新建数据库 use 数据库名; 使用数据库 ...(1).to_char:转换成字符串 a. 日期转换..............................后面文档自己下载

    commons-dbutils-1.6.jar包

    BeanProcessor BeanProcessor匹配列明到Bean属性名,并转换结果集列到Bean对象的属性中. DbUtils 一个JDBC辅助工具集合. ProxyFactory 产生JDBC接口的代理实现. QueryLoader 属性文件加载器,主要用于加载属性文件中...

    Java连接数据库的综合类

    ResultSetHandle:封装数据的策略对象------将封装结果集中的数据,转换到另一个对象 策略:封装数据到对象的方式(示例:将数据库保存在User、保存到数组、保存到集合) 方法介绍:handle(ResultSet rs)

    DatasourceToPojoMapper

    鉴于数据库遵循大写-下划线命名约定,名称与 java 对象字段名称匹配,因此可以方便地将行从 JDBC 结果集转换为 java 对象。 IE 数据库表名和列名 USER_DETAIL.USER_ID USER_DETAIL.NUMERICAL_ID USER_DETAIL.FIRST_...

    mybatis面试题(经典问答)

    Mybatis 省去了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 Mybatis 可以通过简单的 XML 或注解将原始类型、接口和 Java POJO(plain old Java objects)配置和映射为数据库中的记录。 3.什么是ORM? ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     18.4.5 查询结果转换器  18.5 查询性能优化  18.5.1 iterate()方法  18.5.2 查询缓存  18.6 小结  18.7 思考题 第19章 Hibernate高级配置  19.1 配置数据库连接池  19.1.1 使用默认的数据库连接池  19.1.2...

    Java开发常用jar包

    1.commons-beanutils.jar...12.commons-DbUtils.jar:Apache组织提供的一个资源JDBC工具类库,它是对JDBC的简单封装,对传统操作数据库的类进行二次封装,可以把结果集转化成List。 13.commons-Email.jar: 提供开源的API

    通用工具类

    2.JDBC工具类,提供数据库连接池,结果集映射成对象功能 3.常用加密算法工具类,包括MD5、SHA、DES、HMAC、Base64等 4.RSA加解密,RSA签名、签名验证类 5.文件处理工具类,实现文件的复制、移动、查找、追加内容等。...

    List<Map>转化为List工具类

    一般使用springjdbc、hibernate的sql查询,库获取到的数据都是List, Object&gt;&gt;结果集,如果我们要转化为JavaBean,则需要做一系列的map.get(),然后obj.set()。 此工程中就是解决List, Object&gt;&gt;转化为JavaBean工具类...

    项目管理-Mybatis学习源码(三)

    结果集映射:MyBatis 能够将查询结果自动映射到 Java 对象上,无需手动解析和转换结果集。 动态 SQL:MyBatis 提供了强大的动态 SQL 功能,可以根据条件动态生成不同的 SQL 语句,减少了代码冗余和提高了灵活性。 ...

    项目管理-mybatis学习源码(二)

    结果集映射:MyBatis 能够将查询结果自动映射到 Java 对象上,无需手动解析和转换结果集。 动态 SQL:MyBatis 提供了强大的动态 SQL 功能,可以根据条件动态生成不同的 SQL 语句,减少了代码冗余和提高了灵活性。 ...

    项目管理-Mybatis学习源码(一)

    结果集映射:MyBatis 能够将查询结果自动映射到 Java 对象上,无需手动解析和转换结果集。 动态 SQL:MyBatis 提供了强大的动态 SQL 功能,可以根据条件动态生成不同的 SQL 语句,减少了代码冗余和提高了灵活性。 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     18.4.5 查询结果转换器  18.5 查询性能优化  18.5.1 iterate()方法  18.5.2 查询缓存  18.6 小结  18.7 思考题 第19章 Hibernate高级配置  19.1 配置数据库连接池  19.1.1 使用默认的数据库连接池  19.1.2...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     18.4.5 查询结果转换器  18.5 查询性能优化  18.5.1 iterate()方法  18.5.2 查询缓存  18.6 小结  18.7 思考题 第19章 Hibernate高级配置  19.1 配置数据库连接池  19.1.1 使用默认的数据库连接池  19.1.2...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     18.4.5 查询结果转换器  18.5 查询性能优化  18.5.1 iterate()方法  18.5.2 查询缓存  18.6 小结  18.7 思考题 第19章 Hibernate高级配置  19.1 配置数据库连接池  19.1.1 使用默认的数据库连接池  19.1.2...

    Java核心技术II(第8版)

    8.3.1 将Bean打包成JAR文件 8.3.2 在开发环境中组合Bean 8.4 Bean属性与事件的命名模式 8.5 Bean属性的类型 8.5.1 简单属性 8.5.2 索引属性 8.5.3 绑定属性 8.5.4 约束属性 8.6 BeanInfo类 8.7 属性编辑器 8.7.1 ...

Global site tag (gtag.js) - Google Analytics