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

在项目中使用Spring JDBC进行查询时,为了节省代码并提高维护性,尝试创建一个公共的mapRow方法来映射结果集到对象。然而,由于每次查询的属性不固定,需要根据结果集是否存在特定列决定映射。通过查阅JDK API,发现ResultSet的findColumn方法在查找不存在的列名时会抛出SQLException。因此,可以结合findColumn和SQLException来构建一个方法,在mapRow过程中检查结果集是否包含特定列,如果存在则映射,否则忽略,从而实现更灵活的公用映射功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   

    最近最项目,项目的持久化部分用的是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。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值