写道
■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()); } }
相关推荐
首先,从创建时的区别开始,Statement 需要通过 Connection 对象的 createStatement() 方法创建,而 PreparedStatement 需要通过 Connection 对象的 prepareStatement() 方法创建,并且需要带有 SQL 语句。...
本资源主要涵盖了使用JDBC PrepareStatement进行MySQL数据库操作的各种场景,包括基本的查询、更新以及批量处理。 首先,我们来看一下JDBC连接MySQL的步骤。在Java程序中,我们需要导入相应的JDBC驱动,例如`...
**JDBC(用PrepareStatement实现)** Java Database Connectivity (JDBC) 是Java平台中的一个标准API,用于在Java应用程序和各种数据库之间建立桥梁。它允许Java开发者执行SQL语句,进行数据查询、更新和删除等操作。...
要创建一个 `PreparedStatement` 对象,首先需要通过 `Connection` 对象调用 `prepareStatement` 方法,并传入一个 SQL 语句字符串。例如: ```java // 假设 con 是已建立的 Connection 对象 String sql = "UPDATE ...
本主题聚焦于Java与Oracle数据库结合进行的简单模糊查询,这对于网页开发中使用JSP(JavaServer Pages)进行前端交互时的数据检索尤为关键。 首先,我们要理解模糊查询的基本概念。模糊查询是数据库查询的一种,它...
在Java中通过JDBC连接数据库并执行SQL查询时,可以使用`LIKE`关键字来进行模糊匹配。 ```java String sql = "SELECT * FROM table WHERE column LIKE ?"; PreparedStatement pstmt = connection.prepareStatement...
这是因为SQL使用单引号来定义字符串的开始和结束。当你需要在字符串内包含一个单引号时,直接嵌套单引号会导致语法错误。在标题和描述中提到的,直接嵌套单引号是不可行的,而且Java中的反斜杠转义方法在SQL中也不...
该问题的出现是由于 SQL 语句中使用单引号作为字符串的标志,而单引号在 SQL 对参数中的特殊字符较敏感所致。在本文中,我们将分析该问题的原因并提供两种解决方法。 问题的提出 在 Web 开发中,数据库交互是非常...
在性能优化方面,如果需要对大量数据进行模糊查询,可以考虑使用索引、分页查询以及数据库特有的优化技术,以提高查询效率。同时,合理使用`StringBuffer`能有效减少内存分配,提升程序性能。 总结来说,`...
PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setString(1, pattern); ResultSet rs = pstmt.executeQuery(); // 迭代并处理结果集 ``` 接下来,我们转向网页抓取。网页抓取,也称为网络...
模糊查询主要使用SQL的`LIKE`关键字配合通配符进行。常见的通配符有`%`(代表零个、一个或多个字符)和`_`(代表单个字符)。以下是一个示例,查询`users`表中名字包含"John"的用户: ```sql SELECT * FROM users ...
在J2ME中进行模糊查询时,还需要考虑性能优化,因为移动设备的处理能力和内存有限。这可能包括缓存结果、限制查询返回的记录数、优化SQL查询语句,甚至使用索引来加速匹配过程。同时,应确保处理好用户输入,防止SQL...
在Java编程中,进行多条件和模糊查询是数据库操作中常见的需求,特别是在处理用户输入时,用户可能希望根据多个不同的标准来筛选数据。这个场景通常涉及到SQL查询的编写,利用Java来执行这些查询,并将结果展示给...
PreparedStatement ps = connection.prepareStatement(sql); ps.setInt(1, 10); ``` 在这个例子中,我们想知道实际执行的SQL语句是"SELECT * FROM table WHERE id = 10"。为了实现这个需求,我们可以自定义一个辅助...
在这个实例中,我们将探讨如何实现基于jsp和servlet的Web应用,以及如何在MySQL数据库中进行模糊查询。 首先,我们来看`testdb.sql`,这是一个用于创建数据库表的SQL脚本。在MySQL中,通常我们会创建一个包含所需...
查询数据时,同样使用`PreparedStatement`。例如,我们要根据用户名查询用户信息: ```java public User getUserByUsername(String username) { User user = new User(); String sql = "SELECT * FROM users ...
在使用mybatis框架对Oracle数据库进行查询操作时,如果使用char类型字段作为查询条件,可能会出现结果返回null的问题。这种情况下,需要对char类型字段进行特殊处理,以确保查询结果的正确性。 首先,需要了解...
【数据库原理:为什么PrepareStatement性能更好更安全】 在数据库编程中,我们经常遇到两种执行SQL语句的方法:Statement和PreparedStatement。尽管Statement看起来更简洁,但在实际应用中,尤其是在使用ORM框架如...
PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setString(1, "%关键词%"); // 设置参数 ResultSet rs = pstmt.executeQuery(); while (rs.next()) { // 处理查询结果 } ``` 3. **使用...
在这个场景中,"自写php+MySQL模糊查询" 是一个新手尝试实现的功能,它允许用户输入关键词,然后在数据库中进行不精确匹配,返回与关键词相关的记录。这样的功能可以极大地提高用户在网站上的搜索体验。以下是对这个...