java动态拼接sql语句并且执行时给sql语句的参数赋值

问题

在这里举一个例子,比如我要做一个多条件模糊查询,用户输入的时候有可能输入一个条件,也有可能输入两个条件,这时执行查询的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());
    }

原文地址:https://www.cnblogs.com/Alitac/p/12311976.html

时间: 2024-10-07 07:16:55

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

DbCommandInterceptor抓取EF执行时的SQL语句

EF6.1也出来不少日子了,6.1相比6.0有个很大的特点就是新增了System.Data.Entity.Infrastructure.Interception 命名空间,此命名空间下的对象可以允许我们更加方便的了解到EF运行时的一些信息,当然我们最想看的还是EF生成的Sql语句,话不多讲,开始干吧; /// <summary> /// 抓取EF执行时的SQL语句 /// </summary> public class EFIntercepterLogging : DbComman

【java】计算一段代码执行时长

1 public class Test_currentTimeMillis { 2 public static void main(String[] args) { 3 long start=System.currentTimeMillis(); 4 for(int i=0;i<Integer.MAX_VALUE;i++){} 5 long end=System.currentTimeMillis(); 6 System.out.println("for语句执行时长:"+(end

shell脚本在执行时,向脚本传递参数

Shell脚本在执行时,也可以像命令和应用程序一样,接收脚本参数. 一个应用实例: vi addhead.sh: suaddhead ns=591 <$1 |sushw key=dt a=20000|sushw key=fldr,cdp a=1,1 b=0,1 c=1,0 j=1301,1301> $2 执行: ./addhead.sh rtm_step10_lap.dat rtm_step10_lap.su(其中,rtm_step10_lap.dat是输入数据,输入给$1, 输出为:rtm_

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

在实际业务中经常需要拼接动态SQL来完成复杂数据计算,网上各类技术论坛都有讨论,比如下面这些问题: http://bbs.csdn.net/topics/390876591 http://bbs.csdn.net/topics/390981627 https://www.linkedin.com/groups/SQL-Query-Help-needed-137774.S.5948812806903119877?trk=groups_items_see_more-0-b-ttl http://bb

Java下拼接执行动态SQL语句

Java拼接动态SQL的一般做法有       1.使用动态语句 很多数据库都提供了处理动态SQL的语法,如Oracle的EXECUTE IMMEDIATE语句.MSSQL的EXEC和SP_EXECUTESQL.Mysql的预处理语句等.这些功能让我们在数据库端来处理动态查询提供了极大遍历,但这种方式只适用于相对简单地动态查询,复杂的情况经常会采用下面的方式. 2.使用存储过程 对于复杂的情况,一般会在存储过程中来拼接动态SQL.使用存储过程完成相对灵活,但编码复杂度过高,有时运行效率较低. 3

动态拼接SQL语句

1.参考官方文档 ? if:字符判断 ? choose (when, otherwise):分支选择 ? trim (where, set):字符串截取:其中where标签封装查询条件,set标签封装修改条件 ? foreach 2.if案例 1)在EmployeeMapper接口中添加一个方法: //携带了哪个字段,查询条件就带上哪个字段的值 public List<Employee> getEmployeeByConditionIf(Employee employee); 2).如果要写下

mybatis-使用if动态拼接sql

一.创建项目和数据库    项目名称:mybatis092901    数据库名称:mybatis0929        表名称:dept        CREATE TABLE `dept` (          `deptNo` int(11) NOT NULL,          `deptName` varchar(30) DEFAULT NULL,          `location` varchar(30) DEFAULT NULL,          PRIMARY KEY (`

在 Java 中如何更高效地存储和管理 SQL 语句?

[编者按]还在为管理 Java 代码中的 SQL 语句而烦恼吗?让 Zemian 帮你摆脱困境吧!本文系 OneAPM 工程师编译整理 注意:使用java.util.Properties#loadFromXML其实会更简单! 如果使用的是普通的.没有任何外部类库的 Java JDBC,那么就必须得自己去管理 SQL 语句.很不幸的是,Java String 并不支持多行结构,所以开发者必须使用许多引号+连接符来拼接语句,这会使得 SQL 语句非常难于阅读和管理.同时,这也使得维护和测试(尝试从

郑州尚学堂:在 Java 中如何更高效地存储和管理 SQL 语句?

如果使用的是普通的.没有任何外部类库的 Java JDBC,那么就必须得自己去管理 SQL 语句.很不幸的是,Java String 并不支持多行结构,所以开发者必须使用许多引号+连接符来拼接语句,这会使得 SQL 语句非常难于阅读和管理.同时,这也使得维护和测试(尝试从 Java 代码中 Copy 一条 SQL 语句到 SQL 客户端运行)更加困难.如果能保证整条 SQL 语句完好无缺,又避免了 Java 的干扰,就更好了.这里有个快速解决方案,把 SQL 查询语句存储在 XML 的 CDAT