- Java EE框架開發(fā)技術(shù)與案例教程
- 張繼軍 董衛(wèi)
- 1138字
- 2020-05-28 14:20:30
2.4 持久層(JDBC)技術(shù)
實現(xiàn)持久層的技術(shù)是JDBC技術(shù)。在Java Web應(yīng)用程序中,數(shù)據(jù)庫訪問是通過Java數(shù)據(jù)庫連接(JDBC)實現(xiàn)的。JDBC為開發(fā)人員提供了一個標(biāo)準(zhǔn)的API。
JDBC是一種用于執(zhí)行SQL語句的Java API,由一組類與接口組成,通過調(diào)用這些類和接口所提供的方法,可以使用標(biāo)準(zhǔn)的SQL語言來存取數(shù)據(jù)庫中的數(shù)據(jù)。
JDBC重要的類和接口如表2-20所示。
表2-20 與數(shù)據(jù)庫有關(guān)的幾個重要類和接口

在Java Web應(yīng)用程序開發(fā)中,如果要訪問數(shù)據(jù)庫,必須先加載數(shù)據(jù)庫廠商提供的數(shù)據(jù)庫驅(qū)動程序。這里假設(shè)采用MySQL數(shù)據(jù)庫。
需要首先下載MySQL數(shù)據(jù)庫的驅(qū)動程序,然后在應(yīng)用程序中加載該驅(qū)動程序。下載地址為:http://dev.mysql.com/downloads/connector。
下載文件為壓縮文件mysql-connector-java-5.1.6.zip,雙擊解壓該文件。解壓后就可以得到MySQL數(shù)據(jù)庫的驅(qū)動程序文件mysql-connector-java-5.1.6-bin。
使用JDBC訪問數(shù)據(jù)庫,其訪問流程如下。
1.注冊驅(qū)動
Class.forName("com.mysql.jdbc.Driver");
其中,com.mysql.jdbc.Driver為MySQL數(shù)據(jù)庫驅(qū)動程序類名。
2.建立連接(Connection)
1)首先,形成數(shù)據(jù)庫連接的URL。
對于MySQL數(shù)據(jù)庫的連接符號字,可采用如下方式創(chuàng)建。
String url1="jdbc:mysql://數(shù)據(jù)庫服務(wù)器IP:3306/數(shù)據(jù)庫名"; String url2="? user=root&password=密碼"; String url3="&useUnicode=true&characterEncoding=UTF-8"; String url=url1+url2+ url3;
2)利用連接符號字實現(xiàn)連接,獲取連接對象。
Connection conn=DriverManager.getConnection(url);
3.創(chuàng)建數(shù)據(jù)庫操作對象用于執(zhí)行SQL的語句
有兩種不同的數(shù)據(jù)庫操作對象:Statement對象和PrepareStatement對象。兩種對象的創(chuàng)建方法和執(zhí)行SQL是不同的。一般使用PrepareStatement對象。
1)創(chuàng)建Statement對象(createStatement()方法是無參方法)。
Statement stmt=conn.createStatement(); //conn為連接數(shù)據(jù)庫對象
2)創(chuàng)建PrepareStatement對象。
String sql=" "; //SQL語句形成的字符串 PreparedStatement pstmt=conn.preparedStatement(sql); //conn為連接數(shù)據(jù)庫對象
注意:在SQL語句串中,可以使用參數(shù)定位符(“? ”),在創(chuàng)建PrepareStatement對象后,利用setXxxx()方法設(shè)置實際參數(shù)值。
如下面的代碼所示。
String ss="select * from stu_info where age>=? and sex=? "; //注意,占位符的序號從1開始的 PreparedStatement pstmt= conn.preparedStatement(ss); pstmt.setInt(1,20); //給第1個占位符設(shè)置值,注意類型 pstmt.setSting(2, "男"); //給第2個占位符設(shè)置值,注意類型
4.執(zhí)行語句
有兩種執(zhí)行SQL語句的方法。
● 執(zhí)行查詢語句:執(zhí)行select語句,返回一個結(jié)果集。
其語句為:ResultSet executeQuery(String sql)或ResultSet executeQuery()。
● 執(zhí)行update、insert、delete,返回一個整數(shù),表示執(zhí)行SQL影響的數(shù)據(jù)行數(shù)。
其語句為:int executeUpdate(String sql)或int executeUpdate()。
5.處理執(zhí)行結(jié)果(ResultSet)
ResultSet實例具有指向其當(dāng)前數(shù)據(jù)行的指針。最初,指針指向第一行記錄的前方,通過next()方法可以將指針移動到下一行,當(dāng)沒有下一行時將返回false。
移到指定的數(shù)據(jù)行后,再使用一組getXxx()方法讀取各字段的數(shù)據(jù)。其中Xxx指的是Java的數(shù)據(jù)類型。
這些getXxx()方法的參數(shù)有兩種格式,一是用整數(shù)指定字段的索引(索引從1開始),二是用字段名來指定字段。
例如,假設(shè)數(shù)據(jù)表為stu,其中的字段是xh(學(xué)號,字符串)、name(姓名,字符串)和cj(成績,整型),并且查詢結(jié)果集為rs,則獲取當(dāng)前記錄的各字段的值代碼如下。
String sql="select xh, name, cj from stu"; ResultSet rs=stmt.executeQuery(sql); //這里假設(shè)采用Statement對象執(zhí)行SQL語句 String student_xh=rs.getString(1); //或String student_xh=rs.getString("xh"); int student_cj=rs.getInt(3); //或int student_cj=rs.getInt("cj"); String student_name=rs. getString(2); //或String student_name=rs. getString("name");
6.釋放資源
假設(shè)建立的對象依次為:連接對象為conn(Connection conn),操作對象為pstmt(PreparedStatement pstmt),得到的查詢結(jié)果集對象為rs(RrsultSet rs),則需要依次關(guān)閉的對象是:rs.close(); stmt.close(); con.close();
具體應(yīng)用將在2.5節(jié)的應(yīng)用案例中給出。
- Java程序設(shè)計(慕課版)
- 測試驅(qū)動開發(fā):入門、實戰(zhàn)與進(jìn)階
- 程序設(shè)計與實踐(VB.NET)
- 編程珠璣(續(xù))
- HTML5游戲開發(fā)案例教程
- Python Geospatial Development(Second Edition)
- MySQL數(shù)據(jù)庫基礎(chǔ)實例教程(微課版)
- Building Minecraft Server Modifications
- Java程序設(shè)計
- RubyMotion iOS Develoment Essentials
- C++從入門到精通(第6版)
- Xamarin Cross-Platform Development Cookbook
- Google Adsense優(yōu)化實戰(zhàn)
- 編程的原則:改善代碼質(zhì)量的101個方法
- C#網(wǎng)絡(luò)程序開發(fā)(第二版)