JDBC程序,为了防止SQL注入,通常需要进行参数化查询,但是如果存在多个不确定参数,就比较麻烦了,查阅了一些资料,最后解决了这个问题,现在这里记录一下:

 
public List<TabDlxx> searchTabDlxxs(TabDlxx tabDlxx){
  List<TabDlxx> tdList = new ArrayList<TabDlxx>();
  StringBuffer sql = new StringBuffer();
  sql.append("select * from tab_dlxx where 1=1 ");
  PreparedStatement ps = null;
  ResultSet rs = null;
  conn = MyDataSource.getConnection();
  try {
   if(null != tabDlxx){
    List<Object> list = new ArrayList<Object>();
    this.addStatement(tabDlxx, list, sql);
    ps = conn.prepareStatement(sql.toString());
    this.pstSetObject(ps, list);
    rs = ps.executeQuery();
    while(rs.next()){
     TabDlxx t = new TabDlxx();
     t.setDlxxId(rs.getInt("dlxxId"));
     t.setName(rs.getString("name"));
     t.setCertificateNum(rs.getString("certificateNum"));
     t.setEmail(rs.getString("email"));
     t.setMobilePhone(rs.getString("mobilePhone"));
     t.setCountry(rs.getString("country"));
     t.setMedia(rs.getString("media"));
     t.setArriveTime(rs.getString("arriveTime"));
     t.setArriveAirNo(rs.getString("arriveAirNo"));
     t.setLeaveTime(rs.getString("leaveTime"));
     t.setLeaveAirNo(rs.getString("leaveAirNo"));
     t.setAuditStatus(rs.getInt("auditStatus"));
     t.setCreateTime(rs.getTimestamp("createTime"));
     t.setLastModifyTime(rs.getTimestamp("lastModifyTime"));
     tdList.add(t);
    }
   }
  } catch (SQLException e) {
   e.printStackTrace();
  } finally {
   try {
    rs.close();
    ps.close();
    conn.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
  return tdList;
 }
//判断查询条件是否为空,不为空时增加查询条件
private void addStatement(TabDlxx tabDlxx, List<Object> list, StringBuffer sql){
  if(null != tabDlxx.getName() && !"".equals(tabDlxx.getName())){
   sql.append("and name like ?");
   list.add(tabDlxx.getName());
  }
  if(null != tabDlxx.getEmail() && !"".equals(tabDlxx.getEmail())){
   sql.append("and email =?");
   list.add(tabDlxx.getEmail());
  }
  if(null != tabDlxx.getStartTime() && !"".equals(tabDlxx.getStartTime())){
   sql.append("and createTime>= ?");
   list.add(tabDlxx.getStartTime());
  }
  if(null != tabDlxx.getEndTime() && !"".equals(tabDlxx.getEndTime())){
   sql.append("and createTime<= ?");
   list.add(tabDlxx.getEndTime());
  }
  if(null != tabDlxx.getAuditStatus()){
   sql.append(" and auditStatus=?");
   list.add(tabDlxx.getAuditStatus());
  }
 }
  //把条件作为参数传给PreparedStatement
 private void pstSetObject(PreparedStatement pstm,List<Object> list) throws SQLException{
        if(list != null){
            for(int i = 0; i < list.size(); i++){
                pstm.setObject(i+1, list.get(i));
            }
        }
    } 

JDBC 处理sql查询多个不确定参数的更多相关文章

  1. 经历:sybase的sql查询,当传递的参数中包含全角空格(\u00a0),查询慢

    今天,我遇到了一个sybase数据库查询的问题.一句简单的sql,但是不知道为什么查询不出来,导致生产生产服务器频频挂掉.吓得我的小心脏砰砰啊. select DISTINCT A.FCIL_CDE ...

  2. 大数据技术之_19_Spark学习_03_Spark SQL 应用解析 + Spark SQL 概述、解析 、数据源、实战 + 执行 Spark SQL 查询 + JDBC/ODBC 服务器

    第1章 Spark SQL 概述1.1 什么是 Spark SQL1.2 RDD vs DataFrames vs DataSet1.2.1 RDD1.2.2 DataFrame1.2.3 DataS ...

  3. 使用jdbc拼接条件查询语句时如何防止sql注入

    本人微信公众号,欢迎扫码关注! 使用jdbc拼接条件查询语句时如何防止sql注入 最近公司的项目在上线时需要进行安全扫描,但是有几个项目中含有部分老代码,操作数据库时使用的是jdbc,并且竟然好多都是 ...

  4. 使用 JDBC 和 JavaTemplate 查询SQL语句返回 List<Map<String,Object>>

    使用JDBC执行sql语句返回List 类型: public class JdbcUtil { private static Log log = LogFactory.getLog(JdbcUtil. ...

  5. JDBC连接SQL Server代码模板

    *                  JDBC连接SQL Server数据库 代码模板* Connection: 连接数据库并担任传送数据的任务:* Statement :  执行SQL语句:* Re ...

  6. MyBatis原理分析之四:一次SQL查询的源码分析

    上回我们讲到Mybatis加载相关的配置文件进行初始化,这回我们讲一下一次SQL查询怎么进行的. 准备工作 Mybatis完成一次SQL查询需要使用的代码如下: ) { ); ) { throw ne ...

  7. Hibernate SQL查询 addScalar()或addEntity()

    本文完全引用自: http://www.cnblogs.com/chenyixue/p/5601285.html Hibernate除了支持HQL查询外,还支持原生SQL查询.          对原 ...

  8. Atitit oodbms的查询,面向对象的sql查询jpa jpql hql

    Atitit oodbms的查询,面向对象的sql查询jpa jpql hql 1.1. 标准API历史1 1.2. JPA定义了独特的JPQL(Java Persistence Query Lang ...

  9. Hibernate原生SQL查询

    最近在做一个较为复杂的查询,hibernate基本的查询不能满足,只好使用其提供的原生sql查询.参考网上的一些资料,做一些总结. 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行 ...

随机推荐

  1. Mysql资料 用户权限详解

    目录 一.MySQL权限详解 设置MySQL用户资源限制 用户资源限制执行操作 二.MySQL权限级别介绍 MySQL权限级别 MySQL创建权限 MySQL删除与插入权限 MySQL修改与触发器权限 ...

  2. Nginx日志分析脚本

    目录 一.简介 二.脚本 一.简介 运维工作是一个比较复杂的工作,有时候面对上万条的日志,如何作分析?难道一条条的分析? 这估计看两眼就要打哈欠了吧?聪明的人会选择脚本,这就是为什么现在提倡自动化运维 ...

  3. iOS开发——密码存储之keychain的使用

    iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式.每个ios程序都有一个独立的keychain存储.从ios 3.0开始,跨程序分享keychain变得可行. 下 ...

  4. CSS选择器类型总结

    CSS选择器类型总结 1.通用选择器 一般用于给所有元素做一些通用性的样式设置,比如清除内边距.外边距等.但是效率比较低,尽量不要使用. * { margin: 0; padding: 0; } 2. ...

  5. CF1494A ABC String 题解

    Content 给定 \(T\) 个仅包含大写字母 A,B,C 的字符串 \(s\).问你是否能够通过将每个 A,B,C 换成 (,) 中的一个(同一个字母必须要换成同一个字符),使得最后得到的括号序 ...

  6. mysql 禁止自动提交设置

    mysql禁止自动提交的设置, 在my.ini文件里加上如下的一句便可 init_connect='SET autocommit=0' 但是有个问题,对root用户进行autocommit变量的查询, ...

  7. Miniconda入门教程

    Miniconda 教程 介绍 Anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项.因为包含了大量的科学包,Anaconda 的下载文件 ...

  8. 【LeetCode】236. Lowest Common Ancestor of a Binary Tree 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  9. git安装与使用,未完待续... ...

    ​ 目录 一.git概念 二.git简史 三.git的安装 四.git结构 五.代码托管中心-本地库和远程库的交互方式 六.初始化本地仓库 七.git常用命令 1.add和commit命令 2.sta ...

  10. @Transactional 注解实现

    @Transactional注解简介 @Transactional是spring中声明式事务管理的注解配置方式,相信这个注解的作用大家都很清楚.@Transactional注解可以帮助我们把事务开启. ...