web應用dao層的開發經驗小結 – JAVA編程語言程序開發技術文章

框架用多瞭,也有些膩。雖然struts2,spring,hibernate,ibatis等等都是一些很優秀的框架。不過,發現很多框架的功能都沒用到,感覺有些浪費啊!於是,想著是不是自己學習用過框架的思想,然後用傳統的無框架來進行開發。

這兩天利用路上兩個小時的坐公車時間,思考瞭如何去開發dao層。總結如下:
1、使用模板模式來開發通用的jdbctemplate,簡單的寫瞭下jdbc模板類
Java代碼 
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的映射,代碼如下:
Java代碼 
public interface basedao<t> { public t rowmapper(resultset rs);} 

2、其它dao層類使用jdbctemplate來進行開發。下面舉個簡單的例子:
Java代碼 
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、使用代理模式來進行事務的處理。下面是,關於業務代理類的代碼,在裡面進行瞭事務的開啟,提交或者回滾。
Java代碼 
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包。

作者“oracle 高手,哈哈”
 

發佈留言