Java入門系列-26-JDBC

認識 JDBC

JDBC (Java DataBase Connectivity) 是 Java 數據庫鏈接技術的簡稱,用於鏈接經常使用數據庫。java

Sun 公司提供了 JDBC API ,供程序員調用接口和類,集成在 java.sqljavax.sql 包中。mysql

Sun 公司還提供了 DriverManager 類用來管理各類不一樣的JDBC驅動。程序員

不一樣數據庫廠商提供各自的JDBC驅動,因此咱們想要鏈接數據庫除了要了解 JDBC API 還須要下載各數據庫廠商的驅動 jar 包。sql

JDBC API

JDBC API主要用於與數據庫創建鏈接、執行SQL語句、處理結果,其中核心類和接口以下:數據庫

  • DriverManager:依據數據庫的不一樣,管理JDBC驅動
  • Connection:負責鏈接數據庫並擔任傳送數據的任務
  • Statement:由 Connection 產生、負責執行SQL語句
  • ResultSet:負責保存 Statement 執行後所產生的查詢結果

JDBC 編碼模板

一、與數據庫創建鏈接並獲取鏈接api

Connection connection=DriverManager.getConnection(URL,數據庫用戶名,密碼);

二、發送SQL語句,獲得執行結果編碼

Statement stmt=connection.createStatement();
ResultSet rs=stmt.executeQuery(SQL語句);

三、處理返回結果url

while(rs.next()){
    int a=rs.getInt("a");
    String b=rs.getString("b");
    Date d=rs.getDate("d");
    ……
}

四、釋放資源code

rs.close();
stmt.close();
connection.close();

使用 JDBC 鏈接到 MySQL 數據庫

本例適合已經會使用 MySQL 數據庫的同窗,首先咱們下載 JDBC 的驅動 jar 包。這個網址提供了 MySQL 各類語言鏈接數據庫的驅動 https://www.mysql.com/products/connector/,MySQL Connector / J 8.0與從MySQL 5.5開始的全部MySQL版本兼容。
8.0下載地址
下載完成後解壓,後將jar添加依賴到項目中。server

鏈接到MySQL數據庫

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

public class DemoConnectMySQL {
    public static void main(String[] args) {
        //鏈接MySQL的URL
        String url="jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";
        //MySQL數據庫用戶名
        String user="root";
        //MySQL數據庫的密碼
        String password="1234";
        Connection connection=null;
        try {
            connection=DriverManager.getConnection(url, user, password);
            System.out.println("鏈接成功");
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                connection.close();
                System.out.println("鏈接關閉");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

url指定數據庫的鏈接字符串,格式爲:
jdbc:數據庫://ip或域名:端口號?參數&參數……
這裏的參數 useUnicode=true 使用Unicode字符,characterEncoding=utf8 設置編碼防止中文亂碼,serverTimezone=UTC 設置時區,useSSL=false 不使用SSL

jdbc4.0不須要加載驅動

PreparedStatement 增刪改

PreparedStatement 繼承了 Statement 接口,表示預編譯的 SQL 語句對象,SQL 語句被預編譯並存儲在 PreparedStatement 對象中,可使用此對象屢次高效地執行該語句。(還避免了 SQL 注入的隱患)

先準備好數據庫 books

表 book

字段 類型 屬性
id 整數 主鍵,自增
bName 字符串 非空
price 小數 非空

腳本也準備好了

#建立數據庫
CREATE DATABASE books;
USE books;
#建立表
CREATE TABLE book ( 
    id INT primary key  auto_increment, 
    bName VARCHAR ( 255 ) NOT NULL, 
    price FLOAT NOT NULL 
);

PreparedStatement添加數據

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

public class TestInsert {

    public static void main(String[] args) {
        Connection connection=null;
        PreparedStatement pstmt=null;
        String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";
        String user="root";
        String password="1234";
        try {
            connection=DriverManager.getConnection(url,user,password);
            //sql語句
            String sql="insert into book(bName,price) values (?,?)";
            pstmt=connection.prepareStatement(sql);
            //傳入參數
            pstmt.setString(1, "《java入門到改行》");
            pstmt.setFloat(2, 11.11f);
            int result=pstmt.executeUpdate();
            System.out.println("受影響行數:"+result);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if (pstmt!=null) {
                try {
                    pstmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection!=null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

說明:

一、鏈接字符串要修改數據庫名字爲 books

String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";

二、插入數據庫的數據不能拼接而是要用 ? 代替

String sql="insert into book(bName,price) values (?,?)";

三、? 代替的參數要經過 set類型(位置,值) 傳入

pstmt.setString(1, "《java入門到改行》");
pstmt.setFloat(2, 11.11f);

pstmt.setXxx()的位置從 1 開始!

四、增刪改的SQL語句都使用這個方法,返回受影響行數

int result=pstmt.executeUpdate();

刪除數據

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

public class TestDelete {

    public static void main(String[] args) {
        Connection connection=null;
        PreparedStatement pstmt=null;
        String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";
        String user="root";
        String password="1234";
        try {
            connection=DriverManager.getConnection(url,user,password);
            //sql語句
            String sql="delete from book where id=?";
            pstmt=connection.prepareStatement(sql);
            //傳入參數 要刪除id
            pstmt.setInt(1, 1);
            int result=pstmt.executeUpdate();
            System.out.println("受影響行數:"+result);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if (pstmt!=null) {
                try {
                    pstmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection!=null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

修改數據

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

public class TestUpdate {

    public static void main(String[] args) {
        Connection connection=null;
        PreparedStatement pstmt=null;
        String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";
        String user="root";
        String password="1234";
        try {
            connection=DriverManager.getConnection(url,user,password);
            //sql語句
            String sql="update book set bName=?,price=? where id=?";
            pstmt=connection.prepareStatement(sql);
            //傳入參數 要刪除id
            pstmt.setString(1, "《MySQL從刪庫到跑路》");
            pstmt.setFloat(2, 16.66f);
            pstmt.setInt(3, 2);
            int result=pstmt.executeUpdate();
            System.out.println("受影響行數:"+result);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if (pstmt!=null) {
                try {
                    pstmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection!=null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

增、刪、改操做的寫法都同樣,都調用 executeUpdate() 方法返回一個受影響行數,惟一不一樣的 SQL語句。

PreparedStatement 查詢數據

查詢數據須要用到 ResultSet 類保存返回的結果集,咱們獲取數據要操做 ResultSet 獲取。

ResultSet 經常使用方法

方法名 說明
boolean next() 將遊標從當前位置向下移動一行
void close() 關閉 ResultSet 對象
int getInt(int colIndex) 以int形式獲取結果集當前行指定列號值
int getInt(String colLabel) 以int形式獲取結果集當前行指定列名值
float getFloat(String colLabel) 以float形式獲取結果集當前行指定列名值
String getString(String colLabel) 以 String 形式獲取結果集當前行指定列名值
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class TestSelect {

    public static void main(String[] args) {
        Connection connection=null;
        PreparedStatement pstmt=null;
        ResultSet rs=null;
        String url="jdbc:mysql://localhost:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false";
        String user="root";
        String password="1234";
        try {
            connection=DriverManager.getConnection(url,user,password);
            //sql語句
            String sql="select bName,price,id from book where id=?";
            pstmt=connection.prepareStatement(sql);
            //傳入查詢條件
            pstmt.setInt(1, 2);
            rs=pstmt.executeQuery();
            while(rs.next()) {
                //經過列名獲取列的值
                int id=rs.getInt("id");
                //經過位置獲取列的值
                String bName=rs.getString(1);
                float price=rs.getFloat("price");
                System.out.println(id+" "+bName+" "+price);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if(rs!=null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (pstmt!=null) {
                try {
                    pstmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection!=null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

關閉對象時注意關閉的順序,後使用的先關閉:rs.close()->pstmt.close()->connection.close()

ResultSet 對象存在一個光標,光標所指行爲當前行。想要獲取列的數據須要先指向一行,因此要先指定 next() 方法用於指向一行,若是沒有數據next()方法返回false,有數據返回true。

使用 getXxx() 方法獲取列的數據時建議寫列名,這樣好識別

相關文章
相關標籤/搜索