java--jdbc

1.jdbc的測試代碼

maven依賴

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
import java.sql.*;
import java.util.UUID;

public class JdbcTest {
    public static void main(String[] args){
        insertData();
    }
    public static Connection getConnection(){
        try {
            //加載驅動到jvm
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        String url = "jdbc:mysql://localhost:3306/mybatisdb?characterEncoding=UTF-8";
        String username = "root";
        String password = "root";
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(url,username,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
    public static void createTable(String sql){
        Connection conn = getConnection();
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(sql);
            ps.execute();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally{
            if(null!=ps) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(null!=conn) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    public static void insertData(){
        Connection conn = getConnection();
        String sql = "insert into user(id,name,password) values(?,?,?)";
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(sql);
            ps.setString(1, UUID.randomUUID().toString());
            ps.setString(2, "fcc");
            ps.setString(3, "password");
            ps.execute();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if(null!=ps) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(null!=conn) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    public static void selectData(){
        Connection conn = getConnection();
        String sql = "select * from user";
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            while(rs.next()){
                System.out.println(rs.getString(1));//1代表數據庫中表的列數
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if(null!=rs) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(null!=ps) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(null!=conn) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

2.源碼淺析

try {
//加載驅動到jvm
Class.forName(“com.mysql.jdbc.Driver”);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

package com.mysql.jdbc;

import java.sql.SQLException;

/**
 1. The Java SQL framework allows for multiple database drivers. Each driver should supply a class that implements the Driver interface
 2. //Java SQL框架允許多個數據庫驅動程序。每個驅動程序應該提供一個實現驅動程序接口的類
 3. <p>
 4. The DriverManager will try to load as many drivers as it can find and then for any given connection request, it will ask each driver in turn to try to
 5. connect to the target URL.
 6. //DriverManager會嘗試加載儘可能多的驅動程序,然後對於任何給定的連接請求,它會要求每個驅動程序依次嘗試
連接到目標URL。
 7. <p>
 8. It is strongly recommended that each Driver class should be small and standalone so that the Driver class can be loaded and queried without bringing in vast
 9. quantities of supporting code.
 10. 
 11. <p>
 12. When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager. This means that a user can load and register a
 13. driver by doing Class.forName("foo.bah.Driver")
 */
 //當一個驅動類被加載時,它應該創建一個自己的實例,並將其註冊到驅動管理器。這意味着用戶可以通過Class.forName("foo.ba . driver ")來加載並註冊
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    //
    // Register ourselves with the DriverManager
    //
    static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }

    /**
     * Construct a new driver and register it with DriverManager
     * 
     * @throws SQLException
     *             if a database error occurs.
     */
    public Driver() throws SQLException {
        // Required for Class.forName().newInstance()
    }
}
  1. 註冊驅動,實際就是放到
    private final static CopyOnWriteArrayList registeredDrivers = new CopyOnWriteArrayList<>();
    這個list裏
public static synchronized void registerDriver(java.sql.Driver driver,
            DriverAction da)
        throws SQLException {

        /* Register the driver if it has not already been added to our list */
        if(driver != null) {
            registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
        } else {
            // This is for compatibility with the original DriverManager
            throw new NullPointerException();
        }

        println("registerDriver: " + driver);

    }

3.DriverManager.getConnection()。最終返回com.mysql.jdbc.ConnectionImpl的實例
在這裏插入圖片描述

  1. 源碼太長了,最終進入到MysqlIo類裏面
    調用final ResultSetInternalMethods sqlQueryDirect(StatementImpl callingStatement, String query, String characterEncoding, Buffer queryPacket, int maxRows,
    int resultSetType, int resultSetConcurrency, boolean streamResults, String catalog, Field[] cachedMetadata) throws Exception {
    把東西查到內存裏
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章