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. Django REST framework完全入门

    Django REST framework 一个强大灵活的Django工具包,提供了便捷的 REST API 开发框架 我们用传统的django也可以实现REST风格的api,但是顶不住Django ...

  2. Linux目录终章,单用户模式修改密码、环境变量、第三方软件安装

    目录 今日内容概要 内容详细 解析映射文件 磁盘挂载文件 开机加载脚本 系统启动级别 使用单用户模式修改密码 变量加载文件 登录提示信息 第三方软件安装目录(编译安装目录) 系统日志目录 保存系统运行 ...

  3. 显卡不是你学习 Deep Learning 的借口

    显卡不是你学习 Deep Learning 的借口 很多人在学习深度学习的时候会以自己没有 RTX N 卡的理由不动手实操,只满足于看看"娱乐"视频,听几节基础知识.当然,如果只是 ...

  4. 资源的批量删除与替换(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 资源分配好以后,嗯,很满意! 可是!有人看了不满意,或者自己手贱分配错了,要改? 改就改呗,和分配有什么区别吗? 没有啊! ...

  5. CF1433A Boring Apartments 题解

    Content 我们把仅由一个或多个相同的数位组成的数字叫作"无聊的数字".我们把 \(\leqslant 10000\) 的这种数字按照以下规则排列: 首先,将仅由 \(1\) ...

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

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

  7. JAVA加解密之DES

    DES加密算法是一种分组密码,以64位为分组对数据加密,它的密钥长度是56位,加密解密用同一算法.DES加密算法是对密钥进行保密,而公开算法,包括加密和解密算法.这样,只有掌握了和发送方相同密钥的人才 ...

  8. 基于 SoC 的卷积神经网络车牌识别系统设计(0)摘要

    ​NOTES:现如今,芯片行业无比火热啊,无论是前景还是钱景,国家芯片战略的发布,公司四五十万的年薪,着实令人非常的向往,为了支持芯片设计者,集成了工作.科研.竞赛于一体的<基于 SoC 的卷积 ...

  9. 【LeetCode】Island Perimeter 解题报告

    [LeetCode]Island Perimeter 解题报告 [LeetCode] https://leetcode.com/problems/island-perimeter/ Total Acc ...

  10. bugku的一道代码审计基础题:eval

    首先看到 include "flag.php",第一反应就应该是文件包含 直接先?hello=file:////etc, 然后啥也没 那就再检查一下代码,eval(var_dump ...