Java判断数据库结果集ResultSet 中是否存在指定列名

   

    最近最项目,项目的持久化部分用的是spring jdbc,查询出来的结果集要映射为对象,每次都在查询SQL的方法内定义私有的mapper 变量,内部实现mapRow 方法,似乎有些浪费,就想着定义一个公用的mapRow 实现,节省代码,方便维护。


    在写的过程中,发现一个问题,就是涉及到一个很大的对象,属性非常多,但每次查询出来的属性却又都不一样,这样的公用mapRow 该怎么写呢,能否根据结果集中是否有某个属性,才让其映射,没有的就不再映射呢?

   

    立马翻开jdk api,找到ResultSet ,找了又找,没有找到相应的方法。

    但jdk中有一个方法,可以利用起来,什么方法呢?

findColumn
int findColumn(String columnLabel)
               throws SQLException将给定的 ResultSet 列标签映射到其 ResultSet 列索引。 

参数:
    columnLabel - 使用 SQL AS 子句指定的列标签。如果未指定 SQL AS 子句,则标签是列名称 
返回:
    给定列名称的列索引 
抛出: 
    SQLException - 如果 ResultSet 对象不包含标记为 columnLabel 的列,发生数据库访问错误或在已关闭的结果集上调用此方法

    ResultSet 中的findColumn方法,返回指定的列名在结果集中的索引,索引值从1开始。

    假如返回结果集中依次包含id,name,age ,则

findColumn("id") // 1

findColumn("name") // 2

findColumn("age") // 3

    如果通过findColumn去查找一个不存在的列名时,出现什么情况呢?抛出SQLException。

    这里介绍的方法,就是将findColumnSQLException 组合起来,组成的方法。

	/**
	 * 判断查询结果集中是否存在某列
	 * @param rs 查询结果集
	 * @param columnName 列名
	 * @return true 存在; false 不存咋
	 */
	public boolean isExistColumn(ResultSet rs, String columnName) {
		try {
			if (rs.findColumn(columnName) > 0 ) {
				return true;
			} 
		}
		catch (SQLException e) {
			return false;
		}
		
		return false;
	}



      if 条件内,如果 rs.findColumn(columnName) > 0 ,ResultSet结果集中的列索引从1开始,不同于数组和list的从0开始,所以如果找到某列,那么它的索引值必然大于0;如果没有找到呢,那么就会有SQLException 异常抛出来,我们这里将这个SQLException 异常利用起来,如果进入异常块,则说明没有找到该列,那么直接返回false就可以了。


    这样在mapRow 中,如果多个属性的时候,每次可以判断下,该ResultSet 中是否查询出来该列,查询出来了就做映射,没有查询出,则不做具体事情,从而更好的公用了mapRow。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。