最近在检查其他同事写的代码,看到一同学写的了一个通用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;
}
分享到:
相关推荐
jdbc通用类,有两种连接数据库的方法,基于连接池和属性文件。 还有通用的方法。
该资源可用于进行数据库操作通用方法,方便简洁,适用性高
这是一个通用的jdbc连接实例封装了数据库的添、删、改、查的操作
本资源是对JDBC的封装,方便在项目中使用,其中BaseDao.java是对JDBC操作的封装,使用时让自己的Dao类继承即可,然后调用其中的executeQuery和executeOthe分别执行DQL和DML操作。dbinfo.properties属性文件存储基本...
自己写的一个JDBC通用DAO 有几点需要注意: 1.数据库命明目前只支持没下血杠命名(_) 2.表ID字段名取名有2种方式 (1)ID (2)TableName + ID 例如:user表 则取名为 id 或者 userid 因为没有用xml来映射表结构确定哪一个...
JDBC数据库访问技术
这是十分十分好用的达梦6jdbc通用驱动,欢迎大家下载啊
数据库与网页连接,JDBC数据访问技术,掌握在JSP中利用JavaBean操作数据库的方法,掌握JSP进行数据库增、查、改、删数据库记录的具体方法。
JDBC数据库访问例子
通用的jdbc增删改查,仅仅只是两个通用的方法,利用反射和泛型
jdbc方式直接访问数据库环境的配置帮助文档,里面有详细的介绍。
介绍了JSP、JDBC2ODBC技术 ,分析JSP 通过Java Bean 和JDBC 技术访问 Web 数据库 ,并以 SQL Server2000 数据库为例 ,给出用JDBC2ODBC实现的一个简单留言版的访问实例。
JDBC分页与数据连接通用类 望指教!有问题请指出!
JDBC数据库访问JDBC数据库访问
android通过JDBC直接访问Mysql数据库
实验八通过JDBC方式访问数据库 实验报告8 JDBC 王珊版
实验八:通过JDBC方式访问数据库 《数据库概论》一书中的实验报告范文,pdf格式
JDBC访问各种数据库的方法,JDBC访问各种数据库的方法.
jdbc原理 jdbc访问数据库的步骤 数据库