官术网_书友最值得收藏!

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)用案例中給出。

主站蜘蛛池模板: 峡江县| 冀州市| 吉安县| 宁德市| 莱阳市| 无锡市| 拉萨市| 禹州市| 吴堡县| 光山县| 珠海市| 芷江| 于都县| 靖江市| 高邑县| 饶阳县| 长沙县| 成武县| 平原县| 务川| 乃东县| 武冈市| 互助| 汶上县| 辽源市| 永丰县| 平江县| 新余市| 常州市| 修武县| 西华县| 承德市| 漠河县| 云和县| 盱眙县| 扎鲁特旗| 邹平县| 措勤县| 长沙市| 册亨县| 驻马店市|