posts - 165, comments - 198, trackbacks - 0, articles - 1
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          自用小框架:DB工廠

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

          版本升級(jí)
          09-21 DyanDBUtils 動(dòng)態(tài)面向?qū)ο髷?shù)據(jù)庫(kù) 操作

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

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


          先看看測(cè)試吧

          public?class?testNotKonw?extends?TestCase?{

          ????
          protected?void?setUp()?throws?Exception?{
          ?????? //運(yùn)行 sql 可見
          ????????DBFactory.getTools().setIsShowSql(DBFactory.SHOW);
          ????????
          super.setUp();
          ????}
          ????
          public?void?testDelete()throws?Exception{
          ?????????// select 出來(lái) 就的 List 中 DynaBean?: id , title?.....? 類型 , 和值都有了
          ????????
          for(Iterator?it?=?DBFactory.getTools().select("select?*?from?books").iterator();it.hasNext();){
          ????????????// 那就是delete :?目的是測(cè)試前 刪除全部數(shù)據(jù)
          ????????????DBFactory.getTools().delete(it.next());
          ????????}
          ????}
          ????
          ??????
          public?void?testInsert()throws?Exception{
          ??????? // insert 要先new出來(lái)個(gè) 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 了 (簡(jiǎn)單吧)
          ????????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);
          ????????}
          ????}
          }


          控制臺(tái)輸出
          //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')

          代碼關(guān)鍵說(shuō)明:
          關(guān)鍵在BeanUtil 的 DnayBean中 我通過(guò)元數(shù)據(jù) 得到了 這個(gè)Bean 屬性.屬性類型,還有表信息放在 getClass();的字符串中
          ???EG:????table=...;key=..,..,..;columns=...,..,;?后在insert ,?delet , update就是(先delete后insert^_^) ?中?解析得到 動(dòng)態(tài)寫sql語(yǔ)句?
          ?????????更舉 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()){
          ?????????????? //元數(shù)據(jù)中得到 類型做?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 差不多 就來(lái)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?;
          ????}



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


          評(píng)論

          # re: 自用小框架:DB工廠  回復(fù)  更多評(píng)論   

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

          # re: 自用小框架:DB工廠  回復(fù)  更多評(píng)論   

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

          # re: 自用小框架:DB工廠  回復(fù)  更多評(píng)論   

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

          # re: 自用小框架:DB工廠  回復(fù)  更多評(píng)論   

          2007-09-19 13:30 by G_G
          還沒加 但后面有時(shí)間會(huì) 加上 的

          # re: 自用小框架:DB工廠[未登錄]  回復(fù)  更多評(píng)論   

          2007-09-19 19:01 by unmi
          不錯(cuò),考慮配置的緩存,預(yù)編譯語(yǔ)句的緩存,數(shù)據(jù)記錄的緩存機(jī)制,不過(guò)所有的加上去就有得完了。

          # re: 自用小框架:DB工廠  回復(fù)  更多評(píng)論   

          2007-09-20 14:01 by 小天
          真的很不錯(cuò)耶~~若有加上transaction那會(huì)更好~~
          主站蜘蛛池模板: 铁力市| 井冈山市| 长岛县| 商城县| 海原县| 巢湖市| 遵义县| 思茅市| 黔东| 麦盖提县| 塘沽区| 册亨县| 尖扎县| 茂名市| 定陶县| 阜阳市| 唐海县| 衡东县| 连山| 都江堰市| 安图县| 崇信县| 汝南县| 开鲁县| 富锦市| 东兰县| 察雅县| 荃湾区| 佳木斯市| 台湾省| 辽阳县| 西丰县| 皋兰县| 德惠市| 海口市| 宣威市| 绥江县| 湘阴县| 孝昌县| 鹿邑县| 德安县|