最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JDBC使用小結(jié)

 更新時間:2016年05月08日 10:55:35   作者:暮紫白  
JDBC是一個Java應用程序接口,作用是封裝了對數(shù)據(jù)庫的各種操作。JDBC由類和接口組成,使用Java開發(fā)數(shù)據(jù)庫應用都需要4個主要的接口:Driver、Connection、Statement、ResultSet,這些接口定義了使用SQL訪問數(shù)據(jù)庫的一般架構(gòu),下面我們來詳細探討下jdbc的使用。

1.首先說明什么是JDBC

在第一眼看到這個名詞之前,我覺得有必要知道它的英文全稱是什么,Java Database Connectivity,從英文字面上理解就直譯為
可連通的Java數(shù)據(jù)庫,說白了也就是想提供一套中間環(huán)節(jié),去連接Java代碼與數(shù)據(jù)庫,使之可以直接通過操作Java代碼就可以控制數(shù)據(jù)庫。

2.JDBC的實質(zhì)

它是Java訪問數(shù)據(jù)庫的解決方案,希望能過用同樣的方式訪問不同的數(shù)據(jù)庫,以達到實現(xiàn)與具體數(shù)據(jù)庫無關的Java操作界面。
JDBC實質(zhì)上就是就是一套標準化的接口,不同的數(shù)據(jù)庫廠商根據(jù)自己的數(shù)據(jù)庫特點去實現(xiàn)這套接口,實現(xiàn)的具體方法無需我們?nèi)リP心。

JDBC中數(shù)據(jù)庫廠商實現(xiàn)的主要接口如下:

DriverManager :驅(qū)動管理

Connection、
DatabaseMetaData :連接接口

Statement、
PreparedStatement
CallableStatement: 語句對象接口

ResultSet、
ResultSetMetaData: 結(jié)果集接口

3.JDBC的工作原理

程序員調(diào)用的是底層數(shù)據(jù)庫廠商實現(xiàn)的部分,
即:1)通過Connection 接口實現(xiàn)第一步的連接
2)通過Statement結(jié)果傳送sql語句
3)數(shù)據(jù)庫返回結(jié)果保存到ResultSet結(jié)果集合接口中
主要流程可歸納為:

1)加載驅(qū)動,創(chuàng)建連接

2)創(chuàng)建語句對象

3)執(zhí)行SQL語句

4)發(fā)回結(jié)果集

5)關閉連接

下面我以我學的oracle數(shù)據(jù)庫配合eclips為例逐步闡述一下如何實現(xiàn)JDBC

1)加載驅(qū)動

使用的方法為:Class.forName(“驅(qū)動”);

對于如何獲得到這個驅(qū)動,我所知道的方法是:展開JDBC的jar包,如我使用的是ojdbc6.jar,在里面找到oracle.jdbc.driver,在里面再找到OracleDriver然后鼠標右鍵點qualitycopy,粘貼到引號之中即可,如:Class.forName("oracle.jdbc.driver.OracleDriver");

2)創(chuàng)建連接

使用的方法為: conn=DriverManager.getConnection(“jdbc:oracle:thin:@IP地址:1521:orcl","數(shù)據(jù)庫賬號","數(shù)據(jù)庫密碼”);

如:conn=DriverManager.getConnection("jdbc:oracle:thin:@172.16.3.8:1521:orcl","jsd1601","jsd1601");

3)創(chuàng)建語句對象

使用的方法為:Statement stmt=conn.createStatement();

需要注意的是,使用的是第二步上面創(chuàng)建出來的連接去調(diào)用方法

調(diào)用executeUpdate方法將sql語句傳入其中即可執(zhí)行所寫的sql語句,這里需要注意的是,executeUpdate方法能執(zhí)行的sql種類為insert,update,delete

如:      Statement stmt=conn.createStatement();
            String sql="insert into emp_jiawenzhe(empno,ename,sal,deptno) values(1000,'賈文哲',1500,10)";
            int i=stmt.executeUpdate(sql);

這里面的返回值i就是受影響的行數(shù),我們可以根據(jù)這個受影響的行數(shù)來判斷是否操作成功

4)而對于返回的結(jié)果集主要是指進行select操作(這里暫不提)

5)最后關閉連接

如:conn.close();

列舉一整體代碼,包括注釋:

package jdbc_day01;
import java.sql.*;
/**
 * 演示JDBC的操作步驟
 * 1、加載驅(qū)動程序
 * 2、創(chuàng)建連接
 * 3、創(chuàng)建語句對象
 * 4、發(fā)送SQL語句
 * 5、如果發(fā)送的是select語句,處理結(jié)果集
 * 6、關閉連接
 * @author jiawenzhe
 *
 */
public class JDBCDome01 {
  public static void main(String[] args) throws SQLException {
    //需求:創(chuàng)建一個員工,員工號,員工名,工資,部門號
    //1、
    Connection conn=null;
    try {
      Class.forName("oracle.jdbc.driver.OracleDriver");
      System.out.println("驅(qū)動加載成功");
      //2、
       conn=
  DriverManager.getConnection("jdbc:oracle:thin:@172.16.3.8:1521:orcl","jsd1601","jsd1601");
      System.out.println(conn.getClass().getName());
      //3、
      //Statment 語句對象。發(fā)送并執(zhí)行SQL語句
      /*
       * int excuteUpdate(String sql);
       * 發(fā)送insert,update,delete語句
       * 返回值int表示影響數(shù)據(jù)庫表的行數(shù)
       */
      Statement stmt=conn.createStatement();
      String sql="insert into emp_jiawenzhe(empno,ename,sal,deptno) "
          + "values(1000,'王小二',1500,10)";
      int i=stmt.executeUpdate(sql);
      if(i>0){
        System.out.println("保存成功!");
      }
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
      //1、記錄日志
      //2、通知調(diào)用者
      throw new RuntimeException("加載驅(qū)動錯誤",e);
    }finally{
      //關閉連接
      if(conn!=null){
        try {
          conn.close();
        } catch (SQLException e) {
          e.printStackTrace();
        }
      }
    }

  }
}

注:oracle數(shù)據(jù)庫可以使用的jar包:ojdbc14.jar/ojdbc6.jar(oracle12c用這個)
mysql數(shù)據(jù)庫可以使用的jar包:mysql-connector-java-5.0.4-bin.jar

加載驅(qū)動類:

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

1.封裝方法的引出

學了一段時間的Java給我感觸最深的就是,當前寫某一系列的代碼的時候,如果出現(xiàn)了代碼的復用,肯定會選擇一種方法對代碼進行一定程度的封裝,從封裝一個方法到封裝一個類,之前有提到的使用JDBC進行數(shù)據(jù)庫的操作(增,刪,改,因為查詢涉及到對結(jié)果集的操作,將單獨聲明)分為四個過程:

1)加載驅(qū)動

2)創(chuàng)建連接

3)創(chuàng)建語句對象,發(fā)送SQL

4)關閉連接

也就是說我們在進行任何對數(shù)據(jù)庫操作的時候,都要進行上述步驟,這便出現(xiàn)了代碼的冗余,于是便提出了封裝這些共性的步驟到一個類中,使其能成為一種工具類,為我所用

2.三個版本的封裝

1.版本1
我在學習的時候是逐步對這些類進行一個漸進性的封裝,逐步完善的,因為如果直接提出終極版的封裝,對于初學者很難接受,下面我將闡述第一種也就是最簡單的封裝方法:

你在前面會發(fā)現(xiàn),無論你想如何操作數(shù)據(jù)庫,加載驅(qū)動都是必不可少的,而加載驅(qū)動里面主要就是聲明,驅(qū)動的名字,IP地址,端口號,數(shù)據(jù)庫賬戶名,密碼等等,而這些的實質(zhì)就是字符串所以我將這些字符串單獨定義出來,如下面所示:

  private static String driverclass="oracle.jdbc.driver.OracleDriver";
  private static String url="jdbc:oracle:thin:losthost:1521:orcl";
  private static String user="system";
  private static String password="123";

這樣在創(chuàng)建連接的時候我可以直接拿到變量的名字去代替很長的字符串,而加載驅(qū)動時地方法Class.forName,我們將它聲明在靜態(tài)塊中,因為加載數(shù)據(jù)的同時,加載了驅(qū)動

如下面所示:

  static{
    try {
      Class.forName(driverclass);
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
      throw new RuntimeException("加載驅(qū)動錯誤",e);  
    }
  }

對于創(chuàng)建連接,就是調(diào)用DriverManager的getConnection方法,并將對應的用戶名,密碼放入其中,我們將這個方法直接放到我自己定義的方法中,然后直接調(diào)用我的方法便可以創(chuàng)建連接,需要注意的是,方法的返回值是Connection這個對象,很好理解,因為就是要拿到這個連接類型的對象,如下面所示:

   public static  Connection getConnection() throws SQLException{
    Connection conn=
    DriverManager.getConnection(url,user,password);
    return conn;
  }

然后是創(chuàng)建語句對象,發(fā)送SQL,當然SQL是這里面唯一特殊的地方,因為SQL要做的事千差萬別,所以這個步驟就不用封裝了。

最后是關閉連接,就是調(diào)用了close()這個方法,如下面所示

   public static void close(Connection conn){
     if(conn!=null){
       try {
        conn.close();
      } catch (SQLException e) {
        e.printStackTrace();
        throw new RuntimeException("關閉連接錯誤",e);
      }
     }
   }

整體的第一版本的封裝如下面所示:

package jbbc_day01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * 用來管理連接
 * @author jiawenzhe
 *
 */
public class DBUtil {
  private static String driverclass="oracle.jdbc.driver.OracleDriver";
  private static String url="jdbc:oracle:thin:losthost:1521:orcl";
  private static String user="system";
  private static String password="123";
  //1、加載驅(qū)動
  static{
    try {
      Class.forName(driverclass);
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
      throw new RuntimeException("加載驅(qū)動錯誤",e);  
    }
  }
  //2、創(chuàng)建連接
  /*
   * 如何定義一個能夠創(chuàng)建連接的方法
   * 返回值類型:是否有運算結(jié)果,如果有,結(jié)果的類型即為返回值類型
   * 參數(shù)列表:
   * 方法功能中是否有不確定的數(shù)據(jù)參與運算,如果有,即為參數(shù)
   */
   public static  Connection getConnection() throws SQLException{
    Connection conn=
    DriverManager.getConnection(url,user,password);
    return conn;
  }
  //3、關閉連接
   public static void close(Connection conn){
     if(conn!=null){
       try {
        conn.close();
      } catch (SQLException e) {
        e.printStackTrace();
        throw new RuntimeException("關閉連接錯誤",e);
      }
     }
   }
   
}

這樣一個封裝就好了,然后在進行SQL操作的時候直接調(diào)用這個封裝類就可以了,而你只需要寫的就是創(chuàng)建你的語句對象,發(fā)送你的SQL語句即可

2.版本2

其實版本2與版本一很類似,就是為了去彌補版本1的一個不足之處,就是,當你更換數(shù)據(jù)庫的時候,不同數(shù)據(jù)庫的賬號密碼是不一樣的,這就要對賬號密碼和IP地址進行修改,我之前將這些以字符串的形式封裝在了工具類之中,那就意味著我們每次更換數(shù)據(jù)庫必須對工具類進行修改,這樣是很不妥當?shù)模谑翘岢隽艘环N改進辦法就是將這些連接數(shù)據(jù)放到一個配置文件之中,工具類去讀取這個配置文件,我們在修改的時候直接去修改這個配置文件就可以了

在介紹這個版本之前,我前引出一個新類就是Properties,他就是一個能讀取文件,并以流的形式去讀取配置文件內(nèi)容然后返回給工具類的

首先我先把配置文件示例出來,其實不用解釋,一目了然,如下所示:

jdbc.driverclass=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:localhost:orcl
jdbc.user=system
jdbc.password=123

前面是鍵,后面是值,前面的鍵值是我們自己定義的,就像定義變量名字一樣,后面的值就是我們數(shù)據(jù)庫的實際情況,這里我們需要特別注意的是,這個配置文件的后綴名一定要以.properties結(jié)尾,因為這樣Properties這個類才能讀取的到。

這部分的示例如下:

  static{
    try {
      //加載屬性文件數(shù)據(jù)
      Properties pop=new Properties();
      pop.load(DBUtil2.class.getClassLoader().getResourceAsStream("db.properties"));
       url=pop.getProperty("jdbc.url");
       driverclass=pop.getProperty("jdbc.driverclass");
       user=pop.getProperty("jdbc.user");
       password=pop.getProperty("jdbc.password");
      Class.forName(driverclass);
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
      throw new RuntimeException("加載驅(qū)動錯誤",e);  
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

load()這個方法就是去讀取也可以認為是加載配置文件的,這個整整一句話記住就行,不用去深究其意義,而getProperty()就是通過鍵獲得到了對應的值,很像鍵值對集合獲取值得形式

整體代碼如下:

package jbbc_day01;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

/**
 * 用來管理連接
 * 數(shù)據(jù)庫連接信息,保存在屬性文件中
 * @author jiawenzhe
 *
 */
public class DBUtil2 {
  private static String driverclass;
  private static String url;
  private static String user;
  private static String password;
  //1、加載驅(qū)動
  static{
    try {
      //加載屬性文件數(shù)據(jù)
      Properties pop=new Properties();
      pop.load(DBUtil2.class.getClassLoader().getResourceAsStream("db.properties"));
       url=pop.getProperty("jdbc.url");
       driverclass=pop.getProperty("jdbc.driverclass");
       user=pop.getProperty("jdbc.user");
       password=pop.getProperty("jdbc.password");
      Class.forName(driverclass);
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
      throw new RuntimeException("加載驅(qū)動錯誤",e);  
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
  //2、創(chuàng)建連接
  /*
   * 如何定義一個能夠創(chuàng)建連接的方法
   * 返回值類型:是否有運算結(jié)果,如果有,結(jié)果的類型即為返回值類型
   * 參數(shù)列表:
   * 方法功能中是否有不確定的數(shù)據(jù)參與運算,如果有,即為參數(shù)
   */
   public static  Connection getConnection() throws SQLException{
    Connection conn=
    DriverManager.getConnection(url,user,password);
    return conn;
  }
  //3、關閉連接
   public static void close(Connection conn){
     if(conn!=null){
       try {
        conn.close();
      } catch (SQLException e) {
        e.printStackTrace();
        throw new RuntimeException("關閉連接錯誤",e);
      }
     }
   }
   
}

相關文章

  • Java程序順序結(jié)構(gòu)中邏輯控制語句詳解流程

    Java程序順序結(jié)構(gòu)中邏輯控制語句詳解流程

    在程序開發(fā)的過程之中一共會存在有三種程序邏輯:順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu),對于之前所編寫的代碼大部分都是順序結(jié)構(gòu)的定義,即:所有的程序?qū)凑斩x的代碼順序依次執(zhí)行
    2021-10-10
  • Java垃圾回收jconsole分析

    Java垃圾回收jconsole分析

    這篇文章主要為大家介紹了Java垃圾回收jconsole分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • java獲取本月日歷表的方法

    java獲取本月日歷表的方法

    這篇文章主要為大家詳細介紹了java獲取本月日歷表的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • spring @Scheduled定時任務注解使用方法及注意事項小結(jié)

    spring @Scheduled定時任務注解使用方法及注意事項小結(jié)

    Spring的@Scheduled注解用于定時任務調(diào)度,默認單線程依次執(zhí)行,可以通過配置多線程調(diào)度器或使用@Async注解實現(xiàn)并行執(zhí)行,常見參數(shù)包括cron、fixedRate、fixedDelay、initialDelay等,本文介紹spring @Scheduled定時任務注解使用方法,感興趣的朋友一起看看吧
    2025-02-02
  • Java中線程中斷的幾種方法小結(jié)

    Java中線程中斷的幾種方法小結(jié)

    在Java中,線程中斷是一種協(xié)作機制,它通過設置線程的中斷標志位來通知線程需要中斷,本文主要介紹了Java中線程中斷的幾種方法小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • java理論基礎函數(shù)式接口特點示例解析

    java理論基礎函數(shù)式接口特點示例解析

    這篇文章主要為大家介紹了java理論基礎函數(shù)式接口特點示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • Maven基礎知識大梳理

    Maven基礎知識大梳理

    這篇文章主要是Maven基礎知識大梳理,Maven主要是用來解決導入java類依賴的jar,編譯java項目主要問題,大家可以讀一讀這篇文章,更深一步的了解Maven
    2021-08-08
  • Java調(diào)用opencv IDEA環(huán)境配置的教程詳解

    Java調(diào)用opencv IDEA環(huán)境配置的教程詳解

    這篇文章主要為大家詳細介紹了Java調(diào)用opencv IDEA環(huán)境配置的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-03-03
  • Java幾種常用JSON庫性能比較詳解

    Java幾種常用JSON庫性能比較詳解

    這篇文章主要介紹了Java幾種常用JSON庫性能比較詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-06-06
  • Springboot通過ObjectMapper配置json序列化詳解

    Springboot通過ObjectMapper配置json序列化詳解

    SpringBoot默認集成Jackson庫,其中ObjectMapper類是核心,用于Java對象與JSON字符串的互轉(zhuǎn),提供配置序列化特性、注冊模塊等方法,在SpringBoot中可以全局配置JSON格式,如日期格式化、將Long轉(zhuǎn)為字符串,還可以配置序列化時的各種規(guī)則,感興趣的可以了解一下
    2024-10-10

最新評論

新沂市| 忻州市| 龙江县| 阳江市| 调兵山市| 竹北市| 张家口市| 长宁区| 鱼台县| 西青区| 大洼县| 阿克| 宾川县| 河源市| 固原市| 龙井市| 克山县| 平阳县| 盐池县| 溧阳市| 鞍山市| 会泽县| 家居| 民和| 康平县| 普兰店市| 射洪县| 铁力市| 宾阳县| 博野县| 吉首市| 耒阳市| 邢台市| 咸宁市| 阿坝| 新民市| 康定县| 福贡县| 察隅县| 博兴县| 乐平市|