<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    badqiu

    XPer
    隨筆 - 46, 文章 - 3, 評論 - 195, 引用 - 0
    數(shù)據(jù)加載中……

    動態(tài)構(gòu)造sql的利器:rapid-xsqlbuider詳細(xì)說明

    特性列表:

    1. 動態(tài)構(gòu)造sql條件語句,提供sql拼接與使用占位符兩種方式
    2. 數(shù)據(jù)類型的修飾
    3. 對SQL注入攻擊的防范

    問題:

    手工構(gòu)造SQL語句的情況

    										
    1?String?sql?=?"select?*?from?user?where?1=1?";
    2?String?user_id?=?(String)filters.get("user_id");
    3?if(?user_id?!=?null?&&?user_id.length()?>?0)?{
    4????sql?=?sql?+?"?and?user_id?=?"?+?user_id;
    5?}
    6?String?age?=?(String)filters.get("age");
    7?if(age?!=?null?&&?age.length()?>?0)?{
    8????sql?=?sql?+?"?and?age?>?"?+?age;
    9?}

    過多的if判斷導(dǎo)致sql語句不清晰,我們再來看下rapid-xsqlbuilder的做法

    rapid-xsqlbuilder構(gòu)造SQL例子

    示例:

    ?1?//?清晰的sql語句,/~?~/為一個語法塊
    ?2??String?sql=?"select?*?from?user?where?1=1?"?
    ?3??????????+?"/~?and?username?=?{username}?~/"???
    ?4??????????+?"/~?and?password?=?{password}?~/";???
    ?5??
    ?6??//?filters為參數(shù)
    ?7??Map?filters?=?new?HashMap();???
    ?8??filters.put("username",?"badqiu");?
    ?9??filters.put("sex",?"F");??
    10??
    11??XsqlFilterResult?result?=?new?XsqlBuilder().generateHql(sql,filters);
    12??
    13??assertTrue(result.getAcceptedFilters().containsKey("username"));
    14??assertFalse(result.getAcceptedFilters().containsKey("sex"));
    15??assertEquals("select?*?from?user?where?1=1??and?username?=?:username?",?result.getXsql());
    16?

    XsqlFilterResult為處理完返回的東西,包含兩個屬性xsql,acceptedFilters

    被過濾掉的東西:

    SQL過濾: /~ and password = {password} ~/
    這一段由于在filters中password不存在而沒有被構(gòu)造出來

    filters過濾: sex
    filters中由于沒有類似/~ sex={sex} ~/ 這一段,所以在過濾完的filters中不存在

    最終構(gòu)造生成的結(jié)果

    HQL: XsqlFilterResult.xsql屬性??????????
    select * from user where 1=1 and username=:username??
    ???????
    構(gòu)造后返回的Map filters: XsqlFilterResult.acceptedFilters 屬性
    username=badqiu

    語法

    語法

    /~ {key} ~/
    /~ [key] ~/
    /~ {key_1} [key_2] ... {key_3} ~/
    /~ {key?modifier} ~/
    /~ {key?modifier(arg1,arg2) ~/
    /~ {key?modifier?modifier?...?modifier} ~/

    示例:

    /~ username = {username} ~/
    /~ password like '%[password]%' ~/
    /~ birthDate > {startBirthDate} and birthDate < [endBirthDate] ~/

    數(shù)據(jù)據(jù)類型修飾

    將Map filters中的數(shù)據(jù)類型修飾為另外一種類型

    /~ {username} ~/
    /~ {age?int} ~/
    /~ {birthDate?timestamp(yyyy年MM月dd日)} ~/

    中括號[]與大括號{}的區(qū)別

    中括號會直接替換為其值,用于拼接SQL
    在XsqlFilterResult.getAcceptedFilters()中不會存在該key的值
    如 /~ username like '%[username]%' ~/,如果filters中username=badqiu
    則會生成: username like '%badqiu%'

    大拓號只是起到標(biāo)記作用,用于占位符
    原始方法是XsqlBuilder.applyFilters(sql,filters);
    如"/~ and username = {username} ~/",過濾完還是為 and username = {username}
    但在這時我們使用將{username}替換為HQL的:username或是SQL的?號

    SQL注入攻擊的防范

    問題:
    拼接的SQL如果不對單引號(有些數(shù)據(jù)庫有反斜杠)進(jìn)行過濾,則會存在SQL注入攻擊問題

    解決:
    使用SafeSqlProcesser,進(jìn)行sql過濾

    										
    1?XsqlBuilder?builder?=?new?XsqlBuilder(SafeSqlProcesserFactory.getMysql());

    SafeSqlProcesser其中的一個源碼分析

    										
    1?/**
    2??*?過濾單個單引號為雙引號的SafeSqlFilter<p>
    3??*?適用數(shù)據(jù)庫(MS?SqlServer,Oracle,DB2)
    4??*/
    5?public?String?process(String?value)?{
    6?????if(value?==?null)?return?null;
    7?????return?value.replaceAll("'",?"''");?//?Mysql還需過濾反斜框
    8?}
    9?





    最后不忘為rapid-framework宣傳一下,本工具也集成在里面
    rapid-framework簡介:
    一個類似 ruby on rails 的java web快速開發(fā)腳手架,本著不重復(fù)發(fā)明輪子的原則,框架只是將零散的struts(struts2)+spring+hibernate各個組件組裝好在一起,并對struts及struts2進(jìn)行改造,提供零配置編程,并內(nèi)置一個強大的代碼生成器及模板文件, 可以生成java的hibernat model,dao,manager,struts+struts2 action類,可以生成jsp的增刪改查及列表頁面

    快速演示視頻下載
    代碼生成器生成的增刪改查截圖

    posted on 2008-08-07 09:26 badqiu 閱讀(3669) 評論(12)  編輯  收藏

    評論

    # re: 動態(tài)構(gòu)造sql的利器:rapid-xsqlbuider詳細(xì)說明  回復(fù)  更多評論   

    好東西!支持!
    2008-08-07 12:41 | R_XiaoGuang

    # re: 動態(tài)構(gòu)造sql的利器:rapid-xsqlbuider詳細(xì)說明  回復(fù)  更多評論   

    where 1=1 真tmd的搞笑,這年頭居然還有這種人~
    2008-08-07 13:09 | po

    # re: 動態(tài)構(gòu)造sql的利器:rapid-xsqlbuider詳細(xì)說明[未登錄]  回復(fù)  更多評論   

    @po
    但不知你還有其它更好的辦法?
    2008-08-07 13:13 | badqiu

    # re: 動態(tài)構(gòu)造sql的利器:rapid-xsqlbuider詳細(xì)說明  回復(fù)  更多評論   

    好東西,非常感謝
    @po
    可以不同意,請不要出言不遜,這不是技術(shù)人員討論問題的方式。你可以做出更好的東西show一下啊
    2008-08-07 13:27 | xihuyu2000

    # re: 動態(tài)構(gòu)造sql的利器:rapid-xsqlbuider詳細(xì)說明  回復(fù)  更多評論   

    outputFile


    2008-08-07 14:43 | wdd

    # re: 動態(tài)構(gòu)造sql的利器:rapid-xsqlbuider詳細(xì)說明  回復(fù)  更多評論   

    @po
    where 1=1可以避免很多繁瑣的判斷,而且SQL server在優(yōu)化時會直接將這句話去掉,不會有什么性能影響。
    2008-08-07 18:59 | lijin

    # re: 動態(tài)構(gòu)造sql的利器:rapid-xsqlbuider詳細(xì)說明  回復(fù)  更多評論   

    跟ibatis比,性能優(yōu)多少?
    有測試過不?

    如果性能差距不大,我情愿選擇ibatis
    2008-08-07 20:34 | galaxystar

    # re: 動態(tài)構(gòu)造sql的利器:rapid-xsqlbuider詳細(xì)說明[未登錄]  回復(fù)  更多評論   

    十萬條下面的語句循環(huán)構(gòu)造,差不多7,8秒吧,具體可以看XsqlBuilderTest.testPerformence();
    性能問題可以忽略不計

    "select * from user where 1=1"
    +"/~ and username = {username}~/"
    +"/~ and pwd = '[password]'~/"
    +"/~ and age = {age}~/";
    2008-08-07 22:05 | badqiu

    # re: 動態(tài)構(gòu)造sql的利器:rapid-xsqlbuider詳細(xì)說明[未登錄]  回復(fù)  更多評論   

    10萬條循環(huán):
    [PerformenceTest],count:100000 costTime:2406ms
    2008-08-08 10:36 | badqiu

    # re: 動態(tài)構(gòu)造sql的利器:rapid-xsqlbuider詳細(xì)說明  回復(fù)  更多評論   

    where 1=1這句是必須的,你用過就知道了。少了有時會報錯!
    2009-06-05 21:02 | 事實上

    # re: 動態(tài)構(gòu)造sql的利器:rapid-xsqlbuider詳細(xì)說明  回復(fù)  更多評論   

    性能問題應(yīng)該不是主要的,不必過多注意
    2011-10-17 03:41 | 注冊公司

    # re: 動態(tài)構(gòu)造sql的利器:rapid-xsqlbuider詳細(xì)說明  回復(fù)  更多評論   

    請問時間怎么查詢
    2015-10-26 23:57 | 林曉升

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 中文字幕亚洲激情| 国产猛烈高潮尖叫视频免费| 国产a v无码专区亚洲av| 日韩国产欧美亚洲v片| 热99re久久免费视精品频软件| 亚洲国产欧美国产综合一区| 免费看少妇作爱视频| 亚洲av无码专区国产不乱码| 国产高清视频在线免费观看| 边摸边脱吃奶边高潮视频免费| 羞羞的视频在线免费观看| 国产成人99久久亚洲综合精品| 9久久免费国产精品特黄| 久久99国产亚洲高清观看首页| 久久久久久久99精品免费观看| 亚洲色欲或者高潮影院| 成年女人毛片免费观看97| 亚洲精品色播一区二区| 亚洲精品人成无码中文毛片| 中国极品美軳免费观看| 久久亚洲熟女cc98cm| 99在线视频免费观看视频| 久久久亚洲精华液精华液精华液| 免费99热在线观看| 免费看一区二区三区四区| 亚洲黄色在线观看视频| 四虎www成人影院免费观看| 一区二区三区免费视频播放器| 亚洲va无码手机在线电影| 一二三四影视在线看片免费| 一级特黄aaa大片免费看| 精品无码一区二区三区亚洲桃色 | 免费人成在线观看网站品爱网日本| 日本黄页网址在线看免费不卡| 亚洲国产精品VA在线看黑人| 永久免费的网站在线观看| 日韩在线视频播放免费视频完整版 | 亚洲AV区无码字幕中文色| 永久黄网站色视频免费| 日本免费A级毛一片| 亚洲精品理论电影在线观看|