永发信息网

java数据库的PreparedStatement与Statement有什么区别(不要抄袭网上的内容)?

答案:3  悬赏:0  手机版
解决时间 2021-05-08 14:49
java数据库的PreparedStatement与Statement有什么区别(不要抄袭网上的内容)?
最佳答案
你应该问的是jdbc的PreparedStatement与Statement接口之间有什么差别吧,PreparedStatement接口其实是继承Statement接口的,也就是说Statement提供的功能PreparedStatement都能干,PreparedStatement主要增加的功能从字面上理解就是提高了一种预编译的sql语句功能,这种sql能在java上根据运行时的需要进行重用,但和数据库本身对sql的预编译完全是2回事情。
通俗来讲就是PreparedStatement能接受带 ?号的String作为sql语句,并且在执行之前你可以对那些sql语句中出现的 ?号根据具体需要进行赋值,所以PreparedStatement接口比Statement多提供了一堆setInt,setDate之类的方法,就是对?号进行替换时用的。
全部回答
http://www.19yxw.com/788387``````aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfsdffgfg

JAVA API:

Statement 对象表示基本语句,其中将单个方法应用于某一目标和一组参数,以返回结果,比如 "a.setFoo(b)"。注意,此示例使用名称来指示目标及其参数,statement 对象不需要名称空间,可以使用值本身构造。statement 对象将指定方法与其环境相关联,作为值的简单集合:目标和参数值数组。

表示预编译的 SQL 语句的对象。

SQL 语句被预编译并且存储在 PreparedStatement 对象中。然后可以使用此对象高效地多次执行该语句。

注:用来设置 IN 参数值的 setter 方法(setShort、setString 等等)必须指定与输入参数的已定义 SQL 类型兼容的类型。例如,如果 IN 参数具有 SQL 类型 INTEGER,那么应该使用 setInt 方法。

如果需要任意参数类型转换,使用 setObject 方法时应该将目标 SQL 类型作为其参数的类型。

在以下设置参数的示例中,con 表示一个活动连接: PreparedStatement pstmt = con.prepareStatement("UPDATe EMPLOYEES SET SALARY = ? WHERe ID = ?"); pstmt.setBigDecimal(1, 153833.00) pstmt.setInt(2, 110592)

 

在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement 一.代码的可读性和可维护性. 虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次: stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')"); perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)"); perstmt.setString(1,var1); perstmt.setString(2,var2); perstmt.setString(3,var3); perstmt.setString(4,var4); perstmt.executeUpdate(); 不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心. 二.PreparedStatement尽最大可能提高性能. 每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行.而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.比如: insert into tb_name (col1,col2) values ('11','22'); insert into tb_name (col1,col2) values ('11','23'); 即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次. 当然并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句. 三.最重要的一点是极大地提高了安全性. 即使到目前为止,仍有一些人连基本的恶义SQL语法都不知道. String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'"; 如果我们把[' or '1' = '1]作为varpasswd传入进来.用户名随意,看看会成为什么? select * from tb_name = '随意' and passwd = '' or '1' = '1'; 因为'1'='1'肯定成立,所以可以任何通过验证.更有甚者: 把[';drop table tb_name;]作为varpasswd传入进来,则: select * from tb_name = '随意' and passwd = '';drop table tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行. 而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.(前提是数据库本身支持预编译,但上前可能没有什么服务端数据库不支持编译了,只有少数的桌面数据库,就是直接文件访问的那些)只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑.

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
飞机上可以带药品么?
人的思想是天生下来就不同的么?
QQ华夏元魂完美胆小归元一下会不会不完美咯
银对身体有害吗,柠檬酸对人体有什么不好吗?
豆痕怎么彻底去掉
求200字左右的发言稿,关于 未来,命运什么的
恒友民宿这个地址在什么地方,我要处理点事
有什么恐怖的电影啊??
为什么福建基督教的宗派感较上海更深?
肌肉被重物压伤了,么办?
家里花盆中的土都好几年了,板结了?怎么处理好
DNF英文全称叫什么?
开拍拍店铺非得用工商银行的卡吗?大体的注册
给个战地激活码把
2012年会有太阳风暴吗?
推荐资讯
蓝山县永州能匠专业皮具护理(蓝山县边贸中路
河北省邯郸市这几天有地震吗
南京家政保洁员工资一般多少?
面临要分手 的感情要如何面对???
新乐市石家庄韵达(新乐服务站)地址有谁知道?
你真的给我发了吗。。?
做一个识趣的人,不要老去为难别人!也不要让自
成功中年男性,穿什么品牌衣服合适?既得体,
北王离北京多远?
想念一个人怎么办呢?找又不方便
用系统命名法命名以下化合物
白居易表示春天的诗句,求能使人静心的诗句!
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?