最近在检查其他同事写的代码,看到一同学写的了一个通用JDBC模板(静态工厂模式),似乎没有什么问题,但看起来很是不美观,有点怪异的感觉。我想了很久是不是要在论坛中发布,我觉得这样的代码还是不够OO,为什么自己对应的域对象操作不直接用用对象封装来处理呢?而转用ResultSetMetaData来解析对应的字段的属性,而且每次要把相关的参数保存到MAP、list中,然后又要取出来解析。所以我觉得回影响性能。当然在测试过程中没有发现性能的问题。由于项目中其他同学也在用他这个模板,他们觉得很方便。但对应新人(刚毕业的同学)来说,经常在调试的时候发生了错误,都不知错误发生在那?导致又要其他同学帮忙,乱费太多时间,而且他们还是不知其所以然。请大家帮忙评点一下。谢谢!
//通过SQL反回对应的数据集
//比如:sql select nameSc,age from users
public List getResultDataList(String sql, Connection con) {
List<Map> dataList = new ArrayList<Map>();
Map<String, String> map = new HashMap<String, String>();//存放对应字段数据
PreparedStatement ps = null;
ResultSet ds = null;
ResultSetMetaData rsd;
try {
ps = con.prepareStatement(sql);
ds = ps.executeQuery();
while (ds.next()) {
map = new HashMap<String, String>();//通过键值对存放一条记录的数据
rsd = ds.getMetaData();
for (int i = 1; i <= rsd.getColumnCount(); i++) {
switch (rsd.getColumnType(i)) {//通过判断数据类型转换数据
case 12:// varchar(12)
map.put(rsd.getColumnName(i), ds.getString(i));
break;
case 1:// char(1)
map.put(rsd.getColumnName(i), ds.getString(i));
break;
case -7:// bit(-7)
map.put(rsd.getColumnName(i), Boolean.toString(ds
.getBoolean(i)));
break;
case 4:// int(4)
map.put(rsd.getColumnName(i), Integer.toString(ds
.getInt(i)));
break;
case 5:// smallint(5)
map.put(rsd.getColumnName(i), Integer.toString(ds
.getInt(i)));
break;
case 93:// datetime(93)
if (ds.getString(i) == null)
map.put(rsd.getColumnName(i), "");
else {
if (ds.getString(i).length() >= 19) {
map.put(rsd.getColumnName(i), ds.getString(i)
.substring(0, 19));
} else {
map.put(rsd.getColumnName(i), ds.getString(i)
.substring(0, 10));
}
}
break;
case 3:// decimal(3)
map.put(rsd.getColumnName(i), Double.toString(ds
.getDouble(i)));
break;
default:
map.put(rsd.getColumnName(i), ds.getString(i));
break;
}
}
dataList.add( map);//存放所有行数据
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
} finally {
[color=red]connection是通过HibernateDaoSupport获取得到的,似乎能够自动回收(反回到连接池),是否真的不用关闭连接呢?[/color]
/*
* try{ if(ds!=null){ds.close();ds=null;}
* if(ps!=null){ps.close();ps=null;}
* if(con!=null){con.close();con=null;} }catch(SQLException e){}
*/
}
return dataList;
}
//通过传递SQL,Sql的参数更新数据
//比如 sql insert into users(nameCs,age)valuse(?,?)
//params就是存放?代表的值
public int execUpdateByParams(String sql, Connection con, List params) {
PreparedStatement ps = null;
int message = 0;
try {
String paramsStr="";
ps = con.prepareStatement(sql);
if (params != null) {
for (int i = 0; i < params.size(); i++) {
String p = params.get(i)==null?null:"" + params.get(i);//设置对应的参数
ps.setString(i + 1, p);
}
}
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
message = -1;
throw new RuntimeException(e);
} finally {
try {
if (ps != null) {
[color=red]ps.close();[/color]//怎么在这他有把这个关闭了呢?这会有问题吧?
ps = null;
}
// if(con!=null){con.close();con=null;}
} catch (SQLException e) {
}
}
return message;
}