1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > java实现SQL查询语句的动态拼接

java实现SQL查询语句的动态拼接

时间:2018-11-30 22:36:16

相关推荐

java实现SQL查询语句的动态拼接

1、需求:根据传入的参数动态截取/拼接SQL的查询语句

2、实现类

package test.util;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;public class SqlUtils{/* \\s是\s,因为java里需要转义:匹配任何空白字符,包括空格、制表符、换页符等等* *:匹配前面的子表达式零次或多次* |:或者* {0,1}:有0个或者1个* \"是",java需要转义:匹配单引号* \\{和\\}:分别是{和},2个斜杠是转义符* [a-z_A-Z.0-9]:匹配大/小写的字符、还可以包含0-9的数字和“.”【一般用于多表联查时,如A1.name等】* [|%']:匹配“|”、“%”、“'”【一般用于like的参数时,如name like '%'||#{name}||'%'等】* [a-zA-Z]:匹配大/小写开头的字符都可以* [a-z_A-Z]:匹配字符,中间可有“_”下划线**/private static String rgex = "\\s*(where|and|or|WHERE|AND|OR){0,1}\\s*\"{0,1}([a-z_A-Z.0-9])+\"{0,1}\\s*(=|>=|<=|>|!=|<|like)\\s*[|%']*#\\{\\s*([a-z_A-Z])+\\s*\\}[|%']*";private static String rge = "#\\{\\s*([a-z_A-Z])+\\s*\\}";public static String getSql(String sql,Map<String, String>map) {StringBuffer rsql = new StringBuffer(); //接口对应的sqlPattern p=pile(rgex); //把规则编译成模式对象Matcher m=p.matcher(sql); //通过模式对象得到匹配器对象,进行匹配boolean flag=false;int index=0;int length=sql.length();while(m.find()) {//find():查找有没有满足条件的字符串int start=m.start(); //满足条件的字符串,开始的位置(下标)if(index<start) {rsql.append(sql.substring(index,start));}String text=m.group(); //获取值/字符串System.out.println("****************************************************\n满足条件的字符串:"+text); //一定要先find(),然后才能group()String[] arrey=text.trim().split("\\s+"); //根据空格将每一个字符串进行分割开,并添加到数组中for (int i = 0; i < arrey.length; i++) {System.out.println("分割后的字符串数组内容:"+arrey[i]);}System.out.println("map中的参数对应的值:"+map.get(arrey[3].substring(arrey[3].indexOf("#{")+2,arrey[3].indexOf("}")).trim()));if(map.get(arrey[3].substring(arrey[3].indexOf("#{")+2,arrey[3].indexOf("}")).trim())==null) { //获取参数,且判断参数有传非空值进来if(arrey[0].indexOf("WHERE")!=-1||arrey[0].indexOf("where")!=-1) {flag=true; //连接条件是where}}else { //参数没有传值or没有传入该参数if(flag) { //第一个满足的条件查询连接词应是where,所以直接拼接where,且查询条件从第二个字符开始拼接System.out.println("查询条件与where拼接"+" WHERE "+arrey[1]+" "+arrey[2]+" "+arrey[3].replace(arrey[3].substring(arrey[3].indexOf("#{"),arrey[3].indexOf("}")+1).trim(),"'"+map.get(arrey[3].substring(arrey[3].indexOf("#{")+2,arrey[3].indexOf("}")).trim()).toString()+"'"));rsql.append(" WHERE "+arrey[1]+" "+arrey[2]+" "+arrey[3].replace(arrey[3].substring(arrey[3].indexOf("#{"),arrey[3].indexOf("}")+1).trim(),"'"+map.get(arrey[3].substring(arrey[3].indexOf("#{")+2,arrey[3].indexOf("}")).trim()).toString()+"'"));flag=false; //where加上后改成false,避免重复拼接导致语法错误}else { //直接拼接System.out.println("满足条件的查询条件语句:"+text.replace(arrey[3].substring(arrey[3].indexOf("#{"),arrey[3].indexOf("}")+1).trim(),"'"+map.get(arrey[3].substring(arrey[3].indexOf("#{")+2,arrey[3].indexOf("}")).trim()).toString()+"'"));rsql.append(text.replace(arrey[3].substring(arrey[3].indexOf("#{"),arrey[3].indexOf("}")+1).trim(),"'"+map.get(arrey[3].substring(arrey[3].indexOf("#{")+2,arrey[3].indexOf("}")).trim()).toString()+"'"));}}index=m.end(); //满足条件的结束位置};if(index<length) { //如果满足条件的下标小于整体的SQL长度,说明存在满足条件查询的字符串,应追加到rsql中rsql.append(sql.substring(index,length));}System.out.println("————————————————————————————————————————————————————————————\n最终的SQL语句:"+rsql.toString());return rsql.toString();}}

3、测试类

package test.main;import java.util.HashMap;import java.util.Map;import test.util.SqlUtils;public class TestSqL {public static void main(String[] args) {String sql="select * from user where id = #{id} and name = #{name} and sex like '%'||#{sex}||'%' and createDate > #{beginDate} and createDate < #{endDate}";Map<String, String> map = new HashMap<>();map.put("name","来福");map.put("sex","男");map.put("beginDate","-11-01");map.put("endDate","-11-30");String sql1 = SqlUtils.getSql(sql,map);}}

4、控制台结果输出

****************************************************满足条件的字符串: where id = #{id}分割后的字符串数组内容:where分割后的字符串数组内容:id分割后的字符串数组内容:=分割后的字符串数组内容:#{id}map中的参数对应的值:null****************************************************满足条件的字符串: and name = #{name}分割后的字符串数组内容:and分割后的字符串数组内容:name分割后的字符串数组内容:=分割后的字符串数组内容:#{name}map中的参数对应的值:来福查询条件与where拼接 WHERE name = '来福'****************************************************满足条件的字符串: and sex like '%'||#{sex}||'%'分割后的字符串数组内容:and分割后的字符串数组内容:sex分割后的字符串数组内容:like分割后的字符串数组内容:'%'||#{sex}||'%'map中的参数对应的值:男满足条件的查询条件语句: and sex like '%'||'男'||'%'****************************************************满足条件的字符串: and createDate > #{beginDate}分割后的字符串数组内容:and分割后的字符串数组内容:createDate分割后的字符串数组内容:>分割后的字符串数组内容:#{beginDate}map中的参数对应的值:-11-01满足条件的查询条件语句: and createDate > '-11-01'****************************************************满足条件的字符串: and createDate < #{endDate}分割后的字符串数组内容:and分割后的字符串数组内容:createDate分割后的字符串数组内容:<分割后的字符串数组内容:#{endDate}map中的参数对应的值:-11-30满足条件的查询条件语句: and createDate < '-11-30'————————————————————————————————————————————————————————————最终的SQL语句:select * from user WHERE name = '来福' and sex like '%'||'男'||'%' and createDate > '-11-01' and createDate < '-11-30'

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。