问题

在这里举一个例子,比如我要做一个多条件模糊查询,用户输入的时候有可能输入一个条件,也有可能输入两个条件,这时执行查询的sql语句就不确定了,但可以用动态拼接sql语句来解决这个问题。

解决方法

1.就拿我上面的那个多条件模糊查询为例,第一步是拼接sql语句,先定义一个通用的sql语句,String sql = "select * from user where 1 = 1 ";这里添加where 1= 1是一个小技巧,方便后面sql语句的拼接。

String sql = "select * from user where 1 = 1 ";
StringBuilder sb = new StringBuilder(sql);//创建一个StringBuilder并先把定义的通用sql放进去

2.在这里我用一个map集合将条件查询的三个参数在servlet中获取了,接下来遍历map集合判断对应的属性是否有值,如果有值可以拼接到刚才定义的通用sql语句后面

//遍历map看是否有属性,condition是一个把jsp页面传递过来输入数据封装的map集合
Set<String> keySet = condition.keySet();
//定义参数集合
List<Object> params = new ArrayList<Object>(); for (String key : keySet) {
//排除分页条件参数
if ("currentPage".equals(key)||"rows".equals(key)){
continue;//结束当前循环
}
String value = condition.get(key)[0];
//判断value是否有值
if (value != null && !"".equals(value)){
//动态拼接sql
sb.append(" and "+key+" like ? ");
params.add("%"+value+"%");//加?的值
}
}

3.执行sql,执行时需要参数,这又是一个问题,我得解决方法时定义了一个list集合,用于存储参数的值value,到最后执行写进去,由于是个list集合,可以直接用list.toArray转化为参数数组写进去

return template.query(sb.toString(),new BeanPropertyRowMapper<User>(User.class),params.toArray());

非常重要的注意事项

  1. 拼接sql的时候一定要注意空格,尽量多留几个空格,否则sql拼接后报错了
  2. 拼接好的sql需要使用toString将StringBuilder转化为String类型,参数直接使用toArray()将list集合转化为参数数组

整体

    public List<User> findByPage(Map<String, String[]> condition) {

        String sql = "select * from user where 1 = 1 ";
StringBuilder sb = new StringBuilder(sql);
//遍历map看是否有属性
Set<String> keySet = condition.keySet();
//定义参数集合
List<Object> params = new ArrayList<Object>(); for (String key : keySet) {
//排除分页条件参数
if ("currentPage".equals(key)||"rows".equals(key)){
continue;//结束当前循环
}
String value = condition.get(key)[0];
//判断value是否有值
if (value != null && !"".equals(value)){
//动态拼接sql
sb.append(" and "+key+" like ? ");
params.add("%"+value+"%");//加?的值
}
} return template.query(sb.toString(),new BeanPropertyRowMapper<User>(User.class),params.toArray());
}

java动态拼接sql语句并且执行时给sql语句的参数赋值的更多相关文章

  1. DbCommandInterceptor抓取EF执行时的SQL语句

    EF6.1也出来不少日子了,6.1相比6.0有个很大的特点就是新增了System.Data.Entity.Infrastructure.Interception 命名空间,此命名空间下的对象可以允许我 ...

  2. 【java】计算一段代码执行时长java.lang.System类里的public static long currentTimeMillis()方法

    public class Test_currentTimeMillis { public static void main(String[] args) { long start=System.cur ...

  3. [转载代码]VB.NET 中查询 Linq to SQL 执行时的SQL语句

    在搜索使用LINQ TO SQL 添加数据后获得自增长ID的方法时,发现C#可以使用DebuggerWritter把使用Linq to SQL执行的SQL语句显示到即时窗口,于是在网上搜索到在VB.N ...

  4. oracle11g中SQL优化(SQL TUNING)新特性之SQL Plan Management(SPM)

    1.   简介 Oracle Database11gR1引进了SQL PlanManagement(简称SPM),一套允许DBA捕获和保持任意SQL语句执行计划最优的新工具,这样,限制了刷新优化器统计 ...

  5. Java下拼接运行动态SQL语句

    mod=viewthread&tid=3039" target="_blank">Java拼接动态SQL的一般做法有       1.使用动态语句 非常多数 ...

  6. Java下拼接执行动态SQL语句(转)

    在实际业务中经常需要拼接动态SQL来完成复杂数据计算,网上各类技术论坛都有讨论,比如下面这些问题: http://bbs.csdn.net/topics/390876591 http://bbs.cs ...

  7. 《大话数据库》-SQL语句执行时,底层究竟做了什么小动作?

    <大话数据库>-SQL语句执行时,底层究竟做了什么小动作? 前言 大家好,我是Taoye,试图用玩世不恭过的态度对待生活的Coder. 现如今我们已然进入了大数据时代,无论是业内还是业外的 ...

  8. 动态拼接SQL语句

    1.参考官方文档 ? if:字符判断 ? choose (when, otherwise):分支选择 ? trim (where, set):字符串截取:其中where标签封装查询条件,set标签封装 ...

  9. Java 使用Query动态拼接SQl

    之前有做个一个自定义报表的查询,这里使用的是一个动态的sql拼接,是前端选择了什么指标就查询什么信息!(这里的指标是多个表的字段,前端随便选择了这些指标,然后后端根据这些指标拼接sql,返回这些指标的 ...

随机推荐

  1. CSS-18-媒体查询

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. ES6笔记分享 part 2

    ECMAScript ES6 从一脸懵逼到灵活运用 接 part 1 New String Methods const id = 'adcd123456x'; const fan = 'I love ...

  3. 前端url参数中带有callback并产生错误

    错误截图: 初步诊断是由于后端返回值的数据格式不正确造成的 解决方式: 1).接受在springmvc中接受callback参数 2).将对象转为Object 3).拼接callback方法,其中返回 ...

  4. Android教程2020 - RecyclerView显示多种item

    Android教程2020 - 系列总览 本文链接 前面我们已经用RecyclerView显示一些数据.也知道如何获取滑动的距离. 前面我们的列表中显示的都是同类数据.如果要在一个列表中显示不同类别的 ...

  5. Marginalize

    在David M.Blei 的Distance Dependent Chinese Restaurant Processes 中提到:DDCRP 的一个重要性质,也是和dependent DP 的一个 ...

  6. 【转】spring framework 5以前体系结构及内部各模块jar之间的maven依赖关系

    作者:凌承一  出处:http://www.cnblogs.com/ywlaker/  很多人都在用spring开发java项目,但是配置maven依赖的时候并不能明确要配置哪些spring的jar, ...

  7. springcloud 依赖版本问题

    SpringCloud 版本: 版本名称 版本 Finchley snapshot版 Edgware snapshot版 Dalston SR1 当前最新稳定版本 Camden SR7 稳定版本 Br ...

  8. PAT (Advanced Level) Practice 1001-1005

    PAT (Advanced Level) Practice 1001-1005 PAT 计算机程序设计能力考试 甲级 练习题 题库:PTA拼题A官网 背景 这是浙大背景的一个计算机考试 刷刷题练练手 ...

  9. MVVM框架(二)---生命周期

    一.Vue 生命周期图解: 这张图是官方给出的,大家可能都看过.其中我们重点讲述以下几个钩子函数: beforeCreate  -->   created beforeMount   --> ...

  10. 13.深度学习(词嵌入)与自然语言处理--HanLP实现

    笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 13. 深度学习与自然语言处理 13.1 传统方法的局限 前面已经讲过了隐马尔可夫 ...