Jdbc常用操作总结

来源:互联网 发布:c语言数组初值 编辑:程序博客网 时间:2024/06/06 01:46

一、查询

当我们从数据库查询数据时,使用jdbc有多种方法,比如SqlRowSet、List<Map<String, Object>>等。

List<Map<String, Object>>的用法如下:

String sql = "SELECT * FROM TAB_TEST";MapSqlParameterSource params = new MapSqlParameterSource();List<Map<String, Object>> ret = this.namedParameterJdbcTemplate.queryForList(sql, params);Iterator<Map<String, Object>> iter = ret.iterator();while (iter.hasNext()) {     Map<String, Object> item = iter.next();     String dataId = (String)item.get("DATA_ID");     String dataName = (String)item.get("DATA_NAME");     // 其他读取操作}
上述代码存在的问题是:将Oracle类型转换为Java类型时某些类型会发生异常,比如NUMBER -> Integer

SqlRowSet的用法如下:

String sql = "SELECT * FROM TAB_TEST";MapSqlParameterSource params = new MapSqlParameterSource();SqlRowSet rs = this.namedParameterJdbcTemplate.queryForRowSet(sql, params);while (rs.next()) {try {String dataId = rs.getString("DATA_ID");                if(rs.wasNull) {                      dataId = null;                }                                String dataName = rs.getString("DATA_NAME");                if(rs.wasNull) {//注意这里的为空判断必须在上一句的getXXX之后进行                      dataName = null;                }                // 其他读取操作} catch (InvalidResultSetAccessException e) {e1.printStackTrace();logger.error(e.getMessage());} catch (SQLException e) {e1.printStackTrace();logger.error(e.getMessage());}}

上述代码,可以避免第一段代码中的异常问题,需要注意的是,如果仅仅使用rs.getXXX(key),而不进行其后的wasNull判断,即使字段为null,也会得到一个默认值(这种情况有利有弊,通常认为弊大于利),另外一点,re.wasNull要在getXXX之后调用,否则rs.wasNull无效。


将上述代码中的取值部分封装成一个工具方法:

public static <T> T getDbValue(Class<T> type, T t, SqlRowSet rs) throws SQLException {return (rs.wasNull()) ? null : t;}

优化后的代码为:

String sql = "SELECT * FROM TAB_TEST";MapSqlParameterSource params = new MapSqlParameterSource();SqlRowSet rs = this.namedParameterJdbcTemplate.queryForRowSet(sql, params);while (rs.next()) {try {String dataId = getDbValue(String.class, rs.getString("DATA_ID"), rs);                 String dataName = getDbValue(String.class, rs.getString("DATA_NAME"), rs);                // 其他读取操作} catch (InvalidResultSetAccessException e) {e1.printStackTrace();logger.error(e.getMessage());} catch (SQLException e) {e1.printStackTrace();logger.error(e.getMessage());}}

总体感觉,使用SqlRowSet要优于List<Map<String, Object>>



0 0