前面4大核心对象基本代码都知道了,现在开始一个一个具体学习每个对象以及这个对象的常用操作和方法。DriverManager类是java.sql下的类,主要有两个功能,注册驱动和获取连接对象。本篇就这两个功能展开,具体来学习下。

1.注册驱动

相关代码

//注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());

前面的例子我们使用上面这行代码去注册驱动,但是,这里要说明这种方式不推荐使用,因为这行代码会driver注册两次,而且强烈依赖jar包,上面是连接mysql,如果以后换成oracle,这个jar包还得改。下面来解释下为什么driver被注册两次。

在JDK文档上,找到DriverMananger这个类,找到注册方法。

java中driver java中drivermanager_JDBC

这句红圈解释并不好理解,那么我们去Eclipse上看看com.mysql.jdbc.Driver()中这个Driver类的代码。打开Driver.class源码,看到以下这个静态代码块。

java中driver java中drivermanager_mysql_02

在静态代码块里,我们看到调用DriverManager的注册方法,我们知道,在一个类中静态代码块会在类加载之后里面执行。所以以下代码中driver会被执行两次。

//注册驱动
DriverManager.registerDriver(new com.mysql.jdbc.Driver());

我们自己调用registerDriver注册一次,然后new Driver对象的时候又在静态代码块中执行一次,所以这行代码执行了两次。

解决办法

使用反射来加载驱动, Class.forName("Driver.class在mysql jdbc包的全路径")

package demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCTest {

	public static void main(String[] args) throws SQLException, ClassNotFoundException {
		//加载驱动
		Class.forName("com.mysql.jdbc.Driver");
		//获取连接Connection对象
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "123456");
		//得到执行SQL语句的Statement对象
		Statement stmt = conn.createStatement();
		//执行SQL语句,这里是执行查询语句,得到一个虚拟表的结果对象
		ResultSet rs = stmt.executeQuery("SELECT * FROM student");
		//对结果进行处理,这里是打印
		while(rs.next()) {
			System.out.println(rs.getObject(1) + "\t" + rs.getObject(2) + "\t" + rs.getObject(3) + "\t"+ rs.getObject(4));
		}
		//关闭连接
		rs.close();
		stmt.close();
		conn.close();
	}

}

运行一下,和前面一篇一样,也能打印出表信息。其实这两利用反射,Driver.class的全路径,你可以在Eclipse上的包引用展开,找到com.mysql.jdbc.Driver这个类。

java中driver java中drivermanager_bc_03

以后就用反射方法,用Class.forName的方式。这个driver的全路径,以后我们可以提取出来,放到配置文件中去。以后这个配置文件,可以改成oracle中driver的路径,或者其他数据库的。

2.与数据库建立连接

连接对象获取方法代码

//获取连接Connection对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "123456");

我们再次打开JDK中DriverManger类文档

java中driver java中drivermanager_java中driver_04

上面有三个连接方法,我这里用的是第三个,有三个参数url,user,password。

先来看看Url这个参数:jdbc:mysql://localhost:3306/mydatabase, 这个url中jdbc是指JDBC协议,mysql是一个子协议,也就是数据库厂商提供的一个协议,是jdbc的子协议,后面localhost:3306,表示一台机器上运行端口3306的mysql服务。后面mydatabase是数据库的名称。简单来说这个url就是JDBC和数据库厂商的一个协议规范,如果连接oracle,这个就可能变成这样

jdbc:oracle:thin:@localhost:1521:sid

至于参数user和password,指的是数据库用户名和密码。

上面三个连接数据库的方法,应该来说,第三个是我们经常使用的,下面把其他两个代码例子也写出来。

Properties info = new Properties();
info.setProperty("user","root");
info.setProperty("password","123456");
getConnection("jdbc:mysql://localhost:3306/mydatabase", info);

# 第三种方法
getConnection("jdbc:mysql://localhost:3306/mydatabase?user=root&password=123456")

上面两种我就不贴出来完整代码,可以用TestNG或者Junit来写用例测试一下。