web应用dao层的开发经验小结_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > web应用dao层的开发经验小结

web应用dao层的开发经验小结

 2011/9/6 8:12:55  jiava9900  http://jiava9900.iteye.com  我要评论(0)
  • 摘要:框架用多了,也有些腻。虽然struts2,spring,hibernate,ibatis等等都是一些很优秀的框架。不过,发现很多框架的功能都没用到,感觉有些浪费啊!于是,想着是不是自己学习用过框架的思想,然后用传统的无框架来进行开发。这两天利用路上两个小时的坐公车时间,思考了如何去开发dao层。总结如下:1、使用模板模式来开发通用的jdbctemplate,简单的写了下jdbc模板类publicclassjdbctemplate<t>
  • 标签:Web 经验 应用 开发
    框架用多了,也有些腻。虽然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包。 
发表评论
用户名: 匿名