JDBC简介
JDBC是Java DataBase Connectivity的缩写,既Java数据库连接,是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口。
JDBC是一套接口规范,而接口并不能直接实例化,而是必须实例化对应的 实现类
,然后通过接口引用这个实例。那么JDBC接口的实现类在哪?
因为JDBC接口并不知道我们要使用哪个数据库,所以,用哪个数据库,我们就去使用哪个数据库的 实现类
,我们把某个数据库实现了JDBC接口的jar包称为JDBC驱动。
获取连接MySQL的连接对象
java.sql下提供了一个接口 Driver
,它是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。
方法一
获取Driver对象,调用connect方法,方法需要url和用户名和密码,此时返回的就是连接对象。
这里Driver是一个接口,而实现这个接口的是数据库驱动,所以声明Driver对象时应该找到驱动的实现类(com.mysql.jdbc.Driver)。具体代码如下:
try {
//1.提供java.sql.Driver接口实现类的对象
Driver driver = null;
driver = new com.mysql.jdbc.Driver();
//2.提供url,指明具体操作的数据
String url = "jdbc:mysql://localhost:3306/test";
//3.提供Properties的对象,指明用户名和密码
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password", "abc123");
//4.调用driver的connect(),获取连接
Connection conn = driver.connect(url, info);
System.out.println(conn);
} catch (SQLException e) {
e.printStackTrace();
}
复制
方法二
根据java编码规范,方法一中出现了第三方的API,所以对方法一进行迭代
解决方案:利用反射来获取MySQL的Driver的实现类对象。修改的代码如下
Class clazz = Class.forName(driverName);
Driver driver = (Driver) clazz.newInstance();
复制
方法三
使用DriverManager管理JDBC驱动,来替代Driver。
DriverManager是一个类,其中getConnect(String url,String user,String password)方法是获取连接的方法。但前提还需要使用它的registerDriver(方法)注册驱动。代码如下:
try {
//1.数据库连接的4个基本要素:
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "abc123";
String driverName = "com.mysql.jdbc.Driver";
//2.实例化Driver
Class clazz = Class.forName(driverName);
Driver driver = (Driver) clazz.newInstance();
//3.注册驱动
DriverManager.registerDriver(driver);
//4.获取连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
} catch (Exception e) {
e.printStackTrace();
}
复制
方法四
优化方法三,只需要 Class.forName(com.mysql.jdbc.Driver);这一行代码便可以加载Driver。因为在Driver实现类的源码里已经调用了
java.sql.DriverManager
并完成了对Driver的加载。最终代码如下:
try {
//1.数据库连接的4个基本要素:
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "abc123";
String driverName = "com.mysql.jdbc.Driver";
//2.加载驱动 (①实例化Driver ②注册驱动)
Class.forName(driverName);
//Driver driver = (Driver) clazz.newInstance();
//3.注册驱动
//DriverManager.registerDriver(driver);
/*
可以注释掉上述代码的原因,是因为在mysql的Driver类中声明有:
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
*/
//3.获取连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
} catch (Exception e) {
e.printStackTrace();
}
复制
说明:不必显式的注册驱动了。因为在DriverManager的源码中已经存在静态代码块,实现了驱动的注册。