版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第java正則替換sql中的參數(shù)實(shí)例代碼目錄前言要求:分析:代碼:測試:總結(jié):
前言
在處理sql參數(shù)的時(shí)候,替換圓括號(hào)里面只處理了一種情況。而沒有從整體上進(jìn)行處理?。?!
這是一個(gè)思考問題上嚴(yán)重的偏向??紤]問題時(shí)候,要先從整體開始考慮,逐步分解,再細(xì)分到局部!
要求:
替換sql里面的參數(shù):
SELECTa.table_id,a.table_title,a.table_name,a.table_serial,b.STAFF_NAME,
b.REGION_NAME,b.operatingsystem,b.renduoxuan
FROMtable_basica,table_177bWHEREa.table_id=b.table_id
ANDa.table_serialin($formSerial)anda.create_date=$createStartDate
ANDa.create_date=$createEndDateora.statelike'%$state%'
ANDb.tickettitlein($tickettitle)
GROUPBYa.table_idORDERBYstate_dateDESC
參數(shù):
MapString,ObjectsqlParam=newHashMap();
sqlParam.put("state","A,F");
sqlParam.put("tableSerial","COM,tt");
對(duì)于參數(shù)里面有的值進(jìn)行替換,沒有的值,替換為空。
分析:
sql里面支持大小寫,替換的時(shí)候,要處理大小寫。
常見的sql條件里面有:where、in、or、like
如果where后面的條件都為空設(shè)置為1=1
\s匹配任何空白字符,包括空格、制表符、換頁符等等。等價(jià)于[\f\n\r\t\v]。
前面條件的正則:
\\s+(where|WHERE|and|AND|or|OR)(\\s+[a-zA-Z0-9_.]+)(\\s*(IN|in|=|=|||=|like|LIKE)+)
Stringcondition="\\s+(where|WHERE|and|AND|or|OR)(\\s+[a-zA-Z0-9_.]+)(\\s*(IN|in|=|=|||=|like|LIKE)+)";
后面條件的正則:
帶like:\s*\(*%\$([a-zA-Z_.]*)%\)*
其它:\s*\(*\$([a-zA-Z_.]*)\)*
兩個(gè)不好合并在一起處理,就分開來。
代碼:
publicstaticStringreplaceConditionStr(Stringcontent,MapString,Objectparam){
StringlikeCondition="\\s*\\(*\'%\$([a-zA-Z_.]*)%'\\)*";
content=replaceOtherConditionStr(content,param,likeCondition);
StringotherCondition="\\s*\\(*\\$([a-zA-Z_.]*)\\)*";
returnreplaceOtherConditionStr(content,param,otherCondition);
publicstaticStringreplaceOtherConditionStr(Stringcontent,MapString,Objectparam,StringparamConfition){
Stringcondition="\\s+(where|WHERE|and|AND|or|OR)(\\s+[a-zA-Z0-9_.]+)(\\s*(IN|in|=|=|||=|like|LIKE)+)";
Stringpattern=condition+paramConfition;
Patternp=Ppile(pattern);
Matcherm=p.matcher(content);
while(m.find()){
Stringgroup=m.group();
Stringoperator=m.group(4);
Stringkey=m.group(5);
if(key.contains(".")){
key=StringUtils.substringAfter(key,".");
Stringvalue=MapUtils.getString(param,key);
if(StringUtils.isBlank(value)){
if(group.contains("WHERE")||group.contains("where")){
content=content.replace(group,"where1=1");
content=content.replace(group,"");
}else{
if("like".equals(operator)||"LIKE".equals(operator)){
if(!group.contains("%")){
value=("\'%").concat(value).concat("%'");
}else{
if("in".equals(operator)||"IN".equals(operator)){
ListStringvalueArr=Arrays.asList(value.split(","));
value=ListUtils.emptyIfNull(valueArr).stream().map(s-"\'"+s.trim()+"'")
.collect(Collectors.joining(","));
}else{
value=("\'").concat(value).concat("'");
content=content.replace("$"+key,value);
returncontent;
}
測試:
publicstaticvoidmain(String[]args){
testSqlEmpty();
testSqlReplace();
publicstaticvoidtestSqlEmpty(){
StringsqlContent="SELECTa.table_id,a.table_title,a.table_name,a.table_serial,b.STAFF_NAME,b.REGION_NAME,"
+"b.operatingsystem,b.renduoxuanFROMtable_basica,table_177bWHERE"
+"a.table_serialin($formSerial)anda.create_date=$createStartDate"
+"ANDa.create_date=$createEndDateora.statelike'%$state%'"+
"ANDb.tickettitlein($tickettitle)GROUPBYa.table_idORDERBYstate_dateDESC";
MapString,ObjectsqlParam=newHashMap();
System.out.println("emptyparam:"+replaceConditionStr(sqlContent,sqlParam));
publicstaticvoidtestSqlReplace(){
StringsqlContent="SELECTa.table_id,a.table_title,a.table_name,a.table_serial,b.STAFF_NAME,b.REGION_NAME,"
+"b.operatingsystem,b.renduoxuanFROMtable_basica,table_177bWHEREa.table_id=b.table_id"
+"ANDa.table_serialin($formSerial)anda.create_date=$createStartDate"
+"ANDa.create_date=$createEndDateora.statelike'%$state%'"+
"ANDb.tickettitlein($tickettitle)GROUPBYa.table_idORDERBYstate_dateDESC";
MapString,ObjectsqlParam=newHashMap();
sqlParam.put("state","A,F");
sqlParam.put("tableSerial","COM,tt");
System.out.println("haveparam:"+replaceConditionStr(sqlContent,sqlParam));
}
emptyparam:SELECTa.table_id,a.table_title,a.table_name,a.table_serial,b.STAFF_NAME,b.REGION_NAME,b.operatingsystem,b.renduoxuanFROMtable_basica,table_177bwhere1=1GROUPBYa.table_idORDERBYstate_dateDESC
haveparam:SELECTa.table_id,a.table_title,a.table_name,a.table_serial,b.STAFF_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年遂昌縣幼兒園教師招教考試備考題庫及答案解析(必刷)
- 土方施工運(yùn)輸計(jì)劃及安全操作規(guī)程
- 2025年長沙環(huán)境保護(hù)職業(yè)技術(shù)學(xué)院馬克思主義基本原理概論期末考試模擬題含答案解析(奪冠)
- 2026年銷售策略培訓(xùn)協(xié)議
- 2024年西充縣幼兒園教師招教考試備考題庫及答案解析(奪冠)
- 2026年烏魯木齊職業(yè)大學(xué)單招職業(yè)傾向性考試模擬測試卷帶答案解析
- 2025年興安縣幼兒園教師招教考試備考題庫含答案解析(必刷)
- 2024年淮南職業(yè)技術(shù)學(xué)院馬克思主義基本原理概論期末考試題帶答案解析
- 2024年陽山縣幼兒園教師招教考試備考題庫及答案解析(奪冠)
- 2026年太原幼兒師范高等??茖W(xué)校單招職業(yè)傾向性考試模擬測試卷帶答案解析
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會(huì)成熟人才招聘備考題庫及參考答案詳解1套
- 思政教師培訓(xùn)心得課件
- 2026國家國防科技工業(yè)局所屬事業(yè)單位第一批招聘62人備考題庫及參考答案詳解
- 大型船舶拆除方案范本
- LoRa技術(shù)教學(xué)課件
- 2025中央廣播電視總臺(tái)招聘144人筆試歷年題庫附答案解析
- 急性高原疾病課件
- 牧業(yè)公司生產(chǎn)安全預(yù)案
- 腦機(jī)接口科普
- 2025年湖北煙草專賣局招聘考試真題及答案
- 教育資源分享平臺(tái)管理框架模板
評(píng)論
0/150
提交評(píng)論