天天看點

JDBC的使用,Class.forName("com.mysql.jdbc.Driver") 有什麼用

昨天手機恢複出廠設定了,忘了定鬧鐘,結果第二天一睜眼就10點半了,還去上班嗎?對于我這麼潇灑的人來說,那肯定不去了呀,必須請假,就是這麼任性,雖然在家和前端聯調也敲了一天的代碼,哎~

廢話不多說了,今天想複習一下反射,突然就想到之前學JDBC的時候,有一行總覺得沒什麼卵用的代碼 

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

是以順便就看了看JDBC,看了看看看看,是以這句話到底有沒有毛用呢?

package study;

import entity.Person;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * *******************
 * jdbc建立和執行過程
 * ********************
 *
 * (1)建立Connection對象、SQL查詢指令字元串;
 * (2)對Connection對象傳入SQL查詢指令,獲得PreparedStatement對象;
 * (3)對PreparedStatement對象執行executeUpdate()或executeQurey()獲得結果;
 * (4)先後關閉PreparedStatement對象和Connection對象。
 */

/**
 * ****************************
 * 關于 Class.forName(driver);
 * ****************************
 *
 * 實際上就是為了加載類時,調用靜态初始化塊中的注冊函數。
 * ***  JDBC規範要求Driver類在使用前必須向DriverManger注冊自己 ***
 * Driver類中有注冊自己的方法
 * public class Driver extends NonRegisteringDriver implements java.sql.Driver {
 *     public Driver() throws SQLException {
 *     }
 *
 *     static {
 *         try {
 *             DriverManager.registerDriver(new Driver());
 *         } catch (SQLException var1) {
 *             throw new RuntimeException("Can't register driver!");
 *         }
 *     }
 * }
 * 是以用Class.forName實際上就是為了調用這個注冊驅動的方法。
 * 當然我們也可以直接調用DriverManager類中的registerDriver(new com.mysql.jdbc.Driver())來進行驅動的注冊
 * 這樣就不用Class.forName了。
 */



public class JdbcDemo {
    public static void main(String[] args) {
        //插入
        System.out.println("============執行插入start=============");
        Person personInster = new Person();
        personInster.setAge(10);
        personInster.setName("wangyingjie");
        int insert = insert(personInster);
        System.out.println("============執行插入end=============");

        //更新
        System.out.println("============執行更新start=============");
        Person personUpdate = new Person();
        personUpdate.setName("jiaxuan");
        personUpdate.setAge(3);
        personUpdate.setId(1);
        update(personUpdate);
        System.out.println("============執行更新end=============");

        //查詢
        System.out.println("============執行查詢start=============");
        List<Person> personList = select();
        for (Person person : personList) {
            System.out.println("========" + person.getName());
        }
        System.out.println("============執行查詢end=============");

        //删除
        System.out.println("============執行删除start=============");
        int deleteCount = delete(3);
        System.out.println("============執行删除end=============");
    }

    //jdbc獲得連接配接
    private static Connection getConn() {
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/demo";
        String username = "root";
        String password = "root";
        Connection conn = null;
        try {
            Class.forName(driver); //classLoader,加載對應驅動
//            可以使用這段代碼代替
//            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            conn = DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    //jdbc插入資料庫
    private static int insert(Person person) {
        Connection conn = getConn();
        int i = 0;
        String sql = "insert into person (Name,Age) values(?,?)";
        PreparedStatement pstmt;
        try {
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, person.getName());
            pstmt.setInt(2, person.getAge());
            i = pstmt.executeUpdate();
            pstmt.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return i;
    }


    //jdbc更新資料
    private static int update(Person person) {
        Connection conn = getConn();
        int i = 0;
        String sql = "update person set Age='" + person.getAge() + "',name='" + person.getName() + "' where id='" + person.getId() + "'";
        PreparedStatement pstmt;
        try {
            pstmt =  conn.prepareStatement(sql);
            i = pstmt.executeUpdate();
            System.out.println("resutl: " + i);
            pstmt.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return i;
    }

    //jdbc查詢
    private static List<Person> select() {
        Connection conn = getConn();
        String sql = "select id,name,age from person";
        PreparedStatement preparedStatement;
        List<Person> personList = new ArrayList<>();
        try {
            preparedStatement = conn.prepareStatement(sql);
            ResultSet resultSet = preparedStatement.executeQuery();
            int columnCount = resultSet.getMetaData().getColumnCount();

            while (resultSet.next()) {
                Person person = new Person();
                person.setId(resultSet.getInt(1));
                person.setName(resultSet.getString(2));
                person.setAge(resultSet.getInt(3));
                personList.add(person);
            }
            preparedStatement.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return personList;
    }


    //删除
    private static int delete(int id) {
        Connection conn = getConn();
        String sql = "delete from person where id = ?";
        PreparedStatement preparedStatement;
        int deleteCount = 0;
        try {
            preparedStatement = conn.prepareStatement(sql);
            preparedStatement.setInt(1, id);
            deleteCount = preparedStatement.executeUpdate();
            preparedStatement.close();
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return deleteCount;
    }
}
           

Class.forName("com.mysql.jdbc.Driver"); 這行代碼是為了注冊驅動,而注冊驅動這個規定,是JDBC的一種規範,試了一下,就是不寫這段代碼,也是沒問題的。