将jdbc结果集转换成对象列表
估计hibernate就是用得这种方式进行转换的。
实体对象
具体的工具类
估计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;
- }
- }