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=Pattern.compile(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","2020-11-01");map.put("endDate","2020-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中的参数对应的值:2020-11-01
满足条件的查询条件语句: and createDate > '2020-11-01'
****************************************************
满足条件的字符串: and createDate < #{endDate}
分割后的字符串数组内容:and
分割后的字符串数组内容:createDate
分割后的字符串数组内容:<
分割后的字符串数组内容:#{endDate}
map中的参数对应的值:2020-11-30
满足条件的查询条件语句: and createDate < '2020-11-30'
————————————————————————————————————————————————————————————
最终的SQL语句:select *  from  user WHERE name = '来福' and sex like '%'||'男'||'%' and createDate > '2020-11-01' and createDate < '2020-11-30'

java实现SQL查询语句的动态拼接相关推荐

  1. java中sql查询语句_JAVA中用 SQL语句操作小结

    1.添加记录(INSERT) 使用SQL语句的INSERT命令可以向数据库中插入记录,INSERT命令的基本形式为: INSERT INTO 表名 [(字段名1,字段名2-)] VALUES (值1, ...

  2. Linux操作Oracle(13)——java执行sql查询语句 报错 “无法绑定由多个部分组成的标识符“ 解决方案

    目录 问题描述: 问题分析 1.sql语句写的有问题 2.java项目 没有及时清理 问题解决

  3. java构造sql查询语句时date和datetime的用法

    我们知道数据库中的日期格式有两种,一种是带时分秒的datetime类型, 即yyyy-MM-dd HH-mm-ss, 以及只有年月日的date类型,即yyyy-MM-dd. 那么我们应该怎么查询这两种 ...

  4. java中SQL查询语句有like '%?%'怎么写

    在mysql里面我们直接用:这条sql语句. 是没有什么问题的,执行的结果如下 但是我们想要在java里面写一条sql语句能和这条语句相同.一开始,我在java里面用了这一条语句 当我运行结果时,我发 ...

  5. 从零开始学Java编程!java中sql查询语句

    那么,如何学习Kafka源码?? 我觉得最高效的方式就是去读最核心的源码,先看一张 Kafka结构图 以及 Kafka 源码全景图 梳理一下关于 Kafka 框架,找到学习的重点. 其次,我要说的就是 ...

  6. 使用VBA动态创建SQL查询语句

    在VBA使用ADO可以高效的查询数据,但是写SQL查询语句是个有些令人头痛的事情,其实在ADO中用到的SQL语句的语法并不是很复杂,很多时候是由于即要思考SQL的语法,又要用VBA的字符串连接命令,最 ...

  7. java SQL查询语句

    SQL查询语句 聚合函数 分组查询 查询指定字段信息 select 字段1,字段2,-from 表名; 例如: select id,name from zhangwu; 查询表中所有字段 select ...

  8. SQL查询语句大全(转)

    转自https://www.cnblogs.com/chenglc/p/8421492.html 重点参考https://blog.csdn.net/g1418377085/article/detai ...

  9. (转)经典SQL查询语句大全

    一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...

最新文章

  1. linux中普通文件和块设备文件的区别
  2. Java源码详解三:Hashtable源码分析--openjdk java 11源码
  3. mysql function使用
  4. Linux的僵尸进程及其解决方法(转)
  5. Java中关于单核处理多个线程的认识与了解
  6. 谷歌浏览器怎么设置中文
  7. mysql的缓存机制是什么意思_MySQL缓存机制详解
  8. Python学生信息管理系统的开发
  9. 【java】swing编写窗体
  10. 常见的大数据误区有哪些
  11. RocketMQ-安装使用
  12. 四川电信在广元市建大数据中心
  13. 编译内核是几个常用的命令备忘
  14. table td 横向求和
  15. P1067 多项式输出---java
  16. 视频损坏解决办法(个人记录)
  17. word文件不能编辑是什么原因
  18. 浅谈数仓建模及其方法论
  19. 爬虫学的好,牢饭吃得好(爬虫实例)
  20. 机器视觉照明技术Machine Vision Light Technique

热门文章

  1. 先进封装,一个大周期的开始——“迎风国潮”半导体设备研讨会
  2. ubuntu系统分辨率只有640*480的解决办法,适用部分正方形屏幕
  3. 在 chrome 上导出 pdf
  4. 君子签区块链电子签约打通房企数字化转型最后一公里
  5. 华为交换机接口速率,双工模式配置,协商模式配置
  6. 基于深度学习人脸性别识别项目
  7. “联邦对抗技术大赛”9月开战 微众银行呼唤开发者共同“AI创新”
  8. spotify mp3_我的乐高人仔玩spotify
  9. 修改deepin键位映射
  10. sql server中quotename()函数的用法(转载)