posts - 165, comments - 198, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          自用小框架:DB工廠

          Posted on 2007-09-19 11:41 G_G 閱讀(1507) 評論(6)  編輯  收藏 所屬分類: InspirationJDBC
          BUG 修改 :
          09-20?? 因為 Oracle??取元數據的字符串需要大寫 至修改并下載更新
          測試使用表
          ??????ID?????????????????????????? SN?? STATIONNAME????????? SPELL????? DEPOTID?
          ??????-------------- ---- -------------------- ---------- ------- ------------------
          ??????08050000390689??? 3???? 永安???????????????????????????? ?ya??????????????? ....

          版本升級
          09-21 DyanDBUtils 動態面向對象數據庫 操作

          由于 hibernate 還要table影射成class 這好處和壞處只有我們程序員知道了
          ??????? 只要修改數據庫就大量影射附加工作要做 ,有時影射還有BUG弄的我們@#$%!.....(哈hibernate我是小鳥^_^),我----不要----影射 , 沒有他們數據庫就又回到jdbc.本人比較喜歡偷懶 哈哈 自己來個小框架吧( 就300來行的代碼有興趣的看看哦 )!!!?

          用到技術
          ???? BeanUtil , JDBC元數據(在這我可是好好看了下JDBC,其實他是很強的東西,大家應該好好用用^_^)?
          下載DBFactory.rar
          DBFactroy
          數據是:
          +----+-------+-------------+------------+
          | id | title | description | buydate??? |
          +----+-------+-------------+------------+
          |? 6 | tt??? | asdgwgw???? | 1990-12-02 |
          +----+-------+-------------+------------+


          先看看測試吧

          public?class?testNotKonw?extends?TestCase?{

          ????
          protected?void?setUp()?throws?Exception?{
          ?????? //運行 sql 可見
          ????????DBFactory.getTools().setIsShowSql(DBFactory.SHOW);
          ????????
          super.setUp();
          ????}
          ????
          public?void?testDelete()throws?Exception{
          ?????????// select 出來 就的 List 中 DynaBean?: id , title?.....? 類型 , 和值都有了
          ????????
          for(Iterator?it?=?DBFactory.getTools().select("select?*?from?books").iterator();it.hasNext();){
          ????????????// 那就是delete :?目的是測試前 刪除全部數據
          ????????????DBFactory.getTools().delete(it.next());
          ????????}
          ????}
          ????
          ??????
          public?void?testInsert()throws?Exception{
          ??????? // insert 要先new出來個 table->bean??再?添屬性 ?
          ????????Object?obj?
          =?DBFactory.getTools().getDynaTableClass("books").newInstance();
          ????????BeanUtils.setProperty(obj,
          "id","6");
          ????????BeanUtils.setProperty(obj,
          "title","tt");
          ????????BeanUtils.setProperty(obj,
          "description","asdgwgw");
          ????????BeanUtils.setProperty(obj,
          "buydate",new?Date());
          ?????? //這幾是 insert 了 (簡單吧)
          ????????DBFactory.getTools().insert(obj);
          ????}
          ????
          ????
          //?update
          ????public?void?testUpdate()throws?Exception{
          ????????
          for(Iterator?it?=?DBFactory.getTools().select("select?*?from?books").iterator();it.hasNext();){
          ????????????Object?obj?
          =?it.next();
          ????????????BeanUtils.setProperty(obj,
          "buydate",new?Date(90,11,2));
          ????????????DBFactory.getTools().update(obj);
          ????????}
          ????}
          }


          控制臺輸出
          //testDelete
          delete from books where 1=1? and id=6
          //testInsert
          insert into books(id,title,description,buydate) values( 6,'tt','asdgwgw','2007-09-19')
          //testUpdate
          delete from books where 1=1? and id=6
          insert into books(id,title,description,buydate) values( 6,'tt','asdgwgw','1990-12-02')

          代碼關鍵說明:
          關鍵在BeanUtil 的 DnayBean中 我通過元數據 得到了 這個Bean 屬性.屬性類型,還有表信息放在 getClass();的字符串中
          ???EG:????table=...;key=..,..,..;columns=...,..,;?后在insert ,?delet , update就是(先delete后insert^_^) ?中?解析得到 動態寫sql語句?
          ?????????更舉 DnayBean中屬性類型看看 Bean value 是否要加 ' value?' 還是直接 value 到sql 中

          ????public??BasicDynaClass?getDynaTableClass(String?table){
          ????????Connection?conn?
          =?getConn()?;
          ????????List?props?
          =?new?ArrayList();
          ????????DatabaseMetaData?dm?
          =?null?;
          ????????BasicDynaClass?dynaClass?
          =?null?;
          ????????
          try?{????
          ????????????dm?
          =?conn.getMetaData();
          ????????????ResultSet?coulumns?
          =?dm.getColumns(null,null,table,null);
          ????????????
          while(coulumns.next()){
          ?????????????? //元數據中得到 類型做?DynaBean 屬性?? coulumns.getInt("DATA_TYPE")? 是? java.sql.Types.XXXXX
          ????????????????props.add(
          new?DynaProperty(?coulumns.getString("COLUMN_NAME"),getStrClass(coulumns.getInt("DATA_TYPE")))?);
          ????????????}
          ????????????
          //?all?:?table
          ????????????
          //delete?:?column_name?column_value
          ????????????
          //insert?:?column_name
          ????????????StringBuffer?sb?=?new?StringBuffer();
          ????????????sb.append(
          "table=").append(table).append(";");
          ????????????
          ????????????sb.append(
          "keys=");
          ????????????????ResultSet?keys?
          =?dm.getPrimaryKeys(null,null,table);
          ????????????????
          while(keys.next()){
          ????????????????????sb.append(?keys.getString(
          "column_name")).append(",");
          ????????????????}
          ????????????????sb.replace(sb.length()
          -1,sb.length(),";");
          ????????????
          ????????????sb.append(
          "columns=");????
          ????????????????ResultSet?couls?
          =?dm.getColumns(null,null,table,null);
          ????????????????
          while(couls.next()){
          ????????????????????sb.append(?couls.getString(
          "column_name")).append(",");
          ????????????????}
          ????????????????sb.replace(sb.length()
          -1,sb.length(),";");
          ????????????????
          ??????????? //為 Class name? <- sb.toString()
          ????????????dynaClass?
          =?new?BasicDynaClass(sb.toString()?,?null,?
          ????????????????????(DynaProperty[])props.toArray(
          new?DynaProperty[]{})?);
          ????????}?
          catch?(Exception?e)?{e.printStackTrace();}
          ????????
          finally{
          ????????????
          try?{
          ????????????????conn.close()?;
          ????????????}?
          catch?(SQLException?e)?{e.printStackTrace();}
          ????????}
          ????????
          return?dynaClass?;
          ????}

          insert , delete 差不多 就來insert

          ????public?boolean?insert(Object?obj){
          ????????String?sqlstrat?
          =?"insert?into?";
          ????????String?sqldo?
          =?"?values(?";
          ????????String?sqlend?
          =?")";
          ????????String?sql?
          =?"";
          ????????
          boolean?od?=?false?;
          ????????
          ????????Connection?conn?
          =?getConn()?;
          ????????Statement?sta?
          =?null?;
          ????????
          try?{
          ???????????? //解析getDynaClass().getName()? 得到 table
          ????????????sqlstrat?
          +=?getTableConfig(obj,"table")[0]+"("?;
          ????????????
          ???????????? //解析getDynaClass().getName()? 得到?columns
          ????????????String[]?cols?
          =?getTableConfig(obj,"columns");
          ????????????
          for(int?i=0;i<cols.length;i++){
          ????????????????sqlstrat?
          +=?cols[i]??+",";
          ????????????????sqldo?
          +=?getSqlAtt(obj,cols[i]?)+",";
          ????????????}
          ????????????sql?
          =?sqlstrat.substring(0,sqlstrat.length()-1)+")"+sqldo.substring(0,sqldo.length()-1)+sqlend;
          ????????????sta?
          =?conn.createStatement();
          ????????????
          if(?sta.executeUpdate(sql)>0){od?=?true;};
          ????????}?
          catch?(Exception?e)?{e.printStackTrace();}
          ????????
          finally{
          ????????????
          try?{
          ????????????????
          if(?isShowSql==SHOW?)?{System.out.println();System.out.println(sql);}
          ????????????????conn.close();
          ????????????}?
          catch?(SQLException?e)?{e.printStackTrace();}
          ????????}
          ????????
          return?od?;
          ????}



          小結:
          當然表連和多表 是沒問題的
          但在多表 delete , update 就還沒有完成 (蠻難的 5555? 還有 沒時間)
          單表的 delete update ,select,insert 都完成了 我會努力的
          大家要是認為還可以 幫忙頂貼 哦 我會都都完善哦


          評論

          # re: 自用小框架:DB工廠  回復  更多評論   

          2007-09-19 11:59 by 千里冰封
          哈哈,支持一下.

          # re: 自用小框架:DB工廠  回復  更多評論   

          2007-09-19 12:19 by G_G
          千里冰封 謝謝 ^_^

          # re: 自用小框架:DB工廠  回復  更多評論   

          2007-09-19 12:43 by Artkai
          沒有考慮下事務??

          # re: 自用小框架:DB工廠  回復  更多評論   

          2007-09-19 13:30 by G_G
          還沒加 但后面有時間會 加上 的

          # re: 自用小框架:DB工廠[未登錄]  回復  更多評論   

          2007-09-19 19:01 by unmi
          不錯,考慮配置的緩存,預編譯語句的緩存,數據記錄的緩存機制,不過所有的加上去就有得完了。

          # re: 自用小框架:DB工廠  回復  更多評論   

          2007-09-20 14:01 by 小天
          真的很不錯耶~~若有加上transaction那會更好~~
          主站蜘蛛池模板: 蓬莱市| 绩溪县| 洮南市| 萨迦县| 马关县| 临清市| 乐安县| 和田县| 梅河口市| 肥城市| 龙泉市| 台前县| 娱乐| 葵青区| 成武县| 阿拉尔市| 通州市| 西林县| 琼海市| 商水县| 邹城市| 怀集县| 德保县| 祁东县| 吉安县| 鄂尔多斯市| 阳东县| 沅江市| 霍州市| 自贡市| 荣成市| 九台市| 辰溪县| 崇义县| 沾益县| 科技| 凉城县| 平舆县| 库尔勒市| 滁州市| 新兴县|