在上一片篇博客中,我们在查询的时候,是采用实现IResultSetHandler这个类的handle方法来处理查询返回的数据的,但是这样做有一个缺点,查询不同的表,每次都要实现这个handle方法,增大了工作量,而且用起来也差强人意,所以这次使用map对象来处理返回的数据:
工具类的代码如下:
package JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JDBCFunction_Map {
//DDL操作
public static List<Map<String,Object>>getSimpleObjs(String sql,Object...params){
Connection conn = null;
ResultSet rs = null;
PreparedStatement ps = null;
List<Map<String,Object>> mapList = new ArrayList<Map<String,Object>>();
try {
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
if(params != null){
for(int i = 0 ; i < params.length ; i++){
ps.setObject(i+1, params[i]);
}
}
rs = ps.executeQuery();
//精髓的地方就在这里,类ResultSet有getMetaData()会返回数据的列和对应的值的信息,然后我们将列名和对应的值作为map的键值存入map对象之中...
ResultSetMetaData rsmd = rs.getMetaData();
while(rs.next()){
Map<String,Object> map = new HashMap<String,Object>();
for(int i = 0 ; i < rsmd.getColumnCount() ; i++){
String col_name = rsmd.getColumnName(i+1);
Object col_value = rs.getObject(col_name);
if(col_value == null){
col_value = "";
}
map.put(col_name, col_value);
}
mapList.add(map);
}
return mapList;
} catch (SQLException e) {
e.printStackTrace();
return null;
}finally{
JDBCUtils.close(conn, ps, rs);
}
}
}
下面进行简单的查询测试:
代码如下:
public static void main(String[] args) {
String sql = "SELECT * FROM USER ";
List<Map<String , Object>> userList = JDBCFunction_Map.getSimpleObjs(sql);
for(int i = 0 ; i < userList.size() ; i++){
System.out.println("user"+(i+1));
Map<String ,Object> usermap = userList.get(i);
for(String key : usermap.keySet()){
System.out.println("key:"+key+" value:"+usermap.get(key));
}
System.out.println("-----------------------");
}
}
结果如下: