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. [笔记] Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting

    原文地址:https://arxiv.org/abs/2012.07436 源码地址:https://github.com/zhouhaoyi/Informer2020

  2. Linux 文件属性及详细操作

    目录 Linux 文件属性 文件属性信息组成 文件属性概念说明 文件软硬链接说明 硬链接 软链接 补充知识 存储数据相关-inode/block inode: block: 读取文件原理图 Linux ...

  3. CF53C Little Frog 题解

    Content 有一只小青蛙想游历 \(n\) 块土堆,它现在在 \(1\) 号土堆上,每次可以跳跃任意距离到达另外的一个土堆.它想让每次跳跃的距离都不相等,试找到这样的一个方案. 数据范围:\(1\ ...

  4. win10中docker使用docker-compose启动报错:pywintypes.error: (2, 'CreateFile', '系统找不到指定的文件。')

    Traceback (most recent call last): File "docker\api\client.py", line 214, in _retrieve_ser ...

  5. springboot整合阿里云视频点播接口

    官方SDK文档地址: https://help.aliyun.com/document_detail/57756.html?spm=a2c4g.11186623.6.904.4e0d3bd9VbkIC ...

  6. 【LeetCode】722. Remove Comments 解题报告(Python)

    [LeetCode]722. Remove Comments 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/remove-c ...

  7. hdu 4503 湫湫系列故事——植树节(组合概率)

    这是一道求组合的题.中文题面应该能看懂,废话不多说下面来说说这道题. 可以选的总组合数是Ck3 那么选到3个人的关系都相同,要么都认识,要么都不认识.可以重反面来考虑,就是求三个人的关系不都相同. 那 ...

  8. .NET Core 实现动态代理做AOP(面向切面编程)

    1.介绍 1.1 动态代理作用 用动态代理可以做AOP(面向切面编程),进行无入侵式实现自己的扩展业务,调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,比如:日志记录.性能统计.安全控制.事务 ...

  9. CoGAN

    目录 概 主要内容 代码 Liu M., Tuzel O. Coupled Generative Adversarial Networks. NIPS, 2016. 概 用GAN和数据(从边缘分布中采 ...

  10. JavaScript交互式网页设计作业目录(作业笔记)

    JavaScript交互式网页设计笔记 • [目录] 我的大学笔记>>> 第1章 JavaScript基本语法>>> 1.1.4 使用 JavaScript 的 H ...