`

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

    博客分类:
  • JDBC
 
阅读更多
写道
■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());
		
	}
}

 

分享到:
评论

相关推荐

    prepareStatement和Statement的区别

    首先,从创建时的区别开始,Statement 需要通过 Connection 对象的 createStatement() 方法创建,而 PreparedStatement 需要通过 Connection 对象的 prepareStatement() 方法创建,并且需要带有 SQL 语句。...

    JDBC PrepareStatement 使用(附各种场景 demo)

    本资源主要涵盖了使用JDBC PrepareStatement进行MySQL数据库操作的各种场景,包括基本的查询、更新以及批量处理。 首先,我们来看一下JDBC连接MySQL的步骤。在Java程序中,我们需要导入相应的JDBC驱动,例如`...

    JDBC(用PrepareStatement实现)

    **JDBC(用PrepareStatement实现)** Java Database Connectivity (JDBC) 是Java平台中的一个标准API,用于在Java应用程序和各种数据库之间建立桥梁。它允许Java开发者执行SQL语句,进行数据查询、更新和删除等操作。...

    java数据库连接PrepareStatement

    要创建一个 `PreparedStatement` 对象,首先需要通过 `Connection` 对象调用 `prepareStatement` 方法,并传入一个 SQL 语句字符串。例如: ```java // 假设 con 是已建立的 Connection 对象 String sql = "UPDATE ...

    简单模糊查询,是关于java和Oracle的一个模糊查询

    本主题聚焦于Java与Oracle数据库结合进行的简单模糊查询,这对于网页开发中使用JSP(JavaServer Pages)进行前端交互时的数据检索尤为关键。 首先,我们要理解模糊查询的基本概念。模糊查询是数据库查询的一种,它...

    java模糊查询方法

    在Java中通过JDBC连接数据库并执行SQL查询时,可以使用`LIKE`关键字来进行模糊匹配。 ```java String sql = "SELECT * FROM table WHERE column LIKE ?"; PreparedStatement pstmt = connection.prepareStatement...

    sql语句中单引号嵌套问题(一定要避免直接嵌套)

    这是因为SQL使用单引号来定义字符串的开始和结束。当你需要在字符串内包含一个单引号时,直接嵌套单引号会导致语法错误。在标题和描述中提到的,直接嵌套单引号是不可行的,而且Java中的反斜杠转义方法在SQL中也不...

    JSP向MYSQL插入单引号内容出错的解决方法.pdf

    该问题的出现是由于 SQL 语句中使用单引号作为字符串的标志,而单引号在 SQL 对参数中的特殊字符较敏感所致。在本文中,我们将分析该问题的原因并提供两种解决方法。 问题的提出 在 Web 开发中,数据库交互是非常...

    Stringbuffer JDBC 模糊查询

    在性能优化方面,如果需要对大量数据进行模糊查询,可以考虑使用索引、分页查询以及数据库特有的优化技术,以提高查询效率。同时,合理使用`StringBuffer`能有效减少内存分配,提升程序性能。 总结来说,`...

    java 模糊查询+网页抓取

    PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setString(1, pattern); ResultSet rs = pstmt.executeQuery(); // 迭代并处理结果集 ``` 接下来,我们转向网页抓取。网页抓取,也称为网络...

    批量删除模糊查询

    模糊查询主要使用SQL的`LIKE`关键字配合通配符进行。常见的通配符有`%`(代表零个、一个或多个字符)和`_`(代表单个字符)。以下是一个示例,查询`users`表中名字包含"John"的用户: ```sql SELECT * FROM users ...

    J2ME数据库操作模糊查询

    在J2ME中进行模糊查询时,还需要考虑性能优化,因为移动设备的处理能力和内存有限。这可能包括缓存结果、限制查询返回的记录数、优化SQL查询语句,甚至使用索引来加速匹配过程。同时,应确保处理好用户输入,防止SQL...

    利用JDBC的PrepareStatement打印真实SQL的方法详解

    PreparedStatement ps = connection.prepareStatement(sql); ps.setInt(1, 10); ``` 在这个例子中,我们想知道实际执行的SQL语句是"SELECT * FROM table WHERE id = 10"。为了实现这个需求,我们可以自定义一个辅助...

    JAVA,多条件,模糊查询,多个条件同时查询显示结果

    在Java编程中,进行多条件和模糊查询是数据库操作中常见的需求,特别是在处理用户输入时,用户可能希望根据多个不同的标准来筛选数据。这个场景通常涉及到SQL查询的编写,利用Java来执行这些查询,并将结果展示给...

    web分页加模糊查询实例

    在这个实例中,我们将探讨如何实现基于jsp和servlet的Web应用,以及如何在MySQL数据库中进行模糊查询。 首先,我们来看`testdb.sql`,这是一个用于创建数据库表的SQL脚本。在MySQL中,通常我们会创建一个包含所需...

    用传参数的方法实现Java对SQLite的添加和查询

    查询数据时,同样使用`PreparedStatement`。例如,我们要根据用户名查询用户信息: ```java public User getUserByUsername(String username) { User user = new User(); String sql = "SELECT * FROM users ...

    解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    在使用mybatis框架对Oracle数据库进行查询操作时,如果使用char类型字段作为查询条件,可能会出现结果返回null的问题。这种情况下,需要对char类型字段进行特殊处理,以确保查询结果的正确性。 首先,需要了解...

    06丨数据库原理:为什么PrepareStatement性能更好更安全?.pdf

    【数据库原理:为什么PrepareStatement性能更好更安全】 在数据库编程中,我们经常遇到两种执行SQL语句的方法:Statement和PreparedStatement。尽管Statement看起来更简洁,但在实际应用中,尤其是在使用ORM框架如...

    javaweb对商品名的模糊查询(附源码)

    PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setString(1, "%关键词%"); // 设置参数 ResultSet rs = pstmt.executeQuery(); while (rs.next()) { // 处理查询结果 } ``` 3. **使用...

    自写php+MySQL模糊查询

    在这个场景中,"自写php+MySQL模糊查询" 是一个新手尝试实现的功能,它允许用户输入关键词,然后在数据库中进行不精确匹配,返回与关键词相关的记录。这样的功能可以极大地提高用户在网站上的搜索体验。以下是对这个...

Global site tag (gtag.js) - Google Analytics