最近最项目,项目的持久化部分用的是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。
这里介绍的方法,就是将findColumn 和SQLException 组合起来,组成的方法。
/** * 判断查询结果集中是否存在某列 * @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。
时间: 2024-10-23 09:32:38