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中子类继承父类什么?

    1.继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包: 2.继承默认权限修饰符修饰的属性和方法,前提是子类和父类在同一个包.

  2. 智龙开发板搭建llsp环境

    智龙开发板搭建llsp(linux+lighttpd+sqlite3+php)环境 1. 准备 1. 智龙开发板V3 2. 软件编译环境:VirtualBox6+CentOS6.10-i386.min ...

  3. opencv学习(四)——轨迹栏作为调色板

    轨迹栏作为调色板 在这里,我们将创建一个简单的应用程序,以显示指定的颜色.有一个显示颜色的窗口,以及三个用于指定B.G.R颜色的轨迹栏.滑动轨迹栏,并相应地更改窗口颜色.默认情况下,初始颜色将设置为黑 ...

  4. python解释器安装指导教程

    python解释器安装指导教程 1.官网下载 进入官网https://www.python.org/,在download下选择符合操作系统的版本 在找到合适的版本后选择相应的安装文件下载 2.进行安装 ...

  5. [BUUCTF]REVERSE——rsa

    rsa 附件 题目是rsa,首先了解一下什么是rsa加密,具体的看这个文章 首先大概介绍下RSA加密解密 RSA加密是对明文的E次方后除以N后求余数的过程 公钥n = p * q,其中p和q是两个大素 ...

  6. 删除…Remove…(Power Query 之 M 语言)

    删除行(表): 删除指定行:=Table.RemoveRows( 表, 起始行数, 删除的行数) 起始行数从0开始计 删除前面N-.Skip/RemoveFirstN 删除后面N-.RemoveLas ...

  7. my.ini配置文件内容

    # For advice on how to change settings please see# http://dev.mysql.com/doc/refman/5.6/en/server-con ...

  8. WinFrm中多线程操作窗体属性

    首先声明一个委托. delegate void SetTextCallback(string text); 然后再写一个事件. private void SetInfo(string text) { ...

  9. IDEA通过git回滚到某个提交节点或某个版本

    1.项目右键后,点击"Git - Show History" 这里会显示有历史提交的版本记录(这里我们假设要回滚到 "提交" 版本中) 2.选中 "提 ...

  10. MimeTypes数值表

    我们常常需要再前端附件进行上传的时候,就设定只能选择固定的后缀的上传文件,这时就需要用到我们MimeTypes表 MimeTypes表 mimes = [("ez", " ...