- java数组入门教程
- java数组的遍历
- 基于debian(ubuntu)的JDK安装与卸载-vps环境搭建实录(一)
- java环境变量配置(windows7系统)
- java开发环境配置
- 第一个java程序 helloword
- 使用eclipse快速开发java程序
- Java基础语法
- Java对象和类
- Java基本数据类型
- Java变量类型
- Java修饰符
- Java运算符
- Java循环结构 – for, while 及 do…while
- Java分支结构 – if…else/switch
- Java Number类
- Java Character类
- Java String类
- Java日期时间
- java异常处理分类
- java Exception异常处理实例
- java.util.UUID 工具类详解
- java数字格式化类DecimalFormat详解
- JDBC系列教程之一:jdbc简单介绍
- JDBC系列教程之二:jdbc连接数据的步骤
- JDBC系列教程之三:JDBC基本的CRUD(创建、读取、更新、删除)
- JDBC系列教程之四:SQL注入PreparedStatement和Statement
- JDBC系列教程之五:数据类型
- JDBC系列教程之六:一个简单用户相关的数据访问层
- JDBC系列教程之七:用配置文件(properties)和反射实现与具体类的耦合
- JDBC系列教程之八:事务-ACID
- JDBC系列教程之九:事务-SavePoint与JTA
- JDBC系列教程之十:隔离级别
- JDBC系列教程之十一:其他的几个API
- JDBC系列教程之十二:DatabaseMetaData(数据库的元数据信息)和ParameterMetaData(参数的元数据信息)
- JDBC系列教程之十三:ResultSetMetaData
- JDBC系列教程之十四:用反射ResultSetMetaData将查询结果读入对象中
- JDBC系列教程之十五:数据源和连接池
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
知识点
相关文章
更多最近更新
更多JDBC系列教程之四:SQL注入PreparedStatement和Statement
2019-03-28 00:37|来源: 领悟书生
SQL注入,PreparedStatement和Statement
l 在SQL中包含特殊字符或SQL的关键字(如:' or 1 or ')时Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用PreparedStatement来解决。
l PreperedStatement(从Statement扩展而来)相对Statement的优点:
1.没有SQL注入的问题。
2.Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。
3.数据库和驱动可以对PreperedStatement进行优化(只有在相关联的数据库连接没有关闭的情况下有效)。
static void read(String name) throws SQLException { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { // 2.建立连接 conn = JdbcUtils.getConnection(); // 3.创建语句 String sql = "select id, name, money, birthday from user where name=?"; //预处理 ps = conn.prepareStatement(sql); ps.setString(1, name); // 4.执行语句 rs = ps.executeQuery(); // 5.处理结果 while (rs.next()) { System.out.println(rs.getInt("id") + "\t" + rs.getString("name") + "\t" + rs.getDate("birthday") + "\t" + rs.getFloat("money")); } } finally { JdbcUtils.free(rs, ps, conn); } } |
本文链接:SQL注入PreparedStatement和Statement,转自请注明:http://www.656463.com/article/798
相关问答
更多-
preparedStatement是否避免SQL注入?(Does the preparedStatement avoid SQL injection? [duplicate])[2022-03-02]
使用字符串连接来从任意输入构建查询不会使PreparedStatement安全。 看看这个例子: preparedStatement = "SELECT * FROM users WHERE name = '" + userName + "';"; 如果有人提出 ' or '1'='1 作为userName ,你的PreparedStatement容易受到SQL注入攻击,因为该查询将在数据库中执行 SELECT * FROM users WHERE name = '' OR '1'='1'; 所以,如 ... -
PreparedStatement如何避免或阻止SQL注入?(How does a PreparedStatement avoid or prevent SQL injection?)[2022-04-30]
SQL注入的问题是用户输入被用作SQL语句的一部分。 通过使用准备的语句,您可以强制将用户输入作为参数的内容(而不是SQL命令的一部分)进行处理。 但是,如果不使用用户输入作为准备语句的参数,而是通过将字符串连接在一起构建您的SQL命令,即使使用预准备语句, 仍然易于进行SQL注入 。 The problem with SQL injection is, that a user input is used as part of the SQL statement. By using prepared sta ... -
PreparedStatement批处理和Statement批处理之间的区别(Difference between PreparedStatement batch and Statement batch)[2024-05-14]
批处理执行Statement和PreparedStatement的区别在于Statement批可以包含不同的语句(只要它们是不产生结果集的语句),例如单个批次可以将各种插入包含到各种表中,删除,更新和 - 并非在所有的JDBC驱动程序实现AFAIK - 甚至DDL语句。 另一方面, PreparedStatement批处理执行涉及单个语句,批处理包含要为该语句执行的多组参数值。 也就是说,每个批次条目定义了用于准备语句参数的值。 简而言之: Statement :批处理可以包含很多不同的声明 Prepare ... -
浏览了log4jdbc的源代码后,我可以推断所有日志记录都是由slf4j执行的,并委托给应用程序使用的实际记录器实现。 我不确定你的环境中实际使用了什么记录器。 这取决于您的应用程序服务器(我在您的评论中推断这一点)。 通常,应用程序服务器将使用log4j或java.util.logging。 您需要配置其中一个记录器以确保仅启用jdbc.sqlonly记录器; 必须禁用log4jdbc页面上提到的其他记录器,或将其日志记录级别设置为较高值。 如果正在使用log4j,则以下代码段(来自log4jdbc站点上 ...
-
使用PreparedStatement(JDBC)时如何打印使用过的SQL查询(How to print used SQL query when using PreparedStatement (JDBC))[2023-02-22]
它不能用java.sql.PreparedStatement接口本身完成; 它取决于您的数据库供应商的实现。 但你很幸运; MySQL驱动程序允许您使用其toString实现来执行此操作: http://www.avajava.com/tutorials/lessons/how-do-i-display-a-prepared-statement-with-bind-variables-using-mysql.html 您需要注意,使用此特定于供应商的功能会将您的代码绑定到MySQL。 您无法在不更改代码的情 ... -
使用PreparedStatement的第二种方法要好得多,因为它可以使用预先准备好的语句池来提高性能。 准备语句通过缓存重用 在使用Statement的第一部分中,您的语句与单个数据相关联,必须每次为不同的数据创建一个新语句。 在Prepared Statement的情况下,可以使用不同的数据多次执行相同的语句。 编辑: 能否详细说明一下“缓存重用”? PreparedStatement的缓存是一种透明机制 ,其中Connection维护一个预准备语句池,当您请求具有相同SQL查询的预准备语句时,将返回缓 ...
-
你应该使用executeUpdate 。 “执行给定的SQL语句,该语句可以是INSERT,UPDATE或DELETE语句,也可以是不返回任何内容的SQL语句,例如SQL DDL语句。” You should use executeUpdate. "Executes the given SQL statement, which may be an INSERT, UPDATE, or DELETE statement or an SQL statement that returns nothing, suc ...
-
对于两(2)个不同的SQL查询,您将需要两(2)个不同的PreparedStatement对象,每个对象都有自己的批处理,但是当您想要将查询发送到服务器时,您只需执行每个批处理: try ( PreparedStatement thisPs = conn.prepareStatement("INSERT INTO thisTable (thisId, thisText) VALUES (?,?)"); PreparedStatement thatPs = conn.prepa ...
-
不同的驱动程序使用不同的 在您的情况下,您尝试访问的sql字段不是该驱动程序的可用字段之一。 要获取JDBC驱动程序的所有名称,请使用以下代码: Class stmt1 = prepStmt.getClass(); try { java.lang.reflect.Field mem[] = stmt1.getDeclaredFields(); for (Field x:mem){ System.out.println("Field:"+x.getName()); ...
-
java.sql.PreparedStatement旨在可重用。 设置新参数时,将覆盖之前的参数,但不会创建新的Statement。 您还可以决定使用clearParameters()自行清除所有参数 java.sql.PreparedStatement is designed to be reusable. When you set new parameters, you will overwrite the previous ones but you will not create a new Stat ...