0
点赞
收藏
分享

微信扫一扫

jdbc的一些方法源码分析和mysqljdbc的讲解

大南瓜鸭 2022-01-17 阅读 227

1.class.forname讲解

先看代码

这里我就不导包,一步一步老看

public class MysqlJdbc {
    public static void main(String[] args) throws Exception {
        //第一步:加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //第二步:创建连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/kayleigh?useSSL=false","root","123456");
        //第三步:创建statement
        Statement st = conn.createStatement();
        //第四步:通过statemeng执行SQL
        ResultSet rs = st.executeQuery("select * from student");

        //第五步:遍历resultSet,获取返回的记录
        while (rs.next()){
            int id = rs.getInt("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            String gender = rs.getString("gender");
            String clazz = rs.getString("clazz");

            System.out.println(id+","+name+","+age+","+gender+","+clazz);
        }

        //第六步:关闭连接
        st.close();
        conn.close();

    }
}

解析

为什么Class.forName传入com.mysql.jdbc.Driver ,就知
道我们要连接的就是mysql呢?
首先我们要搞懂java的一些方法,那就必须去看底层源代码,底层
源代码我复制在下面:
@CallerSensitive
public static Class<?> forName(String className) throws ClassNotFoundException {
    Class<?> caller = Reflection.getCallerClass();
    return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}
从这里看到,他调用了forName方法,然后下一步继续跟踪
private static native Class<?> forName0(String name, boolean initialize,
          ClassLoader loader,
          Class<?> caller)
 throws ClassNotFoundException;
这里使用的是native方法,源码也终止在这里了,这里我看了一下
官方的解释:

返回一个给定的类或者接口的一个class对象,如果没有给定,那么会使用根类加载器,我们在jdbc的第一步,传入了com.mysql.jdbc.Driver,紧接着这个类就会进行初始化,这里、看看这个类到底有什么内容,这么神奇:
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
  
static {
    try {
        java.sql.DriverManager.registerDriver(new Driver());
    } catch (SQLException E) {
        throw new RuntimeException("Can't register driver!");
    }
}
 
 
    public Driver() throws SQLException {
    // Required for Class.forName().newInstance()
    }
}
这里包含了一个静态的代码块和一个构造函数,就是我们在初始化
的时候,静态代码块的内容会被执行,所以说,使用
Class.forName和直接写
DriverManager.registerDriver(new Driver())
这个是一样的,这里放在idea里面执行,也是可以运行的。
总结一下: Class.forName 方法的作用,就是初始化给定的类。
而我们给定的 MySQL 的 Driver 类中,它在静态代码块中通过 
JDBC 的 DriverManager 注册了一下驱动。我们也可以直接使
用 JDBC 的驱动管理器注册 mysql 驱动,从而代替使用 
Class.forName。

DriverManager.getConnection()方法

不难得知,DriverManager.getConnection,一共有四个重载
方法,其中有三个方法由public来修饰的,用来获取不同类型的参
数,这三个getConnection实际相当于一个入口,他们最终都会
return第四个私有化的getConnection方法,最终向第四个私有
化方法的传入参数都是url,java.util.Properties,以及
Reflection.getCallerClass(),这个方法是native的

--------回头补上,我还没理解透

jdbc的使用

maven依赖的添加

 这里 如果我们进行连接的话,我们需要现在pom文件中添加
 maven依赖,这里的依赖直接给定大家

不要直接复制进去,看任何别人的文章都是一样的不要直接的复制代码进去,看看是否有需要修改的地方,这里就=需要更改一下版本高,如果mysql版本特别新,这里的版本过低,就可能会出问题,反之亦然。

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.49</version>
</dependency>

在这里插入图片描述

点一下这个按钮就会自动的安装了,只需要等待即可

实例代码

这里的讲解直接放在放在代码之间

import java.sql.*;

public class MySQLJDBCDemo {
    public static void main(String[] args) throws Exception {
        // 1、加载驱动
        Class.forName("com.mysql.jdbc.Driver");

        // 2、创建连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://master:3306/db1?useSSL=false","root","123456");

        // 3、创建Statement

        Statement st = conn.createStatement();

        // 4、通过Statement执行SQL
        ResultSet rs = st.executeQuery("select * from student");

        // 5、遍历ResultSet 获取返回的记录
        while (rs.next()) {
            int id = rs.getInt("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            String gender = rs.getString("gender");
            String clazz = rs.getString("clazz");

            System.out.println(id+","+name+","+age+","+gender+","+clazz);
        }

        // 6、关闭连接
        st.close();
        conn.close();


    }
}

这里也不要复制粘贴,然后去测试连接,这里有需要更改的地方

Connection conn = DriverManager.getConnection("jdbc:mysql://[master]:3306/[db1]?useSSL=false","[root]","[123456]");
这里就需要更改,更改的地方用中括号括起来
举报

相关推荐

0 条评论