写道
■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()); } }
相关推荐
prepareStatement和Statement的区别
java数据库连接PrepareStatement
用JDBC实现Java与数据库的连接,该文件使用PrepareStatement实现。
PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程,下面这篇文章主要给大家介绍了关于利用JDBC的PrepareStatement打印真实SQL的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
数据库原理:为什么PrepareStatement性能更好更安全
该资源中包含 JDBC 连接 MySQL 完整代码、常规 select、update 语句完整代码,以及 JDBC 批量处理数据的几种不同方式完整代码,且附带 使用说明!
In Oracle Metalink (Oracle's support site - Note ID 736273.1) I found that this is a bug in JDBC adapter (version 10.2.0.0.0 to 11.1.0.7.0) that when you call preparedStatement with more than 7 ...
MySQL prepare语法: PREPARE statement_name FROM preparable_SQL_statement; /*定义*/ EXECUTE statement_name [USING @var_name [, @var_name] …]; /*执行预处理语句*/ {DEALLOCATE | DROP} PREPARE statement_...
Do you know how to prepare a cashflow statement?
3 也可以直接使用preparestatement进行查询,返回我们想要的数据。 初步版本已经实现,数据库兼容性暂时没时间考虑。目前我们使用的是ORACLE数据库。做了一点兼容mysql和sqlserver ,没时间做进一步的研究。 发布...
MySQL官方将prepare、execute、deallocate统称为PREPARE STATEMENT,我习惯称其为【预处理语句】,其用法十分简单,下面话不多说,来一起看看详细的介绍吧。 示例代码 PREPARE stmt_name FROM preparable_stmt ...
cash flow statement,主要是会计的现金流报表的准备
一次只从数据库中查询最大maxCount条记录 ... PreparedStatement pstat = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); //最大查询到第几条记录.........
JAVA连接FileMaker完整工程 包函FileMaker数据库Java连接驱动 修改工程中的FileMaker安装地址就 可以用JAVA操作FileMaker ... prepareStatement = con.prepareStatement(insertSQL); b = prepareStatement.execute();
java.sql.PreparedStatement psta=null; //连接jdbc驱动,获取连接对象(connection) try { //先写好sql语句 ... psta= connection.prepareStatement(sqlstr); psta.setString(1, username);
PreparedStatement ps=con.prepareStatement(sqlStr); //获取PreparedStatement对象 ResultSet rs=ps.executeQuery(); //执行查询 String name,sex,email; //查询结果 int age; int count=0; ...
这次是做一个不使用框架,用最原始的方法实现了java-jsp的web应用,栗子呢包含增删改查、登陆登出、分页、事务处理和权限管理这几个web应用的基本要素,界面就做得很烂了,除了对齐以外就没用到CSS了,也是节约时间...
android 多渠道打包,把渠道文件放入channel.txt 就行
// 设置成可以获取主键 preparedStatement = connection.prepareStatement(sql, Statement.RE
NULL 博文链接:https://beijingwo2008.iteye.com/blog/1851542