mysql的jdbc入門學習小結

轉自:專一JavaWeb開發 http://www.javaweb1024.com/data/MySQL/2015/04/25/618.htmlhtml

1、jdbc基本概念
jdbc : Java Database Connectivity
sun公司爲了統一對數據庫的操做,定義了一套api,稱之爲jdbc
這套api徹底由接口組成,咱們在編寫程序的時候針對接口進行調用
這些接口交給數據庫廠家去實現, 不一樣的數據庫廠商會提供不一樣的實現類,
這些實現類被咱們稱做數據庫的驅動。

一流公司定標準
二流公司作服務
三流公司作產品

數據庫驅動交給數據庫廠商製做的優勢:
    1.Java開發人員只須要維護Java應用和一套統一的規範
    2.數據庫廠商提供具體的Java驅動程序,數據庫廠商若是改變了
    數據庫底層的實現,數據庫廠商要隨之更新驅動程序,不會影響到
    已經完成的Java應用程序。

簡單來講使用Java代碼發送SQL語句的技術,就是jdbc

2、實現jdbc程序的條件
 1.須要知道鏈接數據庫服務器所在地
         須要數據庫的IP地址和端口號
         ip定位到主機
         端口號:定位到程序
 2.須要知道數據庫的用戶名和密碼
 
3、如何實現jdbc鏈接MySQL數據庫?
    1.導入數據庫的驅動程序
        mysql-connector-java-5.0.8-bin.jar
    2.註冊數據庫的驅動
        DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 
    3.創建與mysql數據庫的鏈接
        String url = "jdbc:mysql://localhost:3306/test";//jdbc是主協議,mysql是子協議
        String user = "root";
        String password = "root";
        Connection conn = DriverManager.getConnection(url, user, password);
    4.建立用於發送sql語句的 Statement 對象
        Statement stmt = conn.createStatement();
    5. 編寫SQL語句
        String sql = "select * from users";
    6.發送sql, 得到結果集
        ResultSet rs = stmt.executeQuery(sql);
    7.處理結果集
        System.out.println("id | name   | password | email  | birthday");
        while(rs.next()) {
            // 有第一行
            int id = rs.getInt("id");    // 經過列名取值比較直觀
            String name = rs.getString("name");
            String psw = rs.getString("password");
            String email = rs.getString("email");
            Date birthday = rs.getDate("birthday");
            System.out.println(id + " | " + name + " | " + psw + " | " + email + " | " + birthday);
        }
    8.關閉數據庫鏈接,最後打開的資源最早釋放,釋放以前須要判斷資源是否已經斷開
        rs.close();
        stmt.close();
        conn.close();
4、jdbc程序詳解
1. 註冊驅動
    DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 
    上面的語句會致使註冊兩次驅動
    緣由在於,查看Driver類的源碼會發如今靜態代碼塊中完成了註冊驅動的工做,
    也就是說註冊驅動其實很簡單,只須要加載驅動類便可
    Class.forName(「com.mysql.jdbc.Driver」);
2. 建立數據庫的鏈接
    Connection conn = DriverManager.getConnection(url, user, password);
    其中:java

    url, 至關於數據庫的訪問地址,程序員經過url指定須要訪問的數據庫mysql

     //鏈接數據庫的url
    //jdbc主協議,mysql是子協議
    //jdbc協議:數據庫子協議://主機:端口號:/數據庫名程序員

    jdbc:mysql:[]//localhost:3306/test?參數名:參數值
    其中jdbc爲主協議,mysql爲子協議,localhost爲主機名,3306爲端口號,test爲數據庫名
    url的後面能夠跟參數,經常使用的參數有:user=root&password=root&characterEncoding=UTF-8

    若是url地址後面跟了user和password,建立Connection對象時將沒必要再次傳入值
    Connection conn = DriverManager.getConnection(url);

    補充說明: 若是訪問的localhost:3306,url 可省寫爲jdbc:mysql:///test
3. Connection 對象
    Connection對象用於表示與某個數據庫之間的鏈接,在程序中對數據庫的全部操做都須要經過此對象來完成
    經常使用方法有:
    createStatement():建立向數據庫發送sql的statement對象。
    prepareStatement(sql) :建立向數據庫發送預編譯sql的PrepareSatement對象。
    prepareCall(sql):建立執行存儲過程的callableStatement對象。 
    setAutoCommit(boolean autoCommit):設置事務是否自動提交。 
    commit() :在連接上提交事務。
    rollback() :在此連接上回滾事務。

4. Statement 對象
    用於向數據庫發送sql語句
    execute(String sql):用於向數據庫發送任意sql語句
    executeQuery(String sql) :只能向數據發送查詢語句。(經常使用)
    executeUpdate(String sql):只能向數據庫發送insert、update或delete語句(經常使用)
    addBatch(String sql) :把多條sql語句放到一個批處理中。
    executeBatch():向數據庫發送一批sql語句執行。 

5. ResultSet 對象
    對於查詢操做,該對象特別重要,由於它專門用於封裝結果集
    存儲的形式就是一種表格的形式,一樣是列+行,說白了就和咱們在 dos 命令行窗口查詢的結果同樣

    遍歷方式:
    一開始遊標指向結果集第一行, 也就是表頭
    經過 next 將遊標移向下一行, 若是沒有下一行,該方法會返回false
    得到當前行的數據須要調用get方法:
    get(int index)得到第幾列  列數從1開始
    get(String columnName) 根據列名得到值  經常使用web

    注意:數據庫的數據類型與java中數據類型的對應關係sql

    
    ResultSet對象的經常使用方法
    next():移動到下一行
    previous():移動到前一行
    absolute(int row):移動到指定行
    beforeFirst():移動resultSet的最前面。
    afterLast() :移動到resultSet的最後面。
6. 釋放數據庫資源
    由於數據容許的併發訪問鏈接數量每每都比較有限,使用完成後,須要釋放資源

    在java程序中,咱們應該將最終必需要執行的代碼放到finally當中
    釋放資源的代碼
    if(rs!=null) {
        try {
            rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        rs = null;
    }

    if(stmt!=null) {
        try {
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        stmt = null;
    }

    if(conn!=null) {
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        conn = null;
    }
    
7. 防止 sql 注入
    在 service 層進行邏輯判斷
    使用PreparedStatement對象數據庫

 

 

package cn.test.jdbc.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.Properties;



import com.mysql.jdbc.Driver;

public class JDBCDemo {
    //鏈接數據庫的url的寫法
    //jdbc主協議,mysql是子協議
    //jdbc協議:數據庫子協議://主機:端口號:/數據庫名
    private String url="jdbc:mysql://localhost:3306/day15";
    //用戶名
    String username = "root";
    //密碼
    String password = "Name-66437";
    @Test
    public void main(String [] args) throws SQLException{
        //1.建立一個驅動程序的類對象
        Driver driver = new com.mysql.jdbc.Driver();
        //設置用戶名和密碼
        Properties props = new Properties();
        props.setProperty("username", username);
        props.setProperty("password", password);
        
        //2.鏈接數據庫
        Connection conn = driver.connect(url, props);
        Statement stmt = conn.createStatement();
        String sql = "select * from student";
        ResultSet rs = stmt.executeQuery(sql);
        //7.處理結果集
        System.out.println("id | name   | password | email  | birthday");
        while(rs.next()) {
            // 有第一行
            int id = rs.getInt("id");    // 經過列名取值比較直觀
            String name = rs.getString("name");
            String psw = rs.getString("password");
            String email = rs.getString("email");
            Date birthday = rs.getDate("birthday");
            System.out.println(id + " | " + name + " | " + psw + " | " + email + " | " + birthday);
        }
        //釋放資源的代碼
        if(rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }

        if(stmt!=null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            stmt = null;
        }

        if(conn!=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            conn = null;
        }
    }
}api

相關文章
相關標籤/搜索