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. java中二维数组初始化的几种方法

    /* 第一种方式 */ int tdarr1[][] = { { 1, 3, 5 }, { 5, 9, 10 } }; /* 第二种方式 */ int tdarr2[][] = new int[][] ...

  2. antd动态的表格合并(包含排序功能)

    主要是两个步骤, 1.处理接口返回数据,给其添加两个属性,一个是合并行数(列数),一个是当前数据的序号 2.在columns结合antd官网的处理方法合并表格 3.尽可能得减少计算量 数据处理函数 / ...

  3. IO中同步异步,阻塞与非阻塞 -- 通俗篇

    一.同步与异步 同步/异步, 它们是消息的通知机制 1. 概念解释 A. 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例 ...

  4. CF675A Infinite Sequence 题解

    Content 给定三个整数 \(a,b,c\),问你 \(b\) 是否在以 \(a\) 为首项,公差为 \(c\) 的等差数列中. 数据范围:\(-10^9\leqslant a,b,c\leqsl ...

  5. js 让小数四舍五入保留两位小数的函数是?

    js 让小数四舍五入保留两位小数的函数是? 例子:data.relations[i].data[j].toFixed(2) toFixed(2)这个函数就是保留两位小数的作用

  6. ligerui的jquery.validate验证需要添加validate="{required:true,minlength:8,equalTo:'#newpassword'}"

    ligerui的jquery.validate验证需要添加validate="{required:true,minlength:8,equalTo:'#newpassword'}"

  7. c++设计模式概述之命令

    代码写的不够规范,目的是为了缩短文章篇幅,实际中请不要这样做.  1.概述 命令模式是一种数据驱动的模式.将请求封装到命令的对象中,再传给调用对象,调用对象再处理该命令. [将一个请求封装为一个对象] ...

  8. 一个自定义的c++错误类 和 同步异步、阻塞非阻塞(区别简述)

    一个例子,自定义exception 继承std::exception 1 class _oct_udp_api_export_ udp_err : public std::exception 2 { ...

  9. 【LeetCode】Integer to English Words 解题报告

    Integer to English Words [LeetCode] https://leetcode.com/problems/integer-to-english-words/ Total Ac ...

  10. 【LeetCode】359. Logger Rate Limiter 解题报告(C++)

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