欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JDBC使用小結(jié)

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

1.首先說(shuō)明什么是JDBC

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

2.JDBC的實(shí)質(zhì)

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

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

DriverManager :驅(qū)動(dòng)管理

Connection、
DatabaseMetaData :連接接口

Statement、
PreparedStatement
CallableStatement: 語(yǔ)句對(duì)象接口

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

3.JDBC的工作原理

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

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

2)創(chuàng)建語(yǔ)句對(duì)象

3)執(zhí)行SQL語(yǔ)句

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

5)關(guān)閉連接

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

1)加載驅(qū)動(dòng)

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

對(duì)于如何獲得到這個(gè)驅(qū)動(dòng),我所知道的方法是:展開(kāi)JDBC的jar包,如我使用的是ojdbc6.jar,在里面找到oracle.jdbc.driver,在里面再找到OracleDriver然后鼠標(biāo)右鍵點(diǎn)qualitycopy,粘貼到引號(hào)之中即可,如:Class.forName("oracle.jdbc.driver.OracleDriver");

2)創(chuàng)建連接

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

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

3)創(chuàng)建語(yǔ)句對(duì)象

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

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

調(diào)用executeUpdate方法將sql語(yǔ)句傳入其中即可執(zhí)行所寫(xiě)的sql語(yǔ)句,這里需要注意的是,executeUpdate方法能執(zhí)行的sql種類(lèi)為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ù)這個(gè)受影響的行數(shù)來(lái)判斷是否操作成功

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

5)最后關(guān)閉連接

如:conn.close();

列舉一整體代碼,包括注釋?zhuān)?/p>

package jdbc_day01;
import java.sql.*;
/**
 * 演示JDBC的操作步驟
 * 1、加載驅(qū)動(dòng)程序
 * 2、創(chuàng)建連接
 * 3、創(chuàng)建語(yǔ)句對(duì)象
 * 4、發(fā)送SQL語(yǔ)句
 * 5、如果發(fā)送的是select語(yǔ)句,處理結(jié)果集
 * 6、關(guān)閉連接
 * @author jiawenzhe
 *
 */
public class JDBCDome01 {
  public static void main(String[] args) throws SQLException {
    //需求:創(chuàng)建一個(gè)員工,員工號(hào),員工名,工資,部門(mén)號(hào)
    //1、
    Connection conn=null;
    try {
      Class.forName("oracle.jdbc.driver.OracleDriver");
      System.out.println("驅(qū)動(dòng)加載成功");
      //2、
       conn=
  DriverManager.getConnection("jdbc:oracle:thin:@172.16.3.8:1521:orcl","jsd1601","jsd1601");
      System.out.println(conn.getClass().getName());
      //3、
      //Statment 語(yǔ)句對(duì)象。發(fā)送并執(zhí)行SQL語(yǔ)句
      /*
       * int excuteUpdate(String sql);
       * 發(fā)送insert,update,delete語(yǔ)句
       * 返回值int表示影響數(shù)據(jù)庫(kù)表的行數(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ū)動(dòng)錯(cuò)誤",e);
    }finally{
      //關(guān)閉連接
      if(conn!=null){
        try {
          conn.close();
        } catch (SQLException e) {
          e.printStackTrace();
        }
      }
    }

  }
}

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

加載驅(qū)動(dòng)類(lèi):

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

1.封裝方法的引出

學(xué)了一段時(shí)間的Java給我感觸最深的就是,當(dāng)前寫(xiě)某一系列的代碼的時(shí)候,如果出現(xiàn)了代碼的復(fù)用,肯定會(huì)選擇一種方法對(duì)代碼進(jìn)行一定程度的封裝,從封裝一個(gè)方法到封裝一個(gè)類(lèi),之前有提到的使用JDBC進(jìn)行數(shù)據(jù)庫(kù)的操作(增,刪,改,因?yàn)椴樵?xún)涉及到對(duì)結(jié)果集的操作,將單獨(dú)聲明)分為四個(gè)過(guò)程:

1)加載驅(qū)動(dòng)

2)創(chuàng)建連接

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

4)關(guān)閉連接

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

2.三個(gè)版本的封裝

1.版本1
我在學(xué)習(xí)的時(shí)候是逐步對(duì)這些類(lèi)進(jìn)行一個(gè)漸進(jìn)性的封裝,逐步完善的,因?yàn)槿绻苯犹岢鼋K極版的封裝,對(duì)于初學(xué)者很難接受,下面我將闡述第一種也就是最簡(jiǎn)單的封裝方法:

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

  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)建連接的時(shí)候我可以直接拿到變量的名字去代替很長(zhǎng)的字符串,而加載驅(qū)動(dòng)時(shí)地方法Class.forName,我們將它聲明在靜態(tài)塊中,因?yàn)榧虞d數(shù)據(jù)的同時(shí),加載了驅(qū)動(dòng)

如下面所示:

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

對(duì)于創(chuàng)建連接,就是調(diào)用DriverManager的getConnection方法,并將對(duì)應(yīng)的用戶(hù)名,密碼放入其中,我們將這個(gè)方法直接放到我自己定義的方法中,然后直接調(diào)用我的方法便可以創(chuàng)建連接,需要注意的是,方法的返回值是Connection這個(gè)對(duì)象,很好理解,因?yàn)榫褪且玫竭@個(gè)連接類(lèi)型的對(duì)象,如下面所示:

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

然后是創(chuàng)建語(yǔ)句對(duì)象,發(fā)送SQL,當(dāng)然SQL是這里面唯一特殊的地方,因?yàn)镾QL要做的事千差萬(wàn)別,所以這個(gè)步驟就不用封裝了。

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

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

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

package jbbc_day01;

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

/**
 * 用來(lái)管理連接
 * @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ū)動(dòng)
  static{
    try {
      Class.forName(driverclass);
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
      throw new RuntimeException("加載驅(qū)動(dòng)錯(cuò)誤",e);  
    }
  }
  //2、創(chuàng)建連接
  /*
   * 如何定義一個(gè)能夠創(chuàng)建連接的方法
   * 返回值類(lèi)型:是否有運(yùn)算結(jié)果,如果有,結(jié)果的類(lèi)型即為返回值類(lèi)型
   * 參數(shù)列表:
   * 方法功能中是否有不確定的數(shù)據(jù)參與運(yùn)算,如果有,即為參數(shù)
   */
   public static  Connection getConnection() throws SQLException{
    Connection conn=
    DriverManager.getConnection(url,user,password);
    return conn;
  }
  //3、關(guān)閉連接
   public static void close(Connection conn){
     if(conn!=null){
       try {
        conn.close();
      } catch (SQLException e) {
        e.printStackTrace();
        throw new RuntimeException("關(guān)閉連接錯(cuò)誤",e);
      }
     }
   }
   
}

這樣一個(gè)封裝就好了,然后在進(jìn)行SQL操作的時(shí)候直接調(diào)用這個(gè)封裝類(lèi)就可以了,而你只需要寫(xiě)的就是創(chuàng)建你的語(yǔ)句對(duì)象,發(fā)送你的SQL語(yǔ)句即可

2.版本2

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

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

首先我先把配置文件示例出來(lái),其實(shí)不用解釋?zhuān)荒苛巳唬缦滤荆?/p>

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

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

這部分的示例如下:

  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ū)動(dòng)錯(cuò)誤",e);  
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

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

整體代碼如下:

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;

/**
 * 用來(lái)管理連接
 * 數(shù)據(jù)庫(kù)連接信息,保存在屬性文件中
 * @author jiawenzhe
 *
 */
public class DBUtil2 {
  private static String driverclass;
  private static String url;
  private static String user;
  private static String password;
  //1、加載驅(qū)動(dòng)
  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ū)動(dòng)錯(cuò)誤",e);  
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
  //2、創(chuàng)建連接
  /*
   * 如何定義一個(gè)能夠創(chuàng)建連接的方法
   * 返回值類(lèi)型:是否有運(yùn)算結(jié)果,如果有,結(jié)果的類(lèi)型即為返回值類(lèi)型
   * 參數(shù)列表:
   * 方法功能中是否有不確定的數(shù)據(jù)參與運(yùn)算,如果有,即為參數(shù)
   */
   public static  Connection getConnection() throws SQLException{
    Connection conn=
    DriverManager.getConnection(url,user,password);
    return conn;
  }
  //3、關(guān)閉連接
   public static void close(Connection conn){
     if(conn!=null){
       try {
        conn.close();
      } catch (SQLException e) {
        e.printStackTrace();
        throw new RuntimeException("關(guān)閉連接錯(cuò)誤",e);
      }
     }
   }
   
}

相關(guān)文章

  • java中常用XML解析器的使用

    java中常用XML解析器的使用

    這篇文章主要介紹了java中常用XML解析器的使用的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • SpringBoot如何獲取Get請(qǐng)求參數(shù)詳解

    SpringBoot如何獲取Get請(qǐng)求參數(shù)詳解

    SpringBoot為我們封裝了許多簡(jiǎn)便的獲取請(qǐng)求參數(shù)的方法,下面這篇文章主要給大家介紹了關(guān)于SpringBoot如何獲取Get請(qǐng)求參數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Spring中的Devtools源碼解析

    Spring中的Devtools源碼解析

    這篇文章主要介紹了Spring中的Devtools源碼解析,Spring中的Devtools是一個(gè)開(kāi)發(fā)工具,旨在提高開(kāi)發(fā)人員的生產(chǎn)力和開(kāi)發(fā)體驗(yàn),它提供了一系列功能,包括自動(dòng)重啟、熱部署、遠(yuǎn)程調(diào)試等,使開(kāi)發(fā)人員能夠更快速地進(jìn)行代碼修改和調(diào)試,需要的朋友可以參考下
    2023-10-10
  • Java中線程狀態(tài)+線程安全問(wèn)題+synchronized的用法詳解

    Java中線程狀態(tài)+線程安全問(wèn)題+synchronized的用法詳解

    這篇文章主要介紹了Java中線程狀態(tài)+線程安全問(wèn)題+synchronized的用法詳解,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • 一篇文章帶你了解SpringMVC數(shù)據(jù)綁定

    一篇文章帶你了解SpringMVC數(shù)據(jù)綁定

    這篇文章主要給大家介紹了關(guān)于如何通過(guò)一篇文章弄懂Spring MVC的參數(shù)綁定,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • java?poi?讀取單元格null或者空字符串方式

    java?poi?讀取單元格null或者空字符串方式

    這篇文章主要介紹了java?poi?讀取單元格null或者空字符串方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • springboot war包部署過(guò)程詳解

    springboot war包部署過(guò)程詳解

    這篇文章主要為大家介紹了springboot war包部署過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Java?嵌入數(shù)據(jù)引擎從?SQLite?到?SPL詳解

    Java?嵌入數(shù)據(jù)引擎從?SQLite?到?SPL詳解

    這篇文章主要介紹了Java?嵌入數(shù)據(jù)引擎:從?SQLite?到?SPL,SQLite架構(gòu)簡(jiǎn)單,其核心雖然是C語(yǔ)言開(kāi)發(fā)的,但封裝得比較好,對(duì)外呈現(xiàn)為一個(gè)小巧的Jar包,能方便地集成在Java應(yīng)用中,本文給大家介紹的非常詳細(xì),需要的朋友參考下
    2022-07-07
  • java如何讀取文件目錄返回樹(shù)形結(jié)構(gòu)

    java如何讀取文件目錄返回樹(shù)形結(jié)構(gòu)

    這篇文章主要介紹了java如何讀取文件目錄返回樹(shù)形結(jié)構(gòu)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 談?wù)勗贘ava發(fā)送郵件中遇到的的問(wèn)題

    談?wù)勗贘ava發(fā)送郵件中遇到的的問(wèn)題

    本文介紹了在利用Java發(fā)送郵件過(guò)程中遇到的的兩個(gè)問(wèn)題,以及如何解決這兩個(gè)問(wèn)題。如果大家也遇到了這些問(wèn)題,可以來(lái)參考借鑒。
    2016-08-08

最新評(píng)論