• 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());
        }
    




  • 相关阅读:
    Vmware
    Centos8
    Jmeter系列(37)- 详解 ForEach控制器
    【解决】k8s 1.15.2 镜像下载方案
    【解决】MacOS下 Python3.7 使用 pyinstaller 打包后执行报错 Failed to execute script pyi_rth__tkinter
    【解决】venv 的名字在 zsh prompt 中不显示
    【解决】could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network
    《Linux 性能优化实战—倪朋飞 》学习笔记 CPU 篇
    【解决】MongoDB 线上业务处理,数据去重脚本实现
    【解决】docker 容器中 consul集群问题处理
  • 原文地址:https://www.cnblogs.com/Alitac/p/12311976.html
Copyright © 2020-2023  润新知