




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、LOGO1模版來源于網(wǎng)絡(luò),禁止用于商業(yè)用途W(wǎng)EB 數(shù)據(jù)庫操作J2EE框架及應(yīng)用開發(fā)技術(shù)之LOGO2第一節(jié)正文目標與重點目標與重點目標:JSP中使用JDBC訪問數(shù)據(jù)庫重點:JDBC組件技術(shù)的基本結(jié)構(gòu)與原理 掌握JDBC訪問數(shù)據(jù)庫的基本步驟 掌握JDBC的常用接口和方法LOGO3第一節(jié)正文 JDBC是Java數(shù)據(jù)庫連接技術(shù)的簡稱,提供連接各種常用數(shù)據(jù)庫的能力Java應(yīng)用程序應(yīng)用程序JDBCJDBCJSP/Servlet客戶端客戶端數(shù)據(jù)庫服務(wù)器數(shù)據(jù)庫服務(wù)器應(yīng)用服務(wù)器應(yīng)用服務(wù)器數(shù)據(jù)庫服務(wù)器數(shù)據(jù)庫服務(wù)器客戶端客戶端JDBCJDBC簡介簡介LOGO4第一節(jié)正文 JDBC API DriverManager
2、類 Connection接口 Statement接口 ResultSet接口 DriverManager 作用:載入各種不同的JDBC驅(qū)動 JDBC 驅(qū)動 作用:負責連接各種不同的數(shù)據(jù)庫JDBC API JDBC Driver Manager JDBC 驅(qū)動驅(qū)動 JDBC 驅(qū)動驅(qū)動 Java 應(yīng)用程序應(yīng)用程序 JDBCJDBC常用接口常用接口LOGO5第一節(jié)正文 JDBC API可做三件事:與數(shù)據(jù)庫建立連接、執(zhí)行SQL 語句、處理結(jié)果ConnectionDriverManagerStatementResultSet DriverManager :依據(jù)數(shù)據(jù)庫的不同,管理:依據(jù)數(shù)據(jù)庫的不同,管理J
3、DBC驅(qū)動驅(qū)動 Connection :負責連接數(shù)據(jù)庫并擔任傳送數(shù)據(jù)的任務(wù):負責連接數(shù)據(jù)庫并擔任傳送數(shù)據(jù)的任務(wù) Statement :由由 Connection 產(chǎn)生、負責執(zhí)行產(chǎn)生、負責執(zhí)行SQL語句語句 ResultSet:負責保存:負責保存Statement執(zhí)行后所產(chǎn)生的查詢結(jié)果執(zhí)行后所產(chǎn)生的查詢結(jié)果客戶端客戶端數(shù)據(jù)庫服務(wù)器數(shù)據(jù)庫服務(wù)器1234LOGO6JDBC簡介l JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接),由一些接口和類構(gòu)成的API。l J2SE的一部分,由java.sql, javax.sql包組成。LOGO7ODBC數(shù)據(jù)庫數(shù)據(jù)庫客戶機/
4、服務(wù)器 GUI應(yīng)用程序ODBC(開放式數(shù)據(jù)庫連接)(Microsoft 提供)插 入刪 除修 改應(yīng)用程序編程接口 查詢 LOGO8JDBCJDBC(Java 數(shù)據(jù)庫連接)(sun公司提供)Java 應(yīng)用程序編程接口Java應(yīng)用程序數(shù)據(jù)庫數(shù)據(jù)庫 插 入修 改刪 除查詢 LOGO9JDBC驅(qū)動的類型JDBC 驅(qū)動程序的類型 JDBC-ODBC橋驅(qū)動程序及橋驅(qū)動程序及ODBC驅(qū)動程序驅(qū)動程序 本地本地API部分部分Java驅(qū)動程序驅(qū)動程序 JDBC-Net 純純Java驅(qū)動程序驅(qū)動程序 本地協(xié)議純本地協(xié)議純Java驅(qū)動程序驅(qū)動程序 LOGO10JDBC體系結(jié)構(gòu) Java 程序 JDBC 驅(qū)動程序數(shù)據(jù)
5、庫數(shù)據(jù)庫SQL 命令 結(jié)果 LOGO11JDBC體系結(jié)構(gòu)應(yīng)用層應(yīng)用層 Driver StatementResultSet Connection 各接口驅(qū)動層驅(qū)動層 LOGO12JDBC APIJDBC API由兩個部分組成:l 一個是核心的API,其類包路徑為java.sql,這是J2SE的一部分,它具有可滾動的結(jié)果集,批量更新的實現(xiàn)類;l 二是擴展的API,其類包路徑為javax.sql,這是J2EE的一部分。LOGO13JDBCJDBC APIAPI(常用)(常用)l java.sql.DriverManager:完成驅(qū)動程序的裝載和建立新的數(shù)據(jù)庫連接。 l java.sql.Connec
6、tion:表示對某一指定數(shù)據(jù)庫的連接。 l java.sql.Statement:管理在一指定數(shù)據(jù)庫連接上的SQL語句的執(zhí)行。 l java.sql.ResultSet:一個select語句的執(zhí)行結(jié)果。l java.sql.PreparedStatement:繼承了Statement接口,用于對預編譯的SQL語句的執(zhí)行。l java.sql.CallableStatement:繼承了Statement接口,用于對一個數(shù)據(jù)庫存儲過程的執(zhí)行。l java.sql.SQLException:處理數(shù)據(jù)庫訪問時的出錯信息。 LOGO14Connection對象l通過Connection連接對象可以獲取S
7、tatement語句對象,或者PreparedStatement語句對象;l通過Statement或PreparedStatement語句對象就可以對數(shù)據(jù)庫進行查詢和更新操作;LOGO15Connection對象(續(xù))lConnection常用的方法有以下幾種。close():完成關(guān)閉連接。:完成關(guān)閉連接。commit() :完成提交。:完成提交。rollback() :完成回滾。:完成回滾。LOGO16Connection對象(續(xù))l createStatement():該方法返回Statement對象。l prepareStatement(String sql):參數(shù)sql是執(zhí)行 SQL的
8、語句,該方法返回PrepareStatement對象。l setAutoCommit(Boolean autoCommit):參數(shù)autoCommit表示是否自動提交,該方法用于設(shè)置自動提交。LOGO17Statement對象l 執(zhí)行操作數(shù)據(jù)庫的過程是,通過Connection連接對象獲取Statement對象,再通過Statement對象執(zhí)行相關(guān)讀取或更新操作。l Statement對象還有兩種具體實現(xiàn),分別為PreparedStatement和CallableStatement。l PreparedStatement主要是用來預編譯SQL語句,這個對象主要是為了提高程序效率;l Calla
9、bleStatement繼承了PreparedStatement接口,用于執(zhí)行存儲過程。LOGO18Statement對象l Statement對象是通過Connection對象的createStatement()方法來創(chuàng)建的。對于不是頻繁查詢記錄的應(yīng)用而言,使用Statement對象是一個合適的做法,因為它不必像PreparedStatement對象一樣,需要預編譯。Statement對象的創(chuàng)建過程如下所示:LOGO19Statement對象String URL = String URL = jdbc:mysql:/localhost:3306/bank?username=root&
10、password=rootjdbc:mysql:/localhost:3306/bank?username=root&password=rootConnection conn=DriverManager.getConnection(URL);Connection conn=DriverManager.getConnection(URL);/獲取到數(shù)據(jù)庫的連接對象。Statement st = conn. createStatement();Statement st = conn. createStatement();/獲取Statement語句對象。LOGO20Statement對象的
11、常用方法lStatement對象的常用方法如下。 close():完成關(guān)閉Statement。 executeQuery(String sql):參數(shù)sql表示查詢SQL語句,該方法返回ResultSet對象。LOGO21Statement對象的常用方法l executeUpdate(String sql):參數(shù)sql表示操作SQL語句,該方法返回更新的行數(shù)。l execute(String sql):參數(shù)sql表示操作SQL語句,該方法返回一個boolean值,表明是否返回了ResultSet對象。l getResultSet():該方法返回ResultSet對象,通常與execute配合使
12、用。LOGO22Statement常用方法舉例1. . executeQueryexecuteQuery()()方法 主要是用來執(zhí)行查詢命令,返回一個ResultSet對象,代碼如下所示:String sql = “select * from user”;ResultSet rs = statement.executeQuery(sql); 這個示例代碼是查詢user表的所有數(shù)據(jù)。LOGO23 2. execute()方法 主要是用來執(zhí)行一般的SQL命令,包括增刪改查以及數(shù)據(jù)定義,返回一個布爾值,它顯示了是否返回一個查詢結(jié)果集ResultSet對象,查詢user表的所有數(shù)據(jù)代碼如下所示: St
13、ring sql = “select String sql = “select * * from user”; from user”; boolean value = statement. execute(sql);boolean value = statement. execute(sql); ResultSetResultSet rs=statement.getResultSet();rs=statement.getResultSet();LOGO24使用PreparedStatement對象PreparedStatement接口(預編譯的 SQL 語句)PreparedStatement
14、 用于提高運行時效率執(zhí)行 PreparedStatement 對象比執(zhí)行 Statement 對象快Statement 接口接口LOGO25PreparedStatement 對象l PreparedStatement對象是通過Connection對象的prepareStatement ()方法來創(chuàng)建。l PrepareStatement(String sql)方法的參數(shù)需要輸入所要執(zhí)行的SQL語句。l 該SQL語句可以是一個參數(shù)化的SQL語句,且參數(shù)位置用“?”代替,然后根據(jù)參數(shù)的序號位置,分別調(diào)用不同類型的set方法將參數(shù)值動態(tài)輸入。l 如:String sql=“select * fro
15、m users where userid=?”LOGO26l PreparedStatement是預編譯的。l 所謂預編譯,就是在創(chuàng)建語句對象時,將SQL執(zhí)行語句一起進行編譯,然后寫入緩存,只保留參數(shù)動態(tài)輸入。這樣在執(zhí)行相同的數(shù)據(jù)庫操作時(如查詢某條記錄的信息),不必總是對查詢SQL命令進行編譯,而只是修改相應(yīng)的參數(shù),例如根據(jù)某個標識查詢記錄,就能獲得查詢結(jié)果,達到了提高效率的目的。PreparedStatement 對象LOGO27l PreperedStatement(從Statement擴展而來)相對Statement的優(yōu)點:1.沒有SQL注入的問題。2.Statement會使數(shù)據(jù)庫頻繁
16、編譯SQL,可能造成數(shù)據(jù)庫緩沖區(qū)溢出。3.數(shù)據(jù)庫和驅(qū)動可以對PreperedStatement進行優(yōu)化(只有在相關(guān)聯(lián)的數(shù)據(jù)庫連接沒有關(guān)閉的情況下有效)。 LOGO28PreparedStatement對象的常用方法l close():該方法完成關(guān)閉Statement。l executeQuery():該方法輸出ResultSet對象。l executeUpdate():該方法輸出數(shù)據(jù)更新的行數(shù)。LOGO29l execute():該方法輸出boolean值,表明是否返回了ResultSet對象。l setBoolean(int paramIndex, boolean x):參數(shù)paramInd
17、ex表示所傳遞的參數(shù)序號,參數(shù)x表示傳遞的是布爾類型參數(shù)值。l setByte(int paramIndex, byte x):參數(shù)paramIndex表示所傳遞的參數(shù)序號,參數(shù)x表示該方法傳遞的是一個字節(jié)型參數(shù)值。PreparedStatement對象的常用方法LOGO30l setShort(int paramIndex, short x):參數(shù)paramIndex表示所傳遞的參數(shù)序號,參數(shù)x表示該方法傳遞的是一個短整型參數(shù)值。l setInt(int paramIndex, int x) :參數(shù)paramIndex表示所傳遞的參數(shù)序號,參數(shù)x表示該方法傳遞的是一個整型參數(shù)值。Prepar
18、edStatement對象的常用方法LOGO31l setLong(int paramIndex, long x) :參數(shù)paramIndex表示所傳遞的參數(shù)序號,參數(shù)x表示該方法傳遞的是一個長整型參數(shù)值。l setFloat(int paramIndex, float x) :參數(shù)paramIndex表示所傳遞的參數(shù)序號,參數(shù)x表示該方法傳遞的是一個浮點型參數(shù)值。PreparedStatement對象的常用方法LOGO32l setDouble(int paramIndex, double x) :參數(shù)paramIndex表示所傳遞的參數(shù)序號,參數(shù)x表示該方法傳遞的是一個雙精度型參數(shù)值。l
19、setBytes(int paramIndex, byte x) :參數(shù)paramIndex表示所傳遞的參數(shù)序號,參數(shù)x表示該方法傳遞的是一個字節(jié)數(shù)字參數(shù)值。PreparedStatement對象的常用方法LOGO33l setDate(int paramIndex, java.sql.Date x) :參數(shù)paramIndex表示所傳遞的參數(shù)序號,參數(shù)x表示該方法傳遞的是一個日期類型參數(shù)值。l setTime(int paramIndex, java.sql.Time x) :參數(shù)paramIndex表示所傳遞的參數(shù)序號,參數(shù)x表示該方法傳遞的是一個時間參數(shù)值。PreparedStateme
20、nt對象的常用方法LOGO34lsetObject(int paramIndex, Object x) :參數(shù)paramIndex表示所傳遞的參數(shù)序號,參數(shù)x表示該方法傳遞的參數(shù)值是一個對象。PreparedStatement對象的常用方法LOGO35ResultSet對象lResultSet對象用于保存數(shù)據(jù)庫的查詢結(jié)果集。lResultSet對象通??梢酝ㄟ^一個Statement對象,或PreparedStatement對象及一些其他子接口對象的executeQuery()方法獲得。LOGO36ResultSet對象l 在JDBC1.0中,結(jié)果集只能單向的滾動,即調(diào)用ResultSet的ne
21、xt()方法,使游標向后一行記錄滾動。所謂滾動,指的是游標在記錄行中的定位。l 在JDBC2.0中,擴展了上述滾動功能。使得滾動方式更加靈活和可操控。例如,JDBC2.0增加了前滾,即游標向當前記錄的前一行滾動,及向某一指定的記錄行跳轉(zhuǎn)等。LOGO37結(jié)果集q ResultSet 對象完全依賴于 Statement 對象和 Connection 對象q 每次執(zhí)行 SQL 語句時,都會用新的結(jié)果重寫結(jié)果集q 當相關(guān)的 Statement 關(guān)閉時,ResultSet 對象會自動關(guān)閉Next( )get()此方法將光標從當前位置下移一行 從 ResultSet 對象返回數(shù)據(jù) LOGO38q 它演示對
22、當前行的處理q 使用 next() 方法時,記錄是按順序處理的q 必須按照數(shù)據(jù)返回的順序處理每行中的數(shù)據(jù)ResultSet rset = stmt.getResultSet();while(rset.next() String dept_name = rset.getString(1);LOGO39q 演示對當前列的處理q 使用 get() 方法可以直接訪問列Statement stmt = con.createStatement();stmt.executeQuery(Select emp_id, fname from Employee);ResultSet rset = stmt.getR
23、esultSet();while(rset.next() String employeeid = rset.getString (1);q 以下代碼顯示值 1 被作為參數(shù)傳遞給 getString() 方法, 這實際上指列 emp_id 的索引LOGO40JDBC訪問步驟開 始導入 java.sql包 加載并注冊驅(qū)動程序創(chuàng)建一個 Connection 對象創(chuàng)建一個 Statement 對象執(zhí)行語句關(guān)閉ResultSet 對象關(guān)閉Statement對象關(guān)閉連接結(jié) 束使用ResultSet對象LOGO41注冊驅(qū)動l Class.forName(“com.mysql.jdbc.Driver”);推薦
24、這種方式,不會對具體的驅(qū)動類產(chǎn)生依賴。l DriverManager.registerDriver(com.mysql.jdbc.Driver);會造成DriverManager中產(chǎn)生兩個一樣的驅(qū)動,并會對具體的驅(qū)動類產(chǎn)生依賴。l System.setProperty(“jdbc.drivers”, “driver1:driver2”);雖然不會對具體的驅(qū)動類產(chǎn)生依賴;但注冊不太方便,所以很少使用。 l 驅(qū)動類型(四種類型)LOGO42建立連接(Connection)lConnection conn = DriverManager.getConnection(url, user, passwo
25、rd);lurl格式:JDBC:子協(xié)議:子名稱/主機名:端口/數(shù)據(jù)庫名?屬性名=屬性值&luser,password可以用“屬性名=屬性值”方式告訴數(shù)據(jù)庫;l其他參數(shù)如:useUnicode=true&characterEncoding=GBK。LOGO43創(chuàng)建執(zhí)行SQL的語句l 使用Statement對象 String sql=select * from table_name where col_name=value”; Statement st = conn.createStatement(); st.executeQuery(sql);l 使用PreparedStatem
26、ent對象String sql = “select * from table_name where col_name=?”; PreparedStatement ps = onn.preparedStatement(sql); ps.setString(1, “col_value”); ps.executeQuery();LOGO44處理執(zhí)行結(jié)果(ResultSet)ResultSet rs = statement.executeQuery(sql);while(rs.next()rs.getString(“col_name”);rs.getInt(“col_name”);/LOGO45釋放資
27、源l 釋放ResultSet, Statement,Connection.l 數(shù)據(jù)庫連接(Connection)是非常稀有的資源,用完后必須馬上釋放,如果Connection不能及時正確的關(guān)閉將導致系統(tǒng)宕機。l Connection的使用原則是盡量晚創(chuàng)建,盡量早的釋放。LOGO46使用Statement進行數(shù)據(jù)庫操作SQL 查詢字符串 executeQuery() 方法 作為參數(shù)傳遞ResultSet 返回查詢數(shù)據(jù)SELECT name, email, phone FROM colleagues;使用 SQL 語句,查詢可編寫為:String str = SELECT emp_id, lnam
28、e, fname FROM colleagues;Statement stmt = con.createStatement();ResultSet rset = stmt.executeQuery(str);使用 JDBC 編寫此查詢,則代碼為:Statement接口接口LOGO47基本的CRUD(創(chuàng)建、讀取、更新、刪除) l 模板代碼 Connection conn = null;Statement st=null;ResultSet rs = null; /查詢時需要try /獲得Connection/創(chuàng)建Statement/處理查詢結(jié)果ResultSetcatch(Exception e
29、) /處理異常 finally /釋放資源ResultSet, Statement,ConnectionLOGO48創(chuàng)建l 增加對應(yīng)SQL的INSERT,返回增加成功的行(記錄)數(shù) conn = getConnection();/獲取數(shù)據(jù)庫連接Statement st = conn.createStatement();String sql=“insert into user(name, age,regist_date )” + “values(name, 10, now()”;int i = st.executeUpdate(sql);/i為插入的記錄數(shù)LOGO49讀 取l 讀?。ú樵儯?yīng)S
30、QL的SELECT,返回查詢結(jié)果conn = getConnection();Statement st = conn.createStatement();String sql = select id, name, age,regist_date from user;ResultSet rs = st.executeQuery(sql);while (rs.next() System.out.print(rs.getInt(id) + tt );System.out.print(rs.getString(name) + tt );System.out.print(rs.getInt(age) +
31、 tt );System.out.print(rs.getTimestamp(regist_date) + tt );System.out.println(); /換行LOGO50更 新l 更新(修改)對應(yīng)SQL的UPDATE,返回被修改的行(記錄)數(shù) conn = getConnection();Statement st = conn.createStatement();String sql=“update person set name=new name”;int i = st.executeUpdate(sql);/i為符合條件的記錄數(shù)LOGO51刪除l 刪除對應(yīng)SQL的DELETE,返
32、回被刪除的行(記錄)數(shù) conn = getConnection();Statement st = conn.createStatement();String sql=“delete from user where id=1”;int i = st.executeUpdate(sql);/i為刪掉的記錄數(shù)LOGO52CRUD總結(jié)l 增、刪、改用executeUpdate方法(或excute方法)來完成,返回整數(shù)(匹配的記錄數(shù)),這類操作相對簡單。l 查詢用executeQuery方法(或excute方法)來完成,返回的是ResultSet對象,ResultSet中包含了查詢的結(jié)果;查詢相對與增
33、、刪、改要復雜一些,因為有查詢結(jié)果要處理。LOGO53實例:class Test public static void main(String args) try Class.forName(“com.mysql.jdbc.Driver”); System.out.println(“驅(qū)動加載成功!”); String url=“jdbc:mysql:/localhost:3306/stu”; String user=“root”; String pass=“123456”; Connection con=DriverManager.getConnection(url,user,pass); S
34、ystem.out.println(“已成功連接數(shù)據(jù)庫!”); catch(Exception e) e.printStackTrace(); 注意:要使用注意:要使用JDBC API,必須將相應(yīng)的,必須將相應(yīng)的JDBC驅(qū)動程序包拷貝到應(yīng)用程序的驅(qū)動程序包拷貝到應(yīng)用程序的classpath指定的路徑下指定的路徑下LOGO54數(shù)據(jù)庫操作舉例:l假設(shè)在MySQL 中創(chuàng)建了一個名稱為STU的數(shù)據(jù)庫,數(shù)據(jù)庫中有一張名稱為users的表,結(jié)果如下:useridusername2012012John2012586MikeLOGO55數(shù)據(jù)庫操作舉例(續(xù)) 查詢并輸出users表中的所有數(shù)據(jù)。DBSelectTest1.java LOGO56 查詢并輸出用戶ID為2012012的學生:DBSelectTest2.java LOGO57 插入用戶ID為2012055,姓名為“王五”的學生:DBInsertTest.java LOGO58第一節(jié)正文獲得數(shù)據(jù)庫連接獲得數(shù)據(jù)庫連接發(fā)送發(fā)送Sql語句語句處理結(jié)果處理結(jié)果注冊注冊JDB
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 綠竹種植協(xié)議書
- 豬糞消納協(xié)議書
- 簽下分手協(xié)議書
- 彩票站聘任店員協(xié)議書
- 逃離離婚協(xié)議書
- 罐車合伙協(xié)議書
- 紙上夫妻協(xié)議書
- 電梯工程協(xié)議書
- 化工煤買賣合同協(xié)議書
- 小語種課程轉(zhuǎn)讓協(xié)議書
- 2024年中國資源循環(huán)集團有限公司招聘筆試真題
- 2025-2030中國裝備故障預測和健康管理(PHM)行業(yè)發(fā)展現(xiàn)狀與前景預測分析研究報告
- 信息安全基礎(chǔ)試題及答案
- 肛瘺護理查房
- T-PPAC 701-2021 企業(yè)商業(yè)秘密管理規(guī)范
- 經(jīng)絡(luò)腧穴學試題庫與參考答案
- 2025年保健按摩師(高級)資格認證考試題庫(附答案)
- 2024-2025人教七上數(shù)學26第3章代數(shù)式小結(jié)與復習【教案】
- 評估與反饋機制在教研中的重要性
- 供應(yīng)商廉潔態(tài)發(fā)言材料
- 字節(jié)跳動經(jīng)營分析報告
評論
0/150
提交評論