1. 程式人生 > >JdbcTemplate中RowMapper的粗淺理解

JdbcTemplate中RowMapper的粗淺理解


這篇部落格適合第一次使用RowMapper的初學者:

RowMapper對映Bean容器的用法
RowMapper對映取整張表資料的用法
RowMapper對映Bean容器的用法
這大概是使用最頻繁的用法,甚至也是唯一真正實用的方法。

class UserRowMapper implements RowMapper<User> {
             public User mapRow(ResultSet rs, int rowNum) throws SQLException {
                 User user = new User();
                 user.setId(rs.getInt("id"));
                 user.setName(rs.getString("name"));
                 user.setGender(rs.getString("gender"));
                 return user;
             }
        }

如此,完成了一個對User類的RowMapper對映。直接jdbcTemplate.query(sql,new UserRowMapper)即可將查詢的資訊存入java Bean中,靠的是bean中的get/set方法。

RowMapper對映取整張表資料的用法
查詢一行資料時使用

class GenericMapper implements RowMapper<Map<String,String>> {

        @Override
        public Map<String, String> mapRow(ResultSet rs, int rowNum) throws SQLException {

    //List<Map<String, String>> list = new ArrayList<Map<String, String>>();

            ResultSetMetaData metaData = rs.getMetaData();
            int columnCount = metaData.getColumnCount();

            //while (rs.next()) {
                Map<String, String> map = new HashMap<String, String>();
                for (int i = 1; i <= columnCount; i++) {
                    String columnName = metaData.getColumnLabel(i);
                    String value = rs.getString(columnName).replace(" ", "");
                    map.put(columnName, value);
            }
                //list.add(map);
                //}

            return map;     
    }
    }

如上是一個我簡單實現的用RowMapper映射出一個Map容器,從ResulSet中獲取整行資料並按列名-值的方式放入HashMap中,同樣只要用JdbcTemplatejdbcTemplate.query(sql,new GenericMapper)即可完成查詢的封裝。期間我寫的註釋即是query()方法所做的工作,它替我們完成了封裝List的功能,如javaBean中一樣,不用我們手動遍歷,只需定義一組RowMapper。

總結:
由此可見,jdbcTemplate.queryForObject(String sql, Object[] args, RowMapper rowMapper)以及jdbcTemplate.queryForList(sql)所做的工作大致如此,前者實際上取的是query結果的第一行,後者則完全一樣,並且用query可以隨意封裝任意格式(替換列名,選擇性封裝,修改屬性值等等),省去後期邏輯中遍歷map或list的痛苦。