当前位置: 首页 > 编程笔记 >

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

从景曜
2023-03-14
本文向大家介绍将ResultSet中得到的一行或多行结果集封装成对象的实例,包括了将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中得到的一行或多行结果集封装成对象的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍java实现将结果集封装到List中的方法,包括了java实现将结果集封装到List中的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java实现将结果集封装到List中的方法。分享给大家供大家参考,具体如下: 希望本文所述对大家java程序设计有所帮助。

  • 本文向大家介绍python实现封装得到virustotal扫描结果,包括了python实现封装得到virustotal扫描结果的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python实现封装得到virustotal扫描结果的方法。分享给大家供大家参考。具体方法如下: 使用方法如下: 希望本文所述对大家的Python程序设计有所帮助。

  • 问题内容: 我有一个表,我试图根据第二列的值将每一行分成一个或多个行。像这样: 我将其编写为SQL Server 2008中的sproc。我最好的解决方案是使用游标并向临时表中为表中的每一行添加[pcs]行数。似乎必须有一个比我所缺少的解决方案更简单的解决方案。谢谢。 问题答案: 您可以使用递归CTE: 这是一个演示供您尝试。

  • 我有一个用户类,有16个属性,比如名字,姓氏,出生日期,用户名,密码等...这些都存储在MySQL数据库中,当我想要检索用户时,我使用ResultSet。我想将每一列映射回用户属性,但我这样做的效率似乎非常低。例如,我正在做: 也就是说,我检索所有的列,然后通过将所有的列值插入用户构造函数来创建用户对象。 有人知道更快、更整洁的方法吗?

  • 问题内容: 我正在使用以下内容将检索到的值添加到类中。所有值都将添加到该类的属性中,但是我正在使用compisition(在类中具有class的对象),并且在输出中不显示任何内容。 地址类别如下: 问题答案: 像这样的作品: 将ResultSet行转换为JavaBean。此实现使用反射和BeanInfo类将列名与bean属性名匹配。属性根据以下几个因素与列匹配: 该类具有与列同名的可写属性。名称比

  • 问题内容: 如何使用JDBC检查结果集是否具有一行或更多行? 问题答案: 您没有问这个,但是您可能需要它: 通常,我们不需要行计数,因为我们使用WHILE循环而不是FOR循环来遍历结果集: 但是,在某些情况下,您可能希望对结果进行加窗显示,并且需要提前记录数以向用户显示。您可以先执行一个单独的查询来获取记录计数,但是请注意,计数只是一个近似值,因为可以在执行两个查询的时间之间添加或删除行。 Res