servlet學(xué)習(xí)筆記之四

          ——數(shù)據(jù)庫訪問

           1JDBC-ODBC橋,其本身也是一個(gè)驅(qū)動(dòng),利用這個(gè)驅(qū)動(dòng),我們可以使用JDBC API 通過ODBC去訪問數(shù)據(jù)庫。這種橋機(jī)制實(shí)際上是把標(biāo)準(zhǔn)的JDBC 調(diào)用轉(zhuǎn)換成相應(yīng)的ODBC 調(diào)用,因此這種方式訪問數(shù)據(jù)庫效率是比較低。也有些數(shù)據(jù)庫沒有提供JDBC驅(qū)動(dòng),只有ODBC 驅(qū)動(dòng),比如訪問ms access數(shù)據(jù)庫就只能利用JDBC-ODBC 橋來訪問。

          2.建立到數(shù)據(jù)庫的連接

          DriverManager類的getConection()方法建立到數(shù)據(jù)庫的連接,返回一個(gè)Connection對(duì)象。在DriverManager類中提供了3個(gè)重載的getConnection()方法。

          ²        public static Connection getConnection(String url)throws SQLException

          給方法通過給出數(shù)據(jù)庫URL建立到數(shù)據(jù)庫的連接。比如:

          Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");

          con = DriverManager.getConnection ("jdbc:odbc:test");

          ²        public static Connection getConnection(String url,String user,String psw)throws SQLException

          給方法取得數(shù)據(jù)庫連接必須給出用戶名和密碼。如:

          Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();

          conn = DriverManager.getConnection(urlname,user,pw);

          ²        public static Connection getConnection(String url,Properties info)throws SQLException

          其中info 鍵值對(duì),一般需要給出用戶名和密碼。

           

          3.訪問數(shù)據(jù)庫

          數(shù)據(jù)庫連接被用于向數(shù)據(jù)庫服務(wù)器發(fā)送命令和SQL語句,在連接建立后,需要對(duì)數(shù)據(jù)庫進(jìn)行訪問,執(zhí)行SQL語句。在java.sql包中給我們提供了3個(gè)接口:Statement,PreparedStatement ,CallableStatement.

          Statement

          調(diào)用Connection對(duì)象的creatStatement()方法創(chuàng)建一個(gè)Statement對(duì)象。Statement對(duì)象用于執(zhí)行靜態(tài)的SQL語句,返回執(zhí)行的結(jié)果。

          Statement接口中定義了下列方法用于執(zhí)行SQL語句。

          ResultSet executeQuery(String sql ) throws SQLException

          該方法執(zhí)行sql語句,返回一個(gè)ResultSet對(duì)象。ResultSet對(duì)象用于查看執(zhí)行的結(jié)果。

           

          int executeUpdate(String sql )throws SQLException

          該方法執(zhí)行sql指定的insertupdate或者delete語句。另外,該方法也可以用于執(zhí)行SQL DDL語句,例如:create table

           

          boolean executeString sqlthrows SQLException

          感覺模糊,我覺得還是不用比較好。

           

          連接數(shù)據(jù)庫中,getInitParameter(“url”);獲取的是web.xml的信息。

          <Servlet>

          <init-param>

                 <param-name>url</param-name>

                 <param-value>jdbc:mysql://localhost:3306/mysql</param- value >

          </init-param>

          <init-param>

                 <param-name>user</param-name>

                 <param-value>javahe</param- value >

          </init-param>

          </Servlet>

           

          PreparedStatement

           

          我們?cè)诔绦蛑袀鬟f的SQL語句在執(zhí)行前必須被預(yù)編譯,包括語句分析、代碼優(yōu)化等,然后才能被數(shù)據(jù)庫引擎執(zhí)行。如果重復(fù)執(zhí)行只有參數(shù)不同的SQL語句,是比較低效的。如果要用不同的參數(shù)來多次執(zhí)行同一個(gè)SQL語句,可以使用PreparedStatement的對(duì)象。PreparedStatement接口從Statement接口繼承而來,它的對(duì)象表示一條預(yù)編譯過的SQL語句。我們可以通過調(diào)用Connection對(duì)象的prepareStatement()方法而得到PreparedStatement對(duì)象。PreparedStatement對(duì)象所代表的SQL語句中的參數(shù)問號(hào)來表示,第一個(gè)參數(shù)從一開始。

          eg

          String sql = "delete from " + m_objTable + " where " + m_objFldTagId + "=?";

          PreparedStatement objStatement = m_objConnection.prepareStatement (sql);

          objStatement.setInt (1, objSms.id);

          objStatement. executeUpdate ();

           

          CallableStatement

           

          CallableStatement對(duì)象用于執(zhí)行sql存儲(chǔ)過程。CallableStatement接口從PreparedStatement接口繼承而來,我們可以通過調(diào)用Connection對(duì)象的prepareCall()方法來得到CallableStatement對(duì)象。在執(zhí)行存儲(chǔ)過程之前,凡是存儲(chǔ)過程中類型為OUT的參數(shù)必須被注冊(cè),這可以通過CallableStatement對(duì)象的registerOutParameter()方法來完成。對(duì)于類型為IN類型的參數(shù),可以利用setXXX()方法來設(shè)置參數(shù)的值。

          eg

          ……

          CallableStatement cstmt = conn.prepareCall(“call p_changesal(?,?)”);

          cstmt.registerOutParameter(2,java.sql.Types.INTEGER);

          cstmt.setInt(1,212212);

          cstmt.execute();

          int sal = cstmt.getInt(2);

                             

          元數(shù)據(jù)

           

          sql中,用于描述數(shù)據(jù)庫或者它的各個(gè)組成部分之一的數(shù)據(jù)稱為 元數(shù)據(jù)。

          可以調(diào)用ResultSet 對(duì)象的getMetaData()方法來得到ResultSetMetaDate對(duì)象,該對(duì)象有獲取元數(shù)據(jù)的方法(詳細(xì)方法請(qǐng)查api)。

           

          事務(wù)處理

           

          事務(wù)處理保證所有的事務(wù)都作為一個(gè)工作單元來執(zhí)行,即使出現(xiàn)了硬件或者系統(tǒng)失靈,都不能改變這種執(zhí)行方式。當(dāng)在一個(gè)事務(wù)中執(zhí)行多個(gè)操作時(shí),要么所有的操作都被提交,要么整個(gè)事務(wù)回滾到最初的狀態(tài)。

           

          當(dāng)一個(gè)連接建立時(shí),默認(rèn)情況下是設(shè)置為自動(dòng)提交事務(wù),這意味著每次執(zhí)行一個(gè)sql語句時(shí),如果執(zhí)行成功,就會(huì)向數(shù)據(jù)庫自動(dòng)提交,也就不能回滾了。為了將多個(gè)sql語句作為一個(gè)事務(wù)執(zhí)行,可以調(diào)用Connection對(duì)象的setAutoCommit()方法,傳入false來取消自動(dòng)提交事務(wù),然后在所有的sql語句完成后,調(diào)用Connection對(duì)象的commit()方法來提交事務(wù),或者在執(zhí)行出錯(cuò)時(shí)候調(diào)用Connection對(duì)象的rollback()方法來回滾事務(wù)。

           

          至于可滾動(dòng)和可更新的結(jié)果集。我這里不做總結(jié)。日后寫翻頁程序基本就了解了。

          至于會(huì)話跟蹤,不多說。改天練習(xí)一個(gè)購物車程序。練習(xí)一個(gè)在線人數(shù)統(tǒng)計(jì)(無非就是在web服務(wù)端用了靜態(tài)Hash表存儲(chǔ)信息,每次用戶登錄就add進(jìn)去)。

           

          轉(zhuǎn)入JSP學(xué)習(xí)中。

          posted on 2007-04-04 09:21 -274°C 閱讀(700) 評(píng)論(0)  編輯  收藏 所屬分類: JSP

          常用鏈接

          留言簿(21)

          隨筆分類(265)

          隨筆檔案(242)

          相冊(cè)

          JAVA網(wǎng)站

          關(guān)注的Blog

          搜索

          •  

          積分與排名

          • 積分 - 917238
          • 排名 - 40

          最新評(píng)論

          主站蜘蛛池模板: 新乡县| 湘阴县| 铜川市| 奉节县| 千阳县| 合江县| 淳安县| 禄丰县| 农安县| 太康县| 清水河县| 盐亭县| 嘉峪关市| 高邮市| 新野县| 双流县| 南和县| 凉山| 大同市| 五台县| 岳普湖县| 湟中县| 西昌市| 高州市| 齐河县| 扶余县| 南木林县| 龙川县| 柏乡县| 曲水县| 呼玛县| 吉木乃县| 石嘴山市| 榕江县| 来安县| 清远市| 柘荣县| 惠安县| 织金县| 大方县| 乌鲁木齐县|