原生JDBC和工具類的基本實現

2020-09-19 16:01:08

工具:


JDBC是Java存取資料庫的標準規範,可以為不同的關係型資料庫提供統⼀存取,它由一組用Java編寫的介面和類組成。
JDBC需要 連線驅動,驅動是兩個裝置要進行通訊,滿足一定通訊資料格式,資料格式由裝置提供商規定,裝置提供商為裝置提供驅動軟體,通過軟體可以與該裝置進行通訊。
今天我們使用的是mysql的驅動 mysql-connector-java-8.0.20.jar(適配MySQL8.0版本),如果是之前版本的MySQL建議使用應用次數較多的 mysql-connector-java-5.1.38.jar
在這裡插入圖片描述

JDBC核心規範:

  • DriverManager:⽤於註冊驅動
  • Connection: 表示與資料庫建立的連線
  • Statement: 運算元據庫sql語句的物件
  • ResultSet: 結果集或⼀張虛擬表

JDBC原理

Java提供存取資料庫規範稱為JDBC,而生產廠商提供規範的實現類稱為驅動。JDBC是介面,驅動是介面的實現,沒有驅動將無法完成資料庫連線,從而不能運算元據庫!每個資料庫廠商都需要提供自己的驅動,用來連線自己公司的資料庫,也就是說驅動一般都由資料庫生成廠商提供(也就是在我們上邊匯入的jar包當中)。

開發步驟

  1. 註冊驅動
  2. 獲得連線
  3. 獲得執行sql語句的物件
  4. 執行sql語句,並返回結果
  5. 處理結果
  6. 釋放資源

JDBC入門案例

首先熟悉一下JDBC的helloworld,

  1. 準備MySQL資料:
#建立分類表
create table category(
cid int PRIMARY KEY AUTO_INCREMENT,
cname varchar(100)
);
#初始化資料
insert into category (cname) values('家電');
insert into category (cname) values('服飾');
insert into category (cname) values('化妝品');

建立一個簡單的表在這裡插入圖片描述
2. 匯入驅動jar包
在IDEA專案下建立lib目錄在這裡插入圖片描述
在MVN下好jar包並複製,雙擊新建的lib目錄ctrl+v,jar包就儲存到該目錄下,之後右鍵匯入的jar包,選擇新增到庫…Add as Library...,就正式新增完畢了
MySQL8.0連線jdbc方法

package JDBCTest;

import org.junit.Test;

import java.sql.*;

public class JDBCDemo {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        @Test
        /**
         * 1.註冊驅動, 就是把 Driver.class⽂件載入到記憶體
         * mysql8.0之前的版本需要連線的驅動是com.mysql.jdbc.Driver
         */
        Class.forName("com.mysql.cj.jdbc.Driver");

        /**
         * 2.獲得連線
         * 引數 url : 需要連線資料庫的地址 jdbc:mysql://IP地址:端⼝號/要連線的資料庫名稱
         * 引數 user : 連線資料庫 使⽤的⽤戶名
         * 引數 password: 連線資料庫 使⽤的密碼
         */
        String url = "jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatments=true";
        Connection connection = DriverManager.getConnection(url, "root", "root");

        /**
         * 3.獲取執⾏sql語句的物件
         */
        Statement statement = connection.createStatement();

        /**
         *  4.執行sql語句並返回結果
         */
        String sql1 = "select * from category";
        ResultSet resultSet = statement.executeQuery(sql1);

        /**
         *  5.處理結果
         */
        while (resultSet.next()) {
            int cid = resultSet.getInt("cid");
            String cname = resultSet.getString("cname");
            System.out.println("cid = " + cid + ", cname = " + cname);
        }

        /**
         * 6.釋放資源
         */
        resultSet.close();
        statement.close();
        connection.close();
    }
}

在這裡插入圖片描述


JDBC的API詳解

  1. 註冊驅動
    有兩種方法:
    DriverManager.registerDriver(new com.mysql.jdbc.Driver());
    Class.forName("com.mysql.jdbc.Driver");
    其中第一種辦法不被推薦使用,因為驅動會被註冊兩次,並且會強烈依賴資料庫的驅動jar,通常我們在做開發的時候用的都是第二種方式來註冊驅動
  2. 獲得連結
    static Connection getConnection(String url, String user, String password) :試圖建立到給定資料庫 URL 的連線

使用引數說明:

  • url 需要連線資料庫的位置(網址)
  • user使用者名稱 (要區別於資料庫表名)
  • password 密碼

eg:getConnection("jdbc:mysql://localhost:3306/database", "root", "root");

URL是SUN公司和資料庫廠商的一個協定

jdbc:mysql://localhost:3306/database

協定子協定 IP:埠號資料庫

  • mysql資料庫:
  • jdbc:mysql://localhost:3306/database 或者
  • jdbc:mysql:///database(預設本機連線)
  • oracle資料庫:
  • jdbc:oracle:thin:@localhost:1521:sid
  1. java.sql.Connection介面:一個連線
    介面的實現在資料庫驅動中,所有與資料庫互動都是基於連線物件的。

  2. java.sql.Statement介面: 操作sql語句,並返回相應結果

String sql = "某SQL語句";
獲取Statement語句執⾏平臺:Statement stmt =con.createStatement();

常用方法:
int executeUpdate(String sql); --執行insert update delete語句.
ResultSet executeQuery(String sql); --執行select語句.
boolean execute(String sql); --僅當執行select並且有結果時才返回true,執行其他的語句返回false.

  1. 處理結果集(注:執行insert、update、delete無需處理)
    ResultSet實際上就是一張二維的表格,我們可以呼叫其 boolean next() 方法指向某行記錄,當第一次呼叫 next() 方法時,便指向第一行記錄的位置,這時就可以使用ResultSet提供的 getXXX(int col) 方法來獲取指定列的資料:(與陣列索引從0開始不同,這裡索引從1開始)
rs.next();//指向第⼀⾏
rs.getInt(1);//獲取第⼀⾏第⼀列的資料

常用方法:

  • Object getObject(int index) / Object getObject(String name) 獲得任意物件
  • String getString(int index) / String getString(String name) 獲得字串
  • int getInt(int index) / int getInt(String name) 獲得整型
  • double getDouble(int index) / double getDouble(String name) 獲得雙精度浮點型
  1. 釋放資源
    與IO流⼀樣,使用後的東西都需要關閉!關閉的順序是先得到的後關閉,後得到的先關閉。
rs.close();
stmt.close();
con.close();

JDBC增刪改查操作

  1. 增:
    @Test
    public void testJDBC2() throws SQLException, ClassNotFoundException {
/**
 * JDBC 完成 記錄的插⼊
 * 1.註冊驅動
 * 2.獲得連線
 * 3.獲得執⾏sql語句的物件
 * 4.執⾏sql語句, 並返回結果
 * 5.處理結果
 * 6.釋放資源
 */
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/mydb";
        Connection conn = DriverManager.getConnection(url, "root",
                "root");
        Statement stat = conn.createStatement();
        String sql = "insert into category(cname) values('測試')";
        int result = stat.executeUpdate(sql);
        System.out.println("result = " + result);
        stat.close();
        conn.close();
    }
  1. 刪:
@Test
public void testJDBC4() throws SQLException, ClassNotFoundException {
/**
* JDBC 完成 記錄的刪除
* 1.註冊驅動
* 2.獲得連線
* 3.獲得執⾏sql語句的物件
* 4.執⾏sql語句, 並返回結果
* 5.處理結果
* 6.釋放資源
*/
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mydb";
Connection conn = DriverManager.getConnection(url, "root",
"root");
Statement stat = conn.createStatement();
String sql = "delete from category where cid=4";
int result = stat.executeUpdate(sql);
System.out.println("result = " + result);
stat.close();
conn.close();
}
  1. 改:
    @Test
    public void testJDBC3() throws SQLException, ClassNotFoundException {
/**
 * JDBC 完成 記錄的更新
 * 1.註冊驅動
 * 2.獲得連線
 * 3.獲得執⾏sql語句的物件
 * 4.執⾏sql語句, 並返回結果
 * 5.處理結果
 * 6.釋放資源
 */
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/mydb";
        Connection conn = DriverManager.getConnection(url, "root",
                "root");
        Statement stat = conn.createStatement();
        String sql = "update category set cname='測試2' where cid=4";
        int result = stat.executeUpdate(sql);
        System.out.println("result = " + result);
        stat.close();
        conn.close();
    }
  1. 查:
    @Test
    public void testJDBC5() throws SQLException, ClassNotFoundException {
/**
 * JDBC 完成 記錄的刪除
 * 1.註冊驅動
 * 2.獲得連線
 * 3.獲得執⾏sql語句的物件
 * 4.執⾏sql語句, 並返回結果
 * 5.處理結果
 * 6.釋放資源
 */
// 通過id 查詢資料
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/mydb";
        Connection conn = DriverManager.getConnection(url, "root",
                "root");
        Statement stat = conn.createStatement();
        String sql = "select * from category where cid = 3";
        ResultSet rs = stat.executeQuery(sql);
        if (rs.next()) {
            int cid = rs.getInt("cid");
            String cname = rs.getString("cname");
            System.out.println("cid = " + cid + ",cname = " +cname);
        } else {
            System.out.println("資料沒有查到");
        }
        rs.close();
        stat.close();
        conn.close();
    }

JDBC工具類

為啥要用到工具類呢?
JDBC操作中有大量的重複性編碼,為了減少不必要的工作量,引入了工具類,獲得資料庫連線操作,將在以後的增刪改查所有功能中都存在,可以封裝工具類JDBCUtils。提供獲取連線物件的方法,從而達到程式碼的重複利用。
該工具類提供方法: public static Connection getConnection()

  1. 右鍵src,新建一個檔案,隨便命名
    在這裡插入圖片描述
    在這裡插入圖片描述

MySQL8.0使用者

jdbc.driver=com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatments=true
jdbc.user=root
jdbc.password=root

MySQL8.0以前版本的使用者

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb
jdbc.user=root
jdbc.password=root
  1. 建立JDBC工具類
public class JDBCUtils2 {
    private static String driver;
    private static String url;
    private static String user;
    private static String password;
    static {
    try{
//使⽤類載入器, 讀取設定⽂件
        InputStream is=
        JDBCUtils2.class.getClassLoader().getResourceAsStream("jdbc.properties");
        Properties prop=new Properties();
        prop.load(is);
        driver=prop.getProperty("jdbc.driver");
        url=prop.getProperty("jdbc.url");
        user=prop.getProperty("jdbc.user");
        password=prop.getProperty("jdbc.password");
//註冊驅動
        Class.forName(driver);
        }catch(IOException e){
        e.printStackTrace();
        }catch(ClassNotFoundException e){
        e.printStackTrace();
        }
        }
/**
 * 返回連線物件 Connection
 */
public static Connection getConnection()throws SQLException{
        Connection conn=DriverManager.getConnection(url,user,password);
        return conn;
        }
/**
 * 釋放資源
 */
public static void close(ResultSet rs,Statement stat,Connection
        conn)throws SQLException{
        if(rs!=null){
        rs.close();
        }
        if(stat!=null){
        stat.close();
        }
//看Connection來⾃哪⾥, 如果Connection是從連線池⾥⾯獲得的, close()⽅法其
        實是歸還;如果Connection是建立的,就是銷燬
        if(conn!=null){
        conn.close();
       }
    }
 }
  1. 使用JDBC工具類 完成查詢
@Test
public void testJDBC6() throws SQLException {
/**
* 使⽤JDBC⼯具類, 完成查詢所有分類
* 1.通過JDBC⼯具類, 獲得連線
* 2.獲得執⾏sql語句的物件
* 3.執⾏sql語句, 並返回結果
* 4.處理結果
* 5.釋放資源
*/
Connection conn = JDBCUtils2.getConnection();
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery("select * from category");
while (rs.next()) {
int cid = rs.getInt("cid");
String cname = rs.getString("cname");
System.out.println("cid = " + cid + ",cname = " + cname);
}
JDBCUtils2.close(rs, stat, conn);
}