使用prepareStatement进行模糊查询时的单引号问题

写道
■Statement#executeQueryを使う場合

  ⇒ 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());
		
	}
}

 

你可能感兴趣的:(statement)