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]");
这里就需要更改,更改的地方用中括号括起来