将ResultSet中得到的一行或多行结果集封装成对象的实例

首先说一下这个使用场景,我们在使用jdbc连接数据库的时候,执行查询语句时候会得到一个结果集,如果想要再获取这个结果集中的值,就需要我们将他转换成一个对象,然后通过对象的get和set方法来获取到数据库中的值。

public class BaseDao <E> {
 private Class<?> cls;
 public BaseDao() {
 //得到父类的泛型
 Type sType=getClass().getGenericSuperclass();
 //得到实际的类型参数数组
 Type[] generics=((ParameterizedType) sType).getActualTypeArguments();
  //得到第一个泛型的Class
 cls=(Class<?>) (generics[0]);
 }
/**
	 * 单表多条查询,将查询到的多条记录传入一个对象,然后再将这些存入一个集合中,返回这个集合
	 * @param sql 传入对应的sql查询语句
	 * @param parameters 传入对应的占位符的值
	 * @return 返回查询到的记录转化成的对象的集合
	 */
    //Object...parameters是sql语句中对应的占位符的值,是一个不定长可变参数,我们需要写一个函数来获取他
	public List<E> list(String sql,Object...parameters) {
		Connection conn = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		List<E> list = new ArrayList<>();

		try {
			conn = JdbcUtil.getConnection();
			st = conn.prepareStatement(sql);
			setParameters(st, parameters);
			rs = st.executeQuery();
			while(rs.next()) {
        //将获取到的结果集存入一个对象中,这个我们也单独写一个函数来实现
				E obj = oneRowToObject(rs);
        //然后将对象存入一个集合中返回
				list.add(obj);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.closeAll(rs, st, conn);
		}
		return list;
	}

首先来写一下获取不定长可变参数的方法

/**
 * 设置占位符
 * @param st 预处理
 * @param parameters 占位符数组
     * @return 返回存储占位符对应的对象的数组
 */
 private void setParameters(PreparedStatement st, Object[] parameters) {
        //判断是否有结果集,结果集中是否有记录
 if(parameters!=null&&parameters.length>0) {
  for(int i=0;i<parameters.length;i++) {
  try {
   st.setObject(i+1,parameters[i] );
  } catch (SQLException e) {
   e.printStackTrace();
  }
  }
 }
 }

然后再把一个结果集转化成一个对象的方法写一下

* 把得到的一列数据存入到一个对象中
	 * @param rs
	 * @return
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws SQLException
	 * @throws NoSuchMethodException
	 * @throws SecurityException
	 * @throws IllegalArgumentException
	 * @throws InvocationTargetException
	 */
	@SuppressWarnings("unchecked")
	private E oneRowToObject(ResultSet rs) throws InstantiationException, IllegalAccessException, SQLException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
		E obj;
		obj=(E) cls.newInstance();
		//获取结果集元数据(获取此 ResultSet 对象的列的编号、类型和属性。)
		ResultSetMetaData rd=rs.getMetaData();
		for (int i = 0; i < rd.getColumnCount(); i++) {
			//获取列名
			String columnName=rd.getColumnLabel(i+1);
			//组合方法名
			String methodName="set"+columnName.substring(0, 1).toUpperCase()+columnName.substring(1);
			//获取列类型
			int columnType=rd.getColumnType(i+1);
			Method method=null;
			switch(columnType) {
			case java.sql.Types.VARCHAR:
			case java.sql.Types.CHAR:
				method=cls.getMethod(methodName, String.class);
				if(method!=null) {
					method.invoke(obj, rs.getString(columnName));
				}
				break;
			case java.sql.Types.INTEGER:
			case java.sql.Types.SMALLINT:
				method=cls.getMethod(methodName, int.class);
				if(method!=null) {
					method.invoke(obj, rs.getInt(columnName));
				}
				break;
			case java.sql.Types.BIGINT:
				method=cls.getMethod(methodName, long.class);
				if(method!=null) {
					method.invoke(obj, rs.getLong(columnName));
				}
				break;
			case java.sql.Types.DATE:
			case java.sql.Types.TIMESTAMP:
				try {
					method=cls.getMethod(methodName, Date.class);
					if(method!=null) {
						method.invoke(obj, rs.getTimestamp(columnName));
					}
				} catch(Exception e) {
					method=cls.getMethod(methodName, String.class);
					if(method!=null) {
						method.invoke(obj, rs.getString(columnName));
					}
				}
				break;
			case java.sql.Types.DECIMAL:
				method=cls.getMethod(methodName, BigDecimal.class);
				if(method!=null) {
					method.invoke(obj, rs.getBigDecimal(columnName));
				}
				break;
			case java.sql.Types.DOUBLE:
			case java.sql.Types.NUMERIC:
				method=cls.getMethod(methodName, double.class);
				if(method!=null) {
					method.invoke(obj, rs.getDouble(columnName));
				}
				break;
			case java.sql.Types.BIT:
				method=cls.getMethod(methodName, boolean.class);
				if(method!=null) {
					method.invoke(obj, rs.getBoolean(columnName));
				}
				break;
			default:
				break;
			}
		}
		return obj;
	}	

使用的话就是写一个实体类Dao继承BaseDao

public class UserDao extends BaseDao <User>{
}

测试一下:

public class test {
 public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, SQLException, IntrospectionException {
 UserDao userdao = new UserDao();
        List<User> list=userdao.list("select * from user");
 System.out.println("uid\t"+"uname\t"+"state\t"+"flag");
 for (User user : list) {
  System.out.println(user.getUid()+"\t"+user.getUname()+"\t"+user.getState()+"\t"+user.getFlag());
 }
}
}

以上这篇将ResultSet中得到的一行或多行结果集封装成对象的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java实现将结果集封装到List中的方法

    本文实例讲述了java实现将结果集封装到List中的方法.分享给大家供大家参考,具体如下: import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; public class TestResultSet { public stati

  • java连接mysql底层封装详解

    本文实例为大家分享了java连接mysql底层封装代码,供大家参考,具体内容如下 连接数据库 package com.dao.db; import java.sql.Connection; import java.sql.SQLException; /** * 数据库连接层MYSQL * @author Administrator * */ public class DBConnection { /** * 连接数据库 * @return */ public static Connection

  • 将ResultSet中得到的一行或多行结果集封装成对象的实例

    首先说一下这个使用场景,我们在使用jdbc连接数据库的时候,执行查询语句时候会得到一个结果集,如果想要再获取这个结果集中的值,就需要我们将他转换成一个对象,然后通过对象的get和set方法来获取到数据库中的值. public class BaseDao <E> { private Class<?> cls; public BaseDao() { //得到父类的泛型 Type sType=getClass().getGenericSuperclass(); //得到实际的类型参数数组

  • sqlserver和java将resultSet中的记录转换为学生对象

    目录 1.Student.java 2.DBUtil.java 3.result.java 4.实现结果 要将结果转化为对象,所以第一步要创建一个对象: 1.Student.java public class Student { //学号.姓名.班级.性别.专业.学院 //类中的属性一定要跟数据库中的一摸一样 包括名称,数据类型 private String 学号; private String 姓名; private String 班级; private String 性别; private

  • java打印表格 将ResultSet中的数据打印成表格问题

    目录 问题描述 思路 实现 测试 运行结果 总结 问题描述 MySQL的查询语句输出如下: mysql> select * from instructor;+-------+------------+------------+-----------+| ID    | name       | dept_name  | salary    |+-------+------------+------------+-----------+| 10101 | Srinivasan | Comp. Sc

  • java创建一个类实现读取一个文件中的每一行显示出来

    实例如下 import java.io.*; import java.util.*; class MyBufferReaderDemo{ private FileReader fb; MyBufferReaderDemo(FileReader fb){ this.fb=fb; } public String BufferReader() throws IOException{ StringBuilder s1=new StringBuilder(); int ch=0; while((ch=fb

  • Python 实现在文件中的每一行添加一个逗号

    步骤1:读取每行(每行的类型是str) 步骤2:对每行列表化 步骤3:弹出每行的/n两个字符 步骤4:追加,/n三个字符 代码实现如下: #import os From_file=open('D:\\python\\A\\tianqi.txt') f=open('niuniu1.txt','w') count=0 huancun=[] for each_line in From_file: #print(type(each_line)) each_line 是字符类型 Delstr=list(e

  • python 把文件中的每一行以数组的元素放入数组中的方法

    有时候需要把文件中的数据放入到数组中,这里提供了一种方法,可以根据文件结尾的标记进行数据拆分,然后再把拆分的文件放入数组中 # -*-coding: utf-8 -*- f = open("username.txt","w") f.write("Lycoridiata\n") f.write("wulei\n") f.write("leilei\n") f.write("Xingyu\n"

  • js中console在一行内打印字符串和对象的方法

    在前端开发中,大多数的调试一般都是F12中的console和network中查看请求数据和响应数据,也有一部分人喜欢用debugger. 在开发大一些的项目时,在开发环境下,打开着控制台,切换一下页面总是充满着各种console,而且还是很多行,有一部分原因是有下面我写的这样的. 就是因为如果在同一行内同时打印字符串和对象的话,我们会想到如下的拼接 但是对象会调用原型中toString()方法,让我们看起来就难受了. console.log('上传结果' + {obj: '对象', name:'

  • R语言删除/添加数据框中的某一行/列

    假如数据是这样的,这是有一个数据框 > A <- data.frame(姓名 = c("张三", "李四", "王五"), 体重 = c(50, 70, 80), 视力 = c(5.0, 4.8, 5.2)) > A 姓名 体重 视力 1 张三 50 5.0 2 李四 70 4.8 3 王五 80 5.2 删除第一行"张三"的信息 > A <- A[-1,] > A 姓名 体重 视力 2 李

  • Vue如何更改表格中的某一行选项值

    如何更改表格中的某一行选项值 结合后端接口,进行相应的传参 Id, state值等,因相关组件库中的方法说明比较简单,有些需要自己去尝试,如下图中change()方法的传参等 //ajax发送请求的相关方法: get : 获取 , post: 新增 , put/patch : 更改, delete: 删除 代码实现 组件库中的方法介绍: 接口示例: 效果: 对table某一行的数据进行编辑,删除,查看详情操作 效果图 在html中需要对button按钮进行template包裹,scope.row

  • js正则表达式中的单行模式与多行模式实例分析

    本文实例分析了js正则表达式中的单行模式与多行模式.分享给大家供大家参考.具体如下: js正则表达式是不支持单行模式的.也就是说,不能把某段内容(有换行),采用模式修正符来处理,使整段内容当成一行来处理. 正则多行替换,需要添加/mg模式增强符. <html> <head> <script type="text/javascript"> //正则替换链接,链接有换行 function t1(){ var con = document.getEleme

随机推荐