由淺到深學(xué)習(xí)JDBC二

封裝數(shù)據(jù)訪問對象

成都創(chuàng)新互聯(lián)是專業(yè)的鄆城網(wǎng)站建設(shè)公司,鄆城接單;提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行鄆城網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

1:通過分析總結(jié),所有對數(shù)據(jù)庫表的操作都可以總結(jié)為通過JDBC對表的增刪改查,為了減少冗余代碼,

     使得每次操作表時,不必都寫JDBC程序,所以將對一張表的所有數(shù)據(jù)訪功能,封裝在數(shù)據(jù)訪問對象

     (Data Access Object)中,方便調(diào)用。

2:為了方便數(shù)據(jù)傳輸,往往會將java程序中所有相關(guān)操作的零散字段值,封裝成一個實(shí)體對象--entity。

     實(shí)體封裝原則:

     表----實(shí)體類

     字段---屬性

     實(shí)現(xiàn)序列化

     提供set,get方法。

以下代碼就是利用Dao數(shù)據(jù)訪問對象寫出的JDBC程序,利用封裝簡化了JDBC開發(fā)步驟。

試想一下,如果,有10個添加,20個刪除的請求,還像JDBC1.0,2.0版本那樣寫的話,要寫10遍,20遍大量相似代碼,

基本一致的代碼。這不僅耗時耗力,也不符合JAVA三大特性。所以,利用Dao數(shù)據(jù)訪問層,將對表的常用操作,

封裝成方法,這樣再有10個添加或20個刪除,我們只需要調(diào)用10次,20次這個封裝好的添加或刪除方法,

而不用再寫那么多遍方法,大大簡化了開發(fā)工作量。

以下是利用Dao思想實(shí)現(xiàn)的JDBC3.0是3.0版本后面還有更好的版本娓娓道來!>_<

JDBC_Dao.java

public class JDBC_Dao {

       /**

        * 向account表增加一條記錄

        */

       public void add(Account account){

             Connection conn = null;

             PreparedStatement pstm = null;

             try {

                    //1加載驅(qū)動

                    Class.forName("com.MySQL.jdbc.Driver");

                    //2創(chuàng)建連接

                    conn = DriverManager.getConnection(

                                  "jdbc:mysql://localhost:3306/zdx?serverTimezone=UTC",

                                 "root",

                                 "root");

                    //3準(zhǔn)備sql

                    String sql = "insert into account values(?,?,?,?)";

                    //4創(chuàng)建Statement,發(fā)送sql

                    pstm = conn.prepareStatement(sql);

                    pstm.setString(1,account.getCardId());

                    pstm.setString(2, account.getPassword());

                    pstm.setDouble(3, account.getBalance());

                    pstm.setString(4, account.getPhone());

                    int i = pstm.executeUpdate();

                    //5如果是查詢的話,處理結(jié)果集

             } catch (Exception e) {

                    e.printStackTrace();

             }

             finally{

                    //6釋放資源

                    try {

                           pstm.close();

                           conn.close();

                    } catch (SQLException e) {

                           e.printStackTrace();

                    }

             }

       }

       /**

        * 向account表查詢一條記錄

        * @param account

        * @return

        */

       public Account query(Account account){

             Connection conn = null;

             PreparedStatement pstm =null;

             ResultSet rs = null;

             try {

                    //1加載驅(qū)動

                    Class.forName("com.mysql.jdbc.Driver");

                    //2創(chuàng)建連接

                    conn = DriverManager.getConnection(

                                  "jdbc:mysql://localhost:3306/zdx?serverTimezone=UTC",

                                 "root",

                                 "root");

                    //3準(zhǔn)備sql

                    String sql = "select * from account where "

                    + "card_id = ? and password = ?";

                    //4創(chuàng)建Statement發(fā)送語句

                    pstm = conn.prepareStatement(sql);

                    pstm.setString(1, account.getCardId());

                    pstm.setString(2, account.getPassword());

                    rs = pstm.executeQuery();

                    //5處理結(jié)果集

                    while (rs.next()) {

                           account.setCardId(rs.getString("card_id"));

                           account.setPassword(rs.getString("password"));

                           account.setBalance(rs.getDouble("balance"));

                           account.setPhone(rs.getString("phone"));

                    }

             } catch (Exception e) {

                    e.getStackTrace();

             }

             finally{

                    //6釋放資源

                    try {

                           rs.close();

                           pstm.close();

                           conn.close();

                    } catch (SQLException e) {

                           e.printStackTrace();

                    }

             }

             return account;

       }

}

以上代碼依舊使用account表,需要再寫一個實(shí)體對象用來承載數(shù)據(jù),一個test類用來調(diào)用方法,

,這些最基礎(chǔ)的,這里就不贅述了,不清楚的同學(xué)就要自行參閱java語言了。

如果我查詢A卡,B卡,C卡,三張銀行卡信息,按照J(rèn)DBC2.0要寫三個查詢方法,現(xiàn)在,只需要把參數(shù)傳遞過去,

調(diào)用三次query()方法就好了!

總結(jié):可見利用Dao數(shù)據(jù)訪問層封裝JDBC常用方法,可以大大簡化方法步驟,不用重復(fù)寫方法,只需重復(fù)調(diào)用。

這就是JDBC3.0版本

=============================華麗麗的分割線================

但是仔細(xì)的讀者一定發(fā)現(xiàn)了,這里還存在不少缺陷,沒錯,我們還可以改進(jìn)它。

在JDBC3.0版本里,可以發(fā)現(xiàn),查詢,添加方法,存在大量冗余代碼,比如:

①同的加載驅(qū)動, ②相同的創(chuàng)建連接,③相同的釋放資源。

在上個版本的代碼里我只寫了添加查詢方法,如果還有刪除,修改,查詢所有等方法呢,

沒錯這些方法,也存在相同的創(chuàng)建連接,釋放鏈接。找見了問題,就好解決了。

那么解決的辦法還是----封裝。

我們可以嘗試把1注冊驅(qū)動,2創(chuàng)建連接,6釋放資源,這三個步驟做成工具類-----JDBCutil

這樣,我們在Dao層里面的JDBC方法,在遇到1,2,6等步驟時,不用再去寫代碼,只需調(diào)用封裝好的工具即可。

沒錯程序員都是很懶得!

以下是JDBC4.0是4.0版本,后面還有更完善的版本娓娓道來!

public class JDBC_Util {

       /**

        * @return 返回鏈接

        */

       public static Connection getConnection() throws Exception {

             Connection conn = null;

             Class.forName("com.mysql.jdbc.Driver");

             conn = DriverManager.getConnection(

                           "jdbc:mysql://localhost:3306/zdx?serverTimezone=UTC",

                           "root",

                           "root");

             

             return conn;

       }

       /**

        * 釋放資源

        */

       public static void release(ResultSet rs,

                    Statement stm,

                    Connection conn){

             try {

                    if(rs!=null){rs.close();}

                    if(stm!=null){stm.close();}

                    if(conn!=null){conn.close();}

             } catch (SQLException e) {

                    e.printStackTrace();

             }

       }

}

public class JDBC_Dao2 {

       /**

        * 向account表增加一條記錄

        */

       public void add(Account account){

             Connection conn = null;

             PreparedStatement pstm = null;

             try {

                    conn = JDBC_Util.getConnection();

                    //3準(zhǔn)備sql

                    String sql = "insert into account values(?,?,?,?)";

                    //4創(chuàng)建Statement,發(fā)送sql

                    pstm = conn.prepareStatement(sql);

                    pstm.setString(1,account.getCardId());

                    pstm.setString(2, account.getPassword());

                    pstm.setDouble(3, account.getBalance());

                    pstm.setString(4, account.getPhone());

                    int i = pstm.executeUpdate();

                    //5如果是查詢的話,處理結(jié)果集

             } catch (Exception e) {

                    e.printStackTrace();

             }

             finally{

                    //6釋放資源

                    JDBC_Util.release(null, pstm, conn);

             }

       }

       /**

        * 向account表查詢一條記錄

        * @param account

        * @return

        */

       public Account query(Account account){

             Connection conn = null;

             PreparedStatement pstm =null;

             ResultSet rs = null;

             try {

                    conn = JDBC_Util.getConnection();

                    //3準(zhǔn)備sql

                    String sql = "select * from account where " + "card_id = ? and password = ?";

                    //4創(chuàng)建Statement發(fā)送語句

                    pstm = conn.prepareStatement(sql);

                    pstm.setString(1, account.getCardId());

                    pstm.setString(2, account.getPassword());

                    rs = pstm.executeQuery();

                    //5處理結(jié)果集

                    while (rs.next()) {

                           account.setCardId(rs.getString("card_id"));

                           account.setPassword(rs.getString("password"));

                           account.setBalance(rs.getDouble("balance"));

                           account.setPhone(rs.getString("phone"));

                    }

             } catch (Exception e) {

                    e.getStackTrace();

             }

             finally{

                    //6釋放資源

                    JDBC_Util.release(rs, pstm, conn);

             }

             return account;

       }

}

細(xì)心地讀者會發(fā)現(xiàn)在代碼里原本創(chuàng)建連接和釋放資源的位置都變成了方法調(diào)用。

 conn = JDBC_Util.getConnection();

 JDBC_Util.release(rs, pstm, conn);

4.0版本通過工具類調(diào)用的方式進(jìn)一步精簡了代碼,那么4.0版本還有沒有缺陷了呢。

=======================華麗麗的分割線============================

對于JDBC_Util.java來說,還有許多不足。

1:

             conn = DriverManager.getConnection(

                           "jdbc:mysql://localhost:3306/zdx?serverTimezone=UTC",

                           "root",

                           "root");

比如創(chuàng)建連接的方式,是在代碼里寫死的用戶名和密碼,以及連接url,而java文件運(yùn)行的時候,會編譯成class文件

也就是說,JDBC_Util最終會是JDBC_Util.class文件,那么一旦數(shù)據(jù)庫改變密碼,用戶名,或改換數(shù)據(jù)庫,

整個文件還需要重新編譯執(zhí)行。對此,我們可以把經(jīng)常變動的代碼放到properties配置文件里去。

2:每次調(diào)用獲得連接的方法都需要加載驅(qū)動,

Class.forName("com.mysql.jdbc.Driver");

調(diào)用10次則加載10次,大大浪費(fèi)了JVM內(nèi)存,其實(shí)對于加載驅(qū)動只需要加載一次,我們可以嘗試把加載驅(qū)動放到

靜態(tài)代碼塊里。靜態(tài)代碼塊在類加載時執(zhí)行,只執(zhí)行一次。

properties配置文件簡介及使用:

1: InputStream is = new FileInputStream("配置文件路徑");

     BufferedReader br = bew BufferedReader(new InputStramReader(is));

     String as = br.readLine();

2:properties 是Map的實(shí)現(xiàn)類:

     1:獲得配置文件的輸出流。

     2:調(diào)用load(is);加載配置文件里的信息至Properties對象中。

下面的JDBC5.0版本是對JDBC_Util的改進(jìn)。采用了靜態(tài)代碼塊加讀取配置文件的優(yōu)化方案。

包括test.java,JDBC_Util2.java,JDBC_Dao2.java,properties文件,共四個。

JDBC_Uril2.java

public class JDBC_Util2 {

       private static final Properties prop = new Properties();

       static{

             InputStream is = null;

             try {

                    is = JDBC_Util2.class.getResourceAsStream("jdbc.properties");

                    prop.load(is);

                    String driverName = prop.getProperty("driverName");

                    Class.forName(driverName);

             } catch (Exception e) {

                    e.printStackTrace();

             }

       }

       /**

        * @return 返回鏈接

        */

       public static Connection getConnection() throws Exception {

             Connection conn = null;

             String user = prop.getProperty("user");

             String password = prop.getProperty("password");

             String url = prop.getProperty("url");

             conn = DriverManager.getConnection(url,user,password);

             return conn;

       }

       /**

        * 釋放資源

        */

       public static void release(ResultSet rs,

                    Statement stm,

                    Connection conn){

             try {

                    if(rs 當(dāng)前題目:由淺到深學(xué)習(xí)JDBC二
文章路徑:http://muchs.cn/article2/jcjgoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化靜態(tài)網(wǎng)站、虛擬主機(jī)、品牌網(wǎng)站設(shè)計(jì)、建站公司、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司