Java Architect

          導航

          <2006年8月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統(tǒng)計

          常用鏈接

          留言簿(2)

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          DAO終結者

          動態(tài)組裝SQL是實際應用中的一個常見問題,我發(fā)現(xiàn)在很多論壇中的解決方案都不干淨,下面是我在很多項目中使用的方案,簡潔有效.

          基本概念如下:

          1. 使用模板技術,如Velocity,FreeMarker;
          2. 在SQL中不要使用?,使用自己的place holder ,such as #{variableName};

          象下面的SQL語句
          select firstName
          ????? ,lastName
          from users u
          where? u.userId= #{userId}

          #if($companyId)
          ? and u.companyId=#{companyId}
          #end

          處理過程如下:

          1.將所有變量放進一個MAP中;
          2.用VELOCITY進行MERGE,將得到以下的SQL,假定companyId 不為空;
          ? select firstName
          ????? ,lastName
          from users u
          where? u.userId= #{userId}
          ? and u.companyId=#{companyId}
          3.再將上面的SQL進一步處理,根據(jù)SQL語句中的placeHolder順序和MAP中的變量,生成一個變量的LIST,同時將變量的placeHolder轉換成?;
          4.將變量LIST的數(shù)值依次注入到preparedStatement中;

          ? Tips: 這里還可生成一個完全可執(zhí)行的 SQL 語句輸出到 LOG , 以便進行除錯;
          5.執(zhí)行SQL, reflection技術將ResultSet轉換成voList;

          ?

          將上面的過程封裝成一個 Class , 只需將 sqlName,parameterMap,voClass 傳入便可返回一個 voList 或數(shù)組 . 此舉將大大減化 DAO 的代碼 , 根據(jù)我的經(jīng)驗 , 代碼最起碼減少 70%, 更為重要的是查詢非常容易維護 , 極大地減少了出錯的概率 ,SQL 語句清晰易懂 , 不再是醜陋的 criteria, 也不再是將一個個的分散的 SQL 片斷 , 我們的程序員將會有更多的時間來寫 SQL, 而不是做其它讓人厭煩的工作 , 排錯也變得異常簡單 , 唯一可能出錯的地方只能在 SQL , 只要將 LOG 輸出的完整可執(zhí)行 SQL 放在 database client 中執(zhí)行一下 , 問題在哪兒 , 一目了然 .

          我相信此方法 比起 iBatis, Spring jdbcTemplate,Hibernate Criteria 要容易使用得多 . 其實 Hibernate HQL, 也可以用此方法來動態(tài)生成 HQL.
          ?

          posted on 2006-08-13 09:35 zrq 閱讀(259) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 建德市| 固镇县| 绥江县| 湄潭县| 屏山县| 綦江县| 双鸭山市| 吉林省| 莎车县| 遂溪县| 屏边| 定州市| 高台县| 措勤县| 闵行区| 济阳县| 江华| 乡宁县| 阿拉善盟| 大丰市| 长岛县| 旅游| 荃湾区| 文山县| 福贡县| 井冈山市| 红安县| 镶黄旗| 麦盖提县| 宁强县| 都昌县| 洛川县| 宁陵县| 偏关县| 康定县| 博湖县| 唐海县| 会昌县| 格尔木市| 安庆市| 枣庄市|