做笔试题遇到总结Statement和PreparedStatement

1、PreparedStatement接口继承Statement,PreparedStatement实例包含已编译的SQL语句,所以其执行速度快于Statement对象。
2、PreparedStatement是Statement的子类,同样继承Statement所有功能。
三种方法:execute、executeQuery、executeUpdate在PreparedStatement中已经被更改,使之不在需要参数。
3、不用Statement的原因:

1)代码的可读性和可维护性:

    如下代码:
    stat.executeUpdate("insert into tb_name(col1,col2,col3,col4)
    values('"+var1+"','"+var2+"','"+var3+"','"+var4+"')")//stat是Statement的实例化对象

    prepastat.executeUpdate("insert into tb_name (col1,col2,col3,col4)
    values (?,?,?,?)")

    prepastat.setString(1,value1));
    prepastat.setString(2,value2));
    prepastat.setString(3,value3));
    prepastat.setString(4,value4));//prepastat是PreparedStatement的对象实例
    对比得第二个完胜

2)PreparedStatement尽可能提高性能
对于整个DB来说,语句再被编译后执行代码会被缓存,则下次只要是预编译语句与缓存相匹配,就可以不需要编译,
从缓存直接调用,将参数直接传入执行代码中直接执行,而Statement语句基本不可能相同,所以基本每次都要再编译。

例如:
    insert into tb_name (col1,col2)values(18,22);
    insert into tb_name (col1,col2)values(18,25);
    这两个语句相同操作,但是仅因为数据不同,所以整个语句不匹配,会在编译后缓存。
    //并不是所有的预编译语句都会被缓存,数据库会根据一些策略比如频率等来判断是否缓存。

3)极大地提高安全性能
防注入:

例如:String sql = "select * from tb_name where user_name ='"+user_name
+"'and password = '"+password+"'"
如果将"'or '1'= '1'"当做参数传进去就会出现密码验证永远正确。

注:
1.executeQuery:返回ResultSet结果集
2.executeUpdate:执行任意SQL语句,可以为insert,update或delete,可以不返回任何语句
3.excute:可以执行任何SQL语句返回一个Boolean类型,表示是否返回了ResultSet。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值