PreparedStatement比Statement有什么优势?
发布网友
发布时间:2022-04-10 09:52
我来回答
共3个回答
懂视网
时间:2022-04-10 14:13
答:与Statement相比,①PreparedStatement接口代表预编译的语句,它主要的优势在于可以减少SQL的编译错误并增加SQL的安全性(减少SQL注射攻击的可能性);②PreparedStatement中的SQL语句是可以带参数的,避免了用字符串连接拼接SQL语句的麻烦和不安全;③当批量处理SQL或频繁执行相同的查询时,PreparedStatement有明显的性能上的优势,由于数据库可以将编译优化后的SQL语句缓存起来,下次执行相同结构的语句时就会很快(不用再次编译和生成执行计划)。
SQL注入问题
假设有登录案例SQL语句如下:
SELECT * FROM 用户表 WHERE NAME = 用户输入的用户名 AND PASSWORD = 用户输的密码;
此时,当用户输入正确的账号与密码后,查询到了信息则让用户登录。但是当用户输入的账号为XXX 密码为:XXX’ OR ‘a’=’a时,则真正执行的代码变为:
SELECT * FROM 用户表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’ OR ’a’=’a’;
此时,上述查询语句时永远可以查询出结果的。那么用户就直接登录成功了,显然我们不希望看到这样的结果,这便是SQL注入问题。
为此,我们使用PreparedStatement来解决对应的问题。
API详解:预处理对象
使用PreparedStatement预处理对象时,建议每条sql语句所有的实际参数,都使用逗号分隔。
String sql = "insert into sort(sid,sname) values(?,?)";;
PreparedStatement预处理对象代码:
PreparedStatement psmt = conn.prepareStatement(sql)
常用方法:
- 执行SQL语句:
l int executeUpdate(); --执行insert update delete语句.
l ResultSet executeQuery(); --执行select语句.
l boolean execute(); --执行select返回true 执行其他的语句返回false.
- 设置实际参数
l void setXxx(int index, Xxx xx) 将指定参数设置为给定Java的xx
值。在将此值发送到数据库时,驱动程序将它转换成一个 SQL Xxx
类型
值。
例如:
setString(2, "家用电器") 把SQL语句中第2个位置的占位符? 替换成实际参数 "家用电器"
【Statement和PreparedStatement有什么区别?哪个性能更好?预编译语句,防止sql注入问题】
标签:接口 结果 计划 dstat exe bool 密码 false 字符串
热心网友
时间:2022-04-10 11:21
一、PreparedStatement相比于Statement,有三个优点:
一)代码的可读性和可维护性。
从代码来看,用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说,都比直接用Statement的代码高很多档次。
二)PreparedStatement尽最大可能提高性能。
每一种数据库都会尽最大努力对预编译语句提供最大的性能优化,因为预编译语句有可能被重复调用,所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个函数)就会得到执行。这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配,那么在任何时候就可以不需要再次编译而可以直接执行。而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配。比如:
insert into tb_name (col1,col2) values ('11','22');
insert into tb_name (col1,col2) values ('11','23');
即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义,事实是没有数据库会对普通语句编译后的执行代码缓存。
当然并不是所有预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果,以保存有更多的空间存储新的预编译语句。
用Statement对象时,每次执行一个SQL命令,都会对它进行解析编译,而PreparedStatement对象在多次执行同一个SQl语句时都只解析编译一次。PreparedStatement对象“就像一条生产线,批量生产同一型号的产品速度非常快。”这样便可极大地减少资源开销。
三)极大地提高了安全性。
传递给PreparedStatement对象的参数可以被强制进行类型转换,使开发人员可以确保在插入或查询数据时与底层的数据库格式匹配。
在公共Web站点环境下,有恶意的用户会利用那些设计不完善的、不能正确处理字符串的应用程序来个SQl注入,那就有麻烦。
二、例子:
两者的代码:
1)Statement代码
Statement stmt = con.createStatement();
String sql = "INSERT INTO dept VALUES (12, 'GAME', 'BeiJing')";
stmt.executeUpdate(sql);
2)PreparedStatement代码
String sql = "INSERT INTO dept VALUES ( ?, ?, ? )";
PreparedStatement pre = con.prepareStatement(sql);
pre.setInt(1, deptno); //部门编号
pre.setString(2,dname); //部门名称
pre.setString(3,location); //部门地址
pre.executeUpdate();
热心网友
时间:2022-04-10 12:39
PreparedStatements是预编译的,因此,性能会更好。同时,不同的查询参数值,PreparedStatement可以重用。
PreparedStatement比Statement有什么优势?
一、PreparedStatement相比于Statement,有三个优点:一)代码的可读性和可维护性。从代码来看,用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说,都比直接用Statement的代码高很多档次。二)PreparedStatement尽最大可能提高性能。每一种数据库都会尽最大努力对...
星震同源怎么样
官方服务热线:400-700-9519。公司专注于与档案类数据、资产类数据、法规遵从类数据的采集、管理、利用、存储相关的软硬件研发、制造和系统集成;提供专业的数据生产、清洗、治理、存储、挖掘和利用服务。具备覆盖重要数据(档案类/资产类/法规...
PreparedStatement比Statement有什么优势?
【答案】:PreparedStatements是预编译的,因此,性能会更好。同时,不同的查询参数值,PreparedStatement可以重用。
JDBC中的PreparedStatement相比Statement的好处有哪些
2、有预编译功能,相同操作批量数据效率较高
JDBC中的PreparedStatement相比Statement的好处有哪些?
PreparedStatement是在执行前先输入sql语句,Statement正好相反,是在执行的时候传入sql语句的。这样的区别在于,PreparedStatement可以在传入sql后,执行语句前,给参数赋值,避免了因普通的拼接sql字符串语句所带来的安全问题,而且准备sql和执行sql是在两个语句里面完成的,也提高了语句执行的效率。Statement,就...
JDBC中Statement和PrepareStatement的区别及特性
使用preparedstatement的另一个优点是字符串不是动态创建的。下面是一个动态创建字符串的例子:stringsql = "select * from people p where p.i = "+id;preparedstatement也提供数据库无关性。当显示声明的sql越少,那么潜在的sql语句的数据库依赖性就越小。由于preparedstatement具备很多优点,开发者可能...
statement和preparedStatement的优缺点各是什么?
PreparedStatement可重复使用,提高效率;另外还可防止注入攻击,例如用户登录的时候查询SQL拼装语句为: String sql = "select * from tb_user where name = + username + and passwd = + password + "; 假如程序中没有进行必要的输statement和preparedStatement的优缺点各是什么?
JDBC中的Statement和PreparedStatement的区别
1.PreparedStatement是预编译的,对于批量处理可以大大提高效率.也叫JDBC存储过程 2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement对象的开销比Statement大,对于一次性操作并不会带来额外的好处。3.statement每次执行sql语句,相关数据库都要执行sql语句的...
preparedstatment 和statement的区别
PreparedStatement是预编译的,使用PreparedStatement有几个好处:a. 在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。b. 安全性好,有效防止Sql注入等问题。c. 对于多次重复执行的语句,使用PreparedStament效率会更高一点,并且在...
JDBC为什么要使用PreparedStatement而不是Statement
使用PreparedStatement有什么样的优势?PreparedStatement又是如何避免SQL注入攻击的?二、PreparedStatement是什么?PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(sql)方法可以获得PreparedStatment对象。数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的...
statement和preparedsteament的区别
一、代码的可读性和可维护性。虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说,都比直接用Statement的代码高很多档次:stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+...