亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? day03.txt

?? JDBC描述詳解JDBC描述詳解JDBC描述詳解JDBC描述詳解
?? TXT
字號:
JDBC_day03   langna  2007-9-10   星期一

一、事務并發:
    事務并發:事務和事務之間有時間重合的地方;
    并發:
    1、必須的;
    2、產生某些不良的后果;
    3、某些手段來控制;
    從效率上來說,并發是必須的;但是不良的后果得消除;
    
    三種后果:
    1、臟讀(dirty read):
                  dirty data;修改了一半的數據,還沒有提交;
                  一個事務讀到了另一個事務沒有提交的數據;
        
         事務a:存100;1000  +  100  --> 1100(未提交)--> rollback; --->1000
                                                事務b:     1100+200---> 1300----> commit; 造成數據不一致;
         后果很嚴重;大多數數據庫將防止臟讀,作為默認的控制級別;
         
     2、不可重復讀(UnRepeatable Read):
                 一個事務在事務期間,前后對同一組數據進行讀操作,讀到的結果不一致;
                 原因是:在這個事務兩次讀的中間,有其他事務提交了數據;
                 與臟讀不同的是 :讀的是已提交的數據;
                 (update)
          事務a: 存100;1000+100--> 1100--> 提交時先讀一下,跟1000不同了,不能存1100了;
                                                                    如果仍存上1100,就是更新(1200)丟失;
          在a持續的期間:事務b: 存200;1000+200--> 提交 :1200 
          
          對于即時改變的東西(天氣預報)沒關系,但是對于累加的東西(銀行帳戶)不能出現更新丟失的情況;
      3、幻讀(phantom  read):
                  在一個事務的執行期間,前后兩次讀同一組數據,數據量不一致;記錄個數增加或減少;
                  (insert)
                  銀行統計:
                  10萬個帳戶,-->  余額 :10億 
                  存的時候又變成:100100個帳戶;
                  商場盤點:關門進行;
                  
二、事務隔離級別:

    TRANSACTION_NONE   不使用事務。沒有什么用;只是理論上的,實際無意義;
    TRANSACTION_READ_UNCOMMITTED  沒有控制;可以讀取未提交數據。也無實際意義;
    TRANSACTION_READ_COMMITTED   可以避免臟讀,不能夠讀取沒提交的數據,
                                                                最常用的隔離級別,大部分數據庫的默認隔離級別;
    TRANSACTION_REPEATABLE_READ  可以避免臟讀,和不可重復讀;
    TRANSACTION_SERIALIZABLE   可以避免臟讀,重復讀取和幻讀,
                                                      (事務串行化)會降低數據庫效率
                                                      
    后兩種在很多數據庫中是沒有區別的;防止提交別的數據,即不讓別的事務操作,
    一個事務一個事務串行執行;小范圍內沒有并發;效率低;
    用的不多;一般是在代碼中控制;
    
    Oracle:就支持兩種,防止臟讀和串行化;
    
    以上的五個事務隔離級別都是在Connection類中定義的靜態常量,
    使用setTransactionIsolation(int level) 方法可以設置事務隔離級別。
    
三、JDBC新特性:
      四、五、六章是2.0的擴展;
      對resultset的擴展
      對statement的增強(批處理)
      sql3.0類型(blob/clob)
      datasource(jndi)
      rowset
      
1、JDBC2.0 ResultSet 可滾動結果集(可雙向滾動),這種結果集不但可以雙向滾動,
     相對定位,絕對定位,并且可以修改數據信息。
     
    滾動特性
    next(),boolean,此方法是使游標向下一條記錄移動。(向最后一條記錄的方向移動)
    previous() ,此方法可以使游標上一條記錄移動,前提前面還有記錄。(向第一條記錄的方向移動)
    absolute(int row),boolean ,可以使用此方法跳到指定的記錄位置。
                             定位成功返回true,不成功返回false,返回值為false,則游標不會移動。
    afterLast() ,void  游標跳到最后一條記錄之后。
    beforeFirst() ,void 游標跳到第一條記錄之前。(跳到游標初始位)
    first(),boolean,游標指向第一條記錄。
    last(),boolean ,游標指向最后一條記錄。
    relative(int rows) ,相對移動的位置個數,參數值可正可負,參數為正,
                                游標從當前位置向下移動指定值,參數為負,
                                游標從當前位置向上移動指定值。
   
    TYPE_FORWARD_ONLY ,該常量指示指針只能向前移動的 ResultSet 對象的類型。 
        
    TYPE_SCROLL_INSENSITIVE ,該常量指示可滾動但通常不受其他的更改影響的 ResultSet 對象的類型。 
    TYPE_SCROLL_SENSITIVE ,該常量指示可滾動并且通常受其他的更改影響的 ResultSet 對象的類型。
                                              
                                              有的數據庫支持,有的不支持;
                                              我們用哪個都可以,只要支持可滾動的
    CONCUR_READ_ONLY ;//只讀結果集
    CONCUR_UPDATABLE; //可更新結果集,可以通過結果集來更新數據庫;用在小應用中;快速開發;
   
   在驅動程序支持2.0特性的情況下,會給你一個你要的結果集類型:
   
    要使用可滾動結果集時,要在Statement創建時指定兩個參數,才可以使用
    Statement st=null;
    st=con.createStatement(ReusltSet.TYPE_SCROLL_INSENSITIVE,ResuleSet.CONCUR_UPDATABLE);
    
    
    PreparedStatement ps-null;
    ps=con.PrepareStatement("select * from t_test",ResultSet.TYPE_SCROLL_INSENSITIVE,
                                           ResuleSet.CONCUR_READ_ONLY);//順序不能顛倒,否則編譯可過,運行會報錯;
    rs=ps.executeQuery();
    JdbcUtil.printRs(rs);//這時候游標已經指向最后一條記錄的后邊了;
    if(rs.isAfterLast()){sysout("最后一條記錄的后邊 ");}
    
    rs.beforeFirst();//移動到前邊
    sysout("-----------------------");
    JdbcUtil.printRs(rs);
    
    CONCUR_UPDATABLE; //增刪改都可以;
    1) 更新
    移到要更新的記錄處:rs.absolute(3);
    rs.updateInt(1,"1243535");
    rs.updateString("name","tony");
    rs.updateRow();//提交一下
   2) 刪除
   rs.absolute(10);
   rs.deleteRow();
   3) 插入 
    a.  rs.moveToInsertRow();//1、先把游標移動到插入緩沖區;跟結果集結構一樣;并且把游標本來的位置記住;
    -----------------插入數據,b,c 可以重復
    b.  rs.updateInt(1,"1243535");//2、填充緩沖區
        rs.updateString("name","tony");
    c.  rs.insertRow();//3、將緩沖區的內容放到數據庫中;
    -----------------
    b.  rs.updateInt(1,"1243535");
         rs.updateString("name","tony");
    c.  rs.insertRow();//3、將緩沖區的內容放到數據庫中;
    ----------------
    d. rs.moveToCurrentRow();//4、將游標移回到原來的位置;
   
    支持不支持可更新結果集 得看數據庫的驅動;
    還有別的限制:下午講;
    1)對于Oracle用可更新的結果集:
    select id,name from t_test;//不能用通配符select  * from  t_test;
    2)查詢只能引用一張表;
    3)不能有join操作;不能用order by 等其他操作;
    4)會取所有非空字段且沒有默認值;
    5)插入結果集是無序的;
    
    記住做完修改的操作后,要提交后再從數據庫中讀一次結果集才能看到修改的結果;

2、批處理更新  
    一般是20~50~100,會提高效率;
     1)   Statement
        addBatch(String sql), 方法會在批處理緩存中加入一條sql語句
        executeBatch() ,執行批處理緩存中的所有sql語句。
        
     2)   PreparedStatement
          ps = con.prepareStatement(
			  "insert into t_test  values(?,?)");
          
		  for(int i=0;i<50;i++){
		     ps.setInt(1,999801+i);
		     ps.setString(2,"batch");
		     ps.addBatch();
		  }
		  ps.executeBatch();
		  con.commit();
		  
        addBatch() 將一組參數添加到此 PreparedStatement 對象的批處理命令中。
        
        executeBatch() 將一批命令提交給數據庫來執行,如果全部命令執行成功,則返回更新計數組成的數組。
        PreparedStatement中使用批量更新時,要先設置好參數后使用addBatch()方法加入緩存。
        注意:批量更新中只能使用更新或插入語句
        
        execute(String sql),這個方法的返回值是boolean類型,
        如果返回true就表示sql是一個select語句,
        可以通過getResultSet()獲得結果集,
        如果是false,sql就是DML語句或者是DDL語句。

3、 SQL3.0 (SQL99)中的類型

    Array,數組 創建一個數組名為ints的有10個元素的數組,元素的類型為number(4);
                create type ints as  Array(10) of number(4);
                create table numbers(values  ints);
                數據庫類型:ARRAY;  數據庫中的類型;ARRAY a=((OracleResultSet)rs.getARRAY(1));//這種基本不用了;
                1) jdbc類型:java.sql.Array;Array a=rs.getArray(1);//
                2) java類型:BigDecimal[] values=(BigDecimal[])a.getArray();//將Object[]轉成你想要的類型;
    Sturct,結構
           create type money as numberic(10,2);
    Ref, 引用;用的很少;
    
    Blob,大的二進制數據文件。Binary large object 
    Clob,大文本文件對象。       Character  large object
   
   以前處理大對象:有大小上限;是固定的,雖然可調大小;
                              讀的方式:一次性讀取,要么全讀走,要么不讀;rs;
       Blob: 
       1)理論上大小不限;
       2)流式讀取;(是引用)讀的時候才傳過來;
       往數據庫中存blob數據:
       con.setAutoCommit(false);
       //1、委托oracle替我們制造一個空的Blob字段,empty_blob();是oracle的函數
       ps=con.prepareStatement("insert into t_blob values(?,?,empty_blob())");
       
       //2、將空的Blob對象讀回來;
       JdbcUtil.close(ps);//釋放資源
       ps=con.prepareStatement("select blobData from t_blob where id=? for update");
       //for update,加一個讀鎖;防止別的事務修改;
       //游標變成可寫的,普通的結果集的sql加for update 就可以改字段的值;
       
       rs=ps.executeQuery();
       rs.next();
       Blob blob=rs.getBlob(1);
       
       //3、打開一個文件輸入流(讀),打開一個blob上的輸出流(寫),將文件內容寫入blob對象;
       InputStream in=new FileInputStream(fname);
       OutputStream out=blob.setBinaryStream(0);//0是下標,設置從流的第一個字節寫;
       byte[] content =new byte[in.available()];//將文件中的所有字節寫到一個字節數組里
       in.read(content);
       out.write(content);
       in.close();
       out.close();
       
       //4、將寫滿數據的blob對象更新回數據庫
       ps=con.prepareStatement("update t_blob set blobData=? where  id=?");
       ps.setBlob(1,blob);
       ps.setInt(2,100);
       ps.executeUpdate();
       
       con.commit();
      
      create table ln_blob(id number(10) primary key,filename varchar2(20),blobData blob);    
      insert into ln_blob  values(100,null,null);
     
      不能用sqlplus檢索blob字段;select * from ln_blob;//是不能用的;
       
    從數據庫中讀blob數據:
     
		 //1.讀blob值
                 ps = con.prepareStatement(
		  "select blobdata from t_blob where fname=?");
		 ps.setString(1,fname);
		 rs = ps.executeQuery();
                 rs.next();
		 blob = rs.getBlob(1);
		 //2.將blob值寫入文件
		 OutputStream out = new FileOutputStream(fname);
		 InputStream in = blob.getBinaryStream();
		 int b = 0; int c = 0;int x=0;
		 while((b=in.read())!=-1){
		   if((++c%1024)==0){
			 System.out.println("here we go ..."+(++x)+"kb");
		   }
		   out.write(b);
		 }
		 in.close();out.close();
	   }catch (Exception ex){
		 ex.printStackTrace();
	   }finally{
	     JdbcUtil.close(rs,ps,con);
	   }
  }
       
   
    
   
   
    
    
                                                            
    
    
     

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一级日本不卡的影视| 在线看国产一区| 亚洲综合成人在线| 国产偷国产偷精品高清尤物| 欧美日韩成人高清| 99久久精品国产毛片| 狠狠色狠狠色综合系列| 亚洲图片欧美一区| 中文字幕一区二区三区在线观看| 久久综合九色综合欧美就去吻| 欧美伦理电影网| 91国内精品野花午夜精品 | 国产成人精品亚洲日本在线桃色 | 在线精品亚洲一区二区不卡| 成人激情综合网站| 国产综合色在线| 久久精品99国产国产精| 日韩电影在线一区| 日本亚洲视频在线| 日本成人在线视频网站| 琪琪久久久久日韩精品| 亚洲国产一区二区视频| 一区二区三区精品视频| 亚洲欧美激情插| 亚洲精品视频在线观看免费| 国产精品久久久久久久午夜片 | 久久国产麻豆精品| 美腿丝袜在线亚洲一区 | 1区2区3区欧美| 国产精品久久久久一区二区三区共| 日本一区二区在线不卡| 国产欧美综合在线观看第十页| 久久女同性恋中文字幕| 国产精品沙发午睡系列990531| 日韩午夜av电影| 国产欧美精品一区二区色综合| 美女www一区二区| 一区二区三区高清不卡| 亚洲欧美国产77777| 亚洲成人福利片| 久久av资源站| 北条麻妃国产九九精品视频| 91久久精品午夜一区二区| 欧美日韩另类一区| 精品女同一区二区| 中文字幕一区av| 视频一区二区中文字幕| 韩国成人福利片在线播放| 成人免费看片app下载| 在线中文字幕不卡| 伊人色综合久久天天人手人婷| 91丨九色丨蝌蚪富婆spa| av爱爱亚洲一区| 91碰在线视频| 精品视频一区二区三区免费| 91九色最新地址| 欧美色偷偷大香| 88在线观看91蜜桃国自产| 91精品国产色综合久久ai换脸| 欧美日韩国产综合一区二区三区 | 日韩电影免费一区| 青青青爽久久午夜综合久久午夜 | 日本一区二区三区高清不卡| 国产精品美女久久久久久久久久久| 亚洲欧洲色图综合| 亚洲一级二级在线| 日本系列欧美系列| 久久国产精品99精品国产 | 国产精品美女久久久久av爽李琼| 亚洲欧洲日韩女同| 日韩精品每日更新| 成人小视频免费观看| 欧美婷婷六月丁香综合色| 日韩一区二区三区视频| 国产亚洲一本大道中文在线| 亚洲图片欧美激情| 麻豆成人综合网| 日本久久精品电影| 精品久久免费看| 亚洲精品免费一二三区| 激情综合网天天干| 91精彩视频在线| 欧美国产精品劲爆| 日本午夜一区二区| 色综合天天综合在线视频| 7777精品久久久大香线蕉| 日韩精品一区二区三区四区视频| 亚洲三级在线免费| 久久er99热精品一区二区| 欧美无砖专区一中文字| 国产免费久久精品| 九九国产精品视频| 精品视频一区三区九区| 亚洲色图制服丝袜| 国产乱码精品一品二品| 制服丝袜国产精品| 一区二区三区免费观看| www.色综合.com| 国产亚洲欧美日韩日本| 蜜臀国产一区二区三区在线播放| 在线一区二区三区做爰视频网站| 精品国产伦一区二区三区观看方式| 亚洲一区二区精品久久av| 99久久精品免费看国产| 国产免费成人在线视频| 国产成人av电影| 亚洲精品一线二线三线无人区| 免费亚洲电影在线| 欧美日韩国产高清一区二区三区 | 亚洲欧美日韩国产成人精品影院| 国产成人精品三级| 久久一区二区视频| 国产精一品亚洲二区在线视频| 日韩免费电影一区| 日韩精品一区第一页| 欧美日韩一区二区欧美激情| 一区二区三区日韩欧美| 91在线观看一区二区| 国产精品国产三级国产普通话99| 国产精品一区二区你懂的| 欧美精品一区二| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧洲另类一二三四区| 国产婷婷精品av在线| 国产1区2区3区精品美女| 国产肉丝袜一区二区| 国产精品18久久久久久vr| 久久这里都是精品| 丁香婷婷综合网| 国产精品久久久久婷婷| 欧洲一区二区三区在线| 亚洲国产精品视频| 日韩亚洲欧美综合| 国产一区二区三区精品视频| 中文字幕不卡一区| 在线一区二区三区| 日本不卡一区二区三区| 欧美日韩高清一区| 久久国产精品一区二区| 亚洲日本成人在线观看| 欧美日韩和欧美的一区二区| 国内精品伊人久久久久av一坑| 日本一区二区三区在线观看| 在线欧美日韩精品| 国产在线视频一区二区| 国产精品久久久久久亚洲伦| 欧美日韩精品一区二区三区蜜桃 | 亚洲综合一区在线| 欧美精选在线播放| 国产一区二区日韩精品| 亚洲精选视频在线| 欧美一区二区三区在线电影| 国内一区二区在线| 综合久久久久久| 日韩视频免费直播| 狠狠久久亚洲欧美| 综合久久一区二区三区| 欧美一级久久久| 99热这里都是精品| 日韩精品91亚洲二区在线观看 | 一区免费观看视频| 欧美一区二区性放荡片| 成人激情黄色小说| 日韩电影在线一区二区三区| 国产精品久久久久久久久久久免费看| 欧美色图在线观看| 国产高清在线精品| 国产精品美女久久久久aⅴ国产馆| 在线免费观看成人短视频| 免费的成人av| 亚洲欧美日韩国产一区二区三区| 91精品国产色综合久久不卡蜜臀 | 久久精品免费观看| 一级女性全黄久久生活片免费| 久久夜色精品国产噜噜av| 欧美日韩高清一区二区不卡| 成人av在线播放网址| 蜜臀av一区二区| 亚洲综合激情网| 亚洲欧美电影院| 国产免费成人在线视频| 久久久一区二区| 欧美这里有精品| 国产成人综合自拍| 国产麻豆一精品一av一免费| 午夜国产精品一区| 亚洲视频免费在线| 国产精品不卡视频| 久久综合九色综合欧美98| 欧美一级日韩不卡播放免费| 91官网在线观看| 久久99久久99小草精品免视看| 亚洲一区二区欧美| 亚洲一区二区三区中文字幕在线| 中文在线一区二区| 欧美一区二区三区成人| 国产精品69久久久久水密桃| 久草中文综合在线| 亚洲va韩国va欧美va| 亚洲午夜成aⅴ人片|