天天看点

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的一种规范,试了一下,就是不写这段代码,也是没问题的。