框架用多了,也有些腻。虽然
struts2,spring,
hibernate,ibatis等等都是一些很优秀的框架。不过,
发现很多框架的功能都没用到,感觉有些浪费啊!于是,想着是不是自己学习用过框架的思想,然后用传统的无框架来进行开发。
这两天利用路上两个小时的坐公车时间,思考了如何去开发dao层。总结如下:
1、使用模板模式来开发通用的jdbctemplate,简单的写了下jdbc模板类
public class jdbctemplate<t> { /** * 查找表对象列表 */ @suppresswarnings("unchecked") public list<t> query(string sql, object[] args, basedao dao){ connection conn = null; preparedstatement ps = null; resultset rs = null; list<t> list = new arraylist<t>(); try { conn = dbutils.getconnectionbyc3p0(); ps = conn.preparestatement(sql); if(args!=null){ for(int i=0; i<args.length; i++){ ps.setobject(i+1, args[i]); } } rs = ps.executequery(); while(rs.next()){ t obj = dao.rowmapper(rs); list.add(obj); } } catch (exception e) { e.printstacktrace(); } finally{ try { if(conn.getautocommit()){ dbutils.release(rs, ps, conn); }else{ dbutils.release(rs, ps, null); } } catch (exception e2) { e2.printstacktrace(); } } return list; } /** * 更新表对象 */ public void update(string sql, object[] args){ connection conn = null; preparedstatement ps = null; try { conn = dbutils.getconnectionbyc3p0(); ps = conn.preparestatement(sql); if(args!=null){ for(int i=0; i<args.length; i++){ ps.setobject(i+1, args[i]); } } ps.executeupdate(); } catch (exception e) { e.printstacktrace(); } finally{ try { if(conn.getautocommit()){ dbutils.release(null, ps, conn); }else{ dbutils.release(null, ps, null); } } catch (exception e2) { e2.printstacktrace(); } } }}
在这个模板类中数据库连接没有直接关闭的原因,是为了之后的事务管理。当然,模板类肯定不能只是这两个方法,具体可以参考spring的jdbctemplate来进行模板类的开发。
basedao是个
接口,完成rs到bean的映射,代码如下:
public interface basedao<t> { public t rowmapper(resultset rs);}
2、其它dao层类使用jdbctemplate来进行开发。下面举个简单的
例子:
public list<searchupdate> findbysql(string sql, object[] objs) { return jt.query(sql, objs, new basedao<user >() { public user rowmapper(resultset rs) { user user = new user (); try { user.setname(rs.getstring("name")); user.setid(rs.getint("id")); } catch (exception e) { e.printstacktrace(); } return user; } }); }
3、使用
代理模式来进行事务的处理。下面是,关于业务代理类的代码,在里面进行了事务的
开启,提交或者回滚。
public class transactionproxy implements invocationhandler { private object targetobject; public object bind(object targetobject) { this.targetobject = targetobject; return proxy.newproxyinstance(targetobject.getclass().getclassloader(), targetobject.getclass().getinterfaces(), this); } public object invoke(object proxy, method method, object[] args) throws throwable { transactionmanager tm = dbutils.gettransactionmanager(); tm.begintransaction(); object result = null; try { result = method.invoke(targetobject, args); tm.committransaction(); } catch (exception e) { tm.rollbacktransaction(); } return result; }}
这种代理方式,前提是代理对象必须是相应的接口的实现。如果代理对象没有接口的话,可以利用第三方包cglib来实现对象的代理。
以上纯粹只是个人的
经验之谈,作为自己的小小的记录。如有错漏,望提出。完整的代码在附件中,包含了一个数据库链接池的包和cglib包。