使用JdbcTemplate来获取数据库表字段对应的数据

在默认情况中我们在使用数据库查询时

Class.forName(dom.getDriver()); //加载MYSQL JDBC驱动程序 
String url=dom.getUrl()+"/"+datebaseName+"?characterEncoding=UTF-8";
Connection conn = DriverManager.getConnection(url,dom.getUsername(),dom.getPassword());
Statement stat = conn.createStatement();
String sql="select * from "+tableName+" order by "+order+";";
ResultSet rs=stat.executeQuery(sql);
list=convertList(rs);
stat.close();
conn.close();
return list;

在正常情况下,我们是不能直接将 ResultSet 记录集 rs 直接传递给前台的,因为 ResultSet 不仅无法进行循环遍历 (即只能每行遍历,从0至end ,执行一次),而且在实际应用中,它还必须被关闭。当关闭后,rs为null ,结果不再存在。 
在这时我们就需要将 ResultSet 对象进行遍历到 list 中,代码如下:

private static List convertList(ResultSet rs) throws SQLException{
List list = new ArrayList();
ResultSetMetaData md = rs.getMetaData();//获取键名
int columnCount = md.getColumnCount();//获取行的数量
while (rs.next()) {
Map rowData = new HashMap();//声明Map
for (int i = 1; i <= columnCount; i++) {
rowData.put(md.getColumnName(i), rs.getObject(i));//获取键名及值
}
list.add(rowData);
}
return list;
}

 
  
例子 使用
public  List objectList(String sql,Object... args) {
    List result = jdbcTemplate.query(sql,args,new ResultSetExtractor() {
        @Override
        public List extractData(ResultSet rs)throws SQLException, DataAccessException {
            List list = new ArrayList();
            ResultSetMetaData md = rs.getMetaData();//获取键名
            int columnCount = md.getColumnCount();//获取行的数量
            while (rs.next()) {
                Map rowData = new HashMap();//声明Map
                for (int i = 1; i <= columnCount; i++) {
                    rowData.put(md.getColumnName(i), rs.getObject(i));//获取键名及值
                }
                list.add(rowData);
            }
            return list;
        }});
    return result;
}

查看以上代码,可以看出我们使用 Map 与 MetaDate 使 ResultSet 储存到 list 中的,因为 list 只能存放元素的索引而不能存放元素的值,所以我们要用到 Map 。 
使用这种方法的好处就是可以创建高复用性的代码 ,因为我们不需要每次通过指定键名取值。 
实际工作间接,与君共勉。

你可能感兴趣的:(java-基础)