关于jdbc预编译下模糊查询的写法

PreparedStatement预编译的SQL可以有效的防止SQL注入,但是有些写法需要值得注意。

Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/ssm","root","root");
            StringBuffer sql =new StringBuffer("select ID,COMMAND,DESCRIPTION,CONTENT from message where 1=1") ;
            ArrayList<String> args = new ArrayList<String>();
            if(command!=null&&!"".equals(command)){
                sql.append(" and COMMAND=?");
                args.add(command);
            }
            if(description!=null&&!"".equals(description)){
                sql.append(" and DESCRIPTION like concat(‘%‘,?,‘%‘)");
                args.add(description);
            }
            PreparedStatement ps = conn.prepareStatement(sql.toString());
            for(int i=0;i<args.size();i++){
                ps.setString(i+1, args.get(i));
            }

            ResultSet rs = ps.executeQuery();

最关键的部分在

sql.append(" and DESCRIPTION like concat(‘%‘,?,‘%‘)");

使用concat可以有效地拼接字符串

原文地址:https://www.cnblogs.com/famousLion/p/9612987.html

时间: 2024-10-12 16:22:23

关于jdbc预编译下模糊查询的写法的相关文章

jdbc 预编译处理 和spring返回自增主键值

利用GeneratedKeyHolder获得新建数据主键值 Spring利用GeneratedKeyHolder,提供了一个可以返回新增记录对应主键值的方法 : int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder)//该方法返回受影响的行数,同时将新增记录对应主键值赋值给generatedKeyHolder参数 Spring为KeyHolder接口指代了一个通用的实现类GeneratedKeyHolder,该

jdbc中如何实现模糊查询

情况如何 再利用jdbc执行sql语句的时候,对于其他的句子的执行没什么太大的问题:加上占位符,然后设置占位符的值. 但是在模糊查询的时候,一直都写不对,这里提供了两种可选的解决办法,以供参考. 解决方法 第一种: String sql = "select studentname, age, phone, address, other from customer"                + " where studentname like ? "; pstm

JDBC预编译语句表名占位异常

有时候,我们有这样的需求,需要清空多个表的内容,这样我们有两种做法,可用delete from table 或 truncate table table,两种方法视情况而定,前者只是一条条的删除表数据,主键自增的序列还能保存,后者类似是重新建表保留表结构,主键信息,也被清空. OK,下面我们用JDBC开始删除,因为是多个表,所以要循环删除,根据以往的经验,使用预编译的sql语句,可能执行效率会更高,短短几行代码,搞定: public void clearTables()throws Except

JDBC预编译statement(preparedstatement)和statement的比较、execute与executeUpdate的区别

和 Statement一样,PreparedStatement也是用来执行sql语句的与创建Statement不同的是,需要根据sql语句创建PreparedStatement除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLExcep

JDBC 预编译语句对象

Statement的安全问题:Statement的执行其实是直接拼接SQL语句,看成一个整体,然后再一起执行的. String sql = "xxx"; // ? 预先对SQL语句进行语法的校验 PreparedStatement ps = conn.prepareStatement(sql); // ? 对应的索引从1开始 ps.setString(1, username); ps.setString(2, password); rs = ps.executeQuery(); 还可以

mybatis模糊查询不同写法

工作中用到,写三种用法吧,第四种为大小写匹配查询 1. sql中字符串拼接 SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT('%', #{text}), '%'); 2. 使用 ${...} 代替 #{...} SELECT * FROM tableName WHERE name LIKE '%${text}%'; 3. 程序中拼接 Java // String searchText = "%" + text + "

Oracle JDBC通过占位符可以查询可变长字段,不可查询固定长度字段

这个问题在半年前,花了我两天的时间才解决,现在刚好想起来,顺便记录一下以防忘了. 通过jdbc,预编译的sql,无法查询到固定长度的字段. 用例子说话: 创建一个表,只有一个字段,长度为固定的char类型.并插入一条数据. create table tblchar ( name char(20) ); 在Java代码中使用预编译的SQL查询,无法查询到结果.而使用拼接的SQL,可以正常查询. 1 public static void main(String[] args) { 2 try { 3

mybatis深入理解之 # 与 $ 区别以及 sql 预编译

mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = "ruhua"; 上述 sql 中,我们希望 name 后的参数 "ruhua" 是动态可变的,即不同的时刻根据不同的姓名来查询用户.在 sqlMap 的 xml 文件中使用如下的 sql 可以实现动态传递参数 name: select * from user whe

mybatis深入理解(一)之 # 与 $ 区别以及 sql 预编译

mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = "ruhua"; 上述 sql 中,我们希望 name 后的参数 "ruhua" 是动态可变的,即不同的时刻根据不同的姓名来查询用户.在 sqlMap 的 xml 文件中使用如下的 sql 可以实现动态传递参数 name: select * from user whe