注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

昆明帆妈的博客

生活的点点滴滴,被我这样记录着。。。。

 
 
 

日志

 
 

oracle事务处理PreparedStatement  

2012-11-23 15:54:59|  分类: 工作 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

   原来的我一直在用 Statement 来执行对数据库的查询、插入等操作,现在才发现,原来有N多不好之处,要用来执行查询操作executeQuery,不引入事务操作。

一.代码的可读性和可维护性差

stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");

不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心

二、没有预编译语句,降低了DB性能

三、安生性不高

利用事务处理 PreparedStatement好处oracle事务处理PreparedStatement - 402021476 - 402021476的博客oracle事务处理PreparedStatement - 402021476 - 402021476的博客oracle事务处理PreparedStatement - 402021476 - 402021476的博客

         每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.所以语句在被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,;等做费尽心机的判断和过虑.

上面的几个原因,还不足让你在任何时候都使用PreparedStatement吗

PrepareStatement用法示例:
ps = con.prepareStatement ("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
ps.setString(1,Form.id);
ps.setString(2,var2);
ps.setString(3,var3);
ps.setString(4,var4);
ps.executeUpdate();


conn=DBConnction.getConnection();
    String sql="select * from loginuser where userid=?";
    PrepareStatement pst=conn.prepareStatement(sql);
   pst.setInt(1,userId);
   Resultset rs=pst.executeQuery();
   while(rs.next())
   {
      user.setUserId(rs.getInt("userid"));
      user.setUserName(rs.getString("username"));
      user.setUserPass(rs.getString("userpass"));
   }
    rs.close();
    pst.close();
    }catch(ClassNotFoundException e){e.printStackTrace();}
    catch(SQLException e){e.printStackTrace();}
    finally{DBConnection.closeConnection(conn);}
日期=======================

1.利用oracle中的方法to_date();

String   DateStr   =   "1985-07-11   10:30:00.0 ";


pstmt   =   conn.prepareStatement( "INSERT   INTO   t(d)   VALUES(to_date(?, 'YYYY-MM-DD   HH24:MI:SS ') ");


pstmt.setString(1,   DateStr  )

 

2.java.sql.Date 不同于java.util.Date,前者是子类。pstmt.setDate方法参数类型是sql.Date。

因此需要转换

day = new SimpleDateFormat().parse(DateStr,"yyyy-MM-DD  HH:mm:ss");

sql.Date sday =  new Date(day.getTimes());//

pstmt.setDate(sday);

但是只保留了日期,而没有小时,如果想保存到24小时精确时间,用下一种。

3.

   java.util.Date Dates = new java.util.Date();
        java.sql.Timestamp time = new java.sql.Timestamp(Dates.getTime());
        ......
       psmt.setTimestamp(3, time);


    java.sql.SQLException: 无效的列索引

“无效的列索引”其实是个低级的错误,原因无非几个:

 

1、sql串的?号数目和提供的变量数目不一致:

例如:jdbcTemplate.update(sql, new Object[] {newState,oldState});

如果sql里面有1个?号,Object[]送了2个,就会报错。

 

2、sql串里的?号书写不正确

英文?和中文?有时难以区分。

 

3、sql串的?号用''括了起来。

例如:sql="UPDATE abc SET abc.name='?' WHERE abc.id='?'";

把''去掉就可以了。

 

4,遇到这种情况select*from user where   info   like   %?%; 

虽然这是sql的写法,但是在jdbc 中需要改成 select*from user where   info   like   ?;

如ps.setString(“%”+value+“%”);


String sel="select * from leechdom where spec like '%?%";
 PreparedStatement stmt=con.prepareStatement(sel);   
 stmt.setString (1,"土");
 ResultSet rs=stmt.executeQuery()
 ---------
 以上是错误的。
 String sel="select * from leechdom where spec like ?“;
 stmt.setString (1,"'%土%'");
 ---------
 也是错误的。
 

请给出正确的方法。
String sel="select * from leechdom where spec like ?";
 PreparedStatement stmt=con.prepareStatement(sel);  
 stmt.setString (1,new String(“%土%”.getBytes(),"iso-8859-1"));
 ResultSet rs=stmt.executeQuery()

  评论这张
 
阅读(485)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017