使用prepareStatement进行模糊查询时的单引号问题
2015-06-29 16:25
176 查看
写道
■Statement#executeQueryを使う場合
⇒ SQLに埋め込むので、シングルクォートのエスケープが必須
入力=[']
変換=[%''%]
■Connection#prepareStatement を使う場合
■JdbcTemplate#queryForList を使う場合
⇒ 基本的にSQLインジェクション対策がされているので、
シングルクォートのエスケープをしてはいけない
入力=[']
変換=[%'%]
⇒ SQLに埋め込むので、シングルクォートのエスケープが必須
入力=[']
変換=[%''%]
■Connection#prepareStatement を使う場合
■JdbcTemplate#queryForList を使う場合
⇒ 基本的にSQLインジェクション対策がされているので、
シングルクォートのエスケープをしてはいけない
入力=[']
変換=[%'%]
■如果使用executeQuery进行查询
需要在SQL文中对单引号进行转义
■如果使用Connection#prepareStatement或JdbcTemplate#queryForList进行查询的话
基本的SQL注入处理中已包含转义处理,所以不需要在程序中对单引号进行转义。
代码实例
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.List; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource; import org.springframework.jdbc.core.JdbcTemplate; public class SQLServerTest { public static void main(String[] srg) throws SQLException { BasicDataSource ds = null; try { ds = new BasicDataSource(); ds.setDriverClassName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); ds.setUrl("jdbc:sqlserver://localhost:1433;databaseName=LOCAL;"); ds.setUsername("user"); ds.setPassword("password"); System.out.println("normalQuery start*******************"); normalQuery(ds); System.out.println("normalQuery end*********************"); System.out.println("templateQuery start*******************"); templateQuery(ds); System.out.println("templateQuery end*******************"); System.out.println("prepareQuery start*******************"); prepareQuery(ds); System.out.println("prepareQuery end*******************"); } catch (Exception e) { e.printStackTrace(); }finally{ if(ds != null){ ds.close(); } } } public static void normalQuery(BasicDataSource ds) throws SQLException{ Connection conn = ds.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM CLIENT C WITH (NOLOCK) WHERE C.CLIENT_NAME LIKE ('%''%')"); int length = 0; while (rs.next()) { System.out.println(rs.getLong(1) + "\t" + rs.getString(2)+ "\t" + rs.getString(3)+ "\t" + rs.getLong(4)); length++; } System.out.println("result size = " + length); } public static void prepareQuery(BasicDataSource ds) throws SQLException{ Connection conn = ds.getConnection(); PreparedStatement perstmt = conn.prepareStatement("SELECT * FROM CLIENT C WITH (NOLOCK) WHERE C.CLIENT_NAME LIKE (?)"); perstmt.setString(1,"%'%"); ResultSet rs = perstmt.executeQuery(); int length = 0; while (rs.next()) { System.out.println(rs.getLong(1) + "\t" + rs.getString(2)+ "\t" + rs.getString(3)+ "\t" + rs.getLong(4)); length++; } System.out.println("result size = " + length); } public static void templateQuery(BasicDataSource ds) throws NamingException, SQLException{ JdbcTemplate jdbcTemplate = new JdbcTemplate(ds); List result = jdbcTemplate.queryForList("SELECT * FROM CLIENT C WITH (NOLOCK) WHERE C.CLIENT_NAME LIKE (?)", new Object[] {"%'%"}); System.out.println("result size = " + result.size()); } }
相关文章推荐
- Web开发——问题:PreparedStatement如何使用like进行模糊查询
- 使用PreparedStatement进行模糊查询的%问题
- php PDO使用bindValue进行模糊查询问题
- SQL Server使用Merge语句当源表数据集为空时,无法进行查询的问题
- myBatis 操作 mysql时,使用 like 关键进行模糊查询的方法
- 使用 PreparedStatement 进行模糊查询
- 关于对日期类型的数据进行模糊查询的问题
- 使用占位符进行模糊查询
- 使用 PreparedStatement 进行模糊查询
- 当使用hql进行投影查询时对于外键为空的记录查询不出来的问题
- 使用XPath对Xml进行模糊查询
- Hibernate使用sql进行查询的问题
- 使用Xpath对XML进行模糊查询
- 使用 PreparedStatement 进行模糊查询
- 使用 PreparedStatement 进行模糊查询
- 使用 PreparedStatement 进行模糊查询
- 使用Xpath对XML进行模糊查询
- 使用Xpath 对XML 进行模糊查询
- 使用query()方法进行模糊查询
- Hibernate使用sql进行查询的问题