赞
踩
mysql5及之前的版本使用的是旧版驱动"com.mysql.jdbc.Driver",
mysql6以及之后的版本需要更新到新版驱动,对应的Driver是"com.mysql.cj.jdbc.Driver"
com.mysql.cj.jdbc.Driver
这个类是数据库厂商实现的JDBC一套接口里的一个类,称之为“驱动类”,它的继承树如下所示:
————com.mysql.jdbc.Driver extends com.mysql.cj.jdbc.Driver
————com.mysql.cj.jdbc.Driver extends NonRegisteringDriver
————public class NonRegisteringDriver implements java.sql.Driver
其中java.sql是sun官方提供的包,java.sql.Driver是sun提供的一组用于连接数据库的接口之一,由数据库厂商自行实现
由上可知,com.mysql.cj.jdbc.Driver这个驱动类,是对java.sql.Driver接口的实现
对于Connection conn = DriverManager.getConnection("***","***","***");来说
在java.sql.Driver中有一个方法:Connection connect;
Connection connect(String url, java.util.Properties info)
throws SQLException;
DriverManager类中,有一个静态私有方法:private static Connection getConnection(){}用这个静态私有方法,返回一个Connection对象(体现了封装),在它的内部,调用了java.sql.Driver接口里的Connection connect()方法
try {
println("trying " + aDriver.driver.getClass().getName());
Connection con = aDriver.driver.connect(url, info);
if (con != null) {
println("getConnection returning" + aDriver.driver.getClass().getName());
return (con);
}
Connection而在编程过程中,驱动类com.mysql.cj.jdbc.Driver的载入,是由反射完成的,
Class.forName("com.mysql.cj.jdbc.Driver");
该语句将驱动类载入JVM内存,驱动类的静态数据方法区生成一个数据结构,在堆中生成一个Driver类对应的java.lang.Class对象,作为方法去类数据的访问入口。
载入这个类com.mysql.cj.jdbc.Driver进JVM之后,在后续的程序中,就可以使用它。
调用Driver中的方法connect,就可以得到一个数据库和应用程序的来连接,而这种调用由第三方:DriverManager来完成,这个第三方被称为驱动管理员,它可以整合需要的东西,配合驱动,得到连接。
而不是由Driver自己直接去获取连接。
DriverManager会跟踪可用的驱动程序,并在数据库和相应的驱动之间建立连接,即获得一个Connection对象
比如系统中有十个被加载的驱动,驱动管理员一个一个检验,哪一个适用于当前数据库的连接,检验到合适的驱动,进行获取连接操作。源代码示例:
for(DriverInfo aDriver : registeredDrivers) {
if(isDriverAllowed(aDriver.driver, callerCL)) {
try {
println(" trying " + aDriver.driver.getClass().getName());
Connection con = aDriver.driver.connect(url, info);
if (con != null) {
println("getConnection returning " + aDriver.driver.getClass().getName());
return (con);
}
} catch (SQLException ex) {
if (reason == null) {
reason = ex;
}
}
} else {
println("skipping: " + aDriver.getClass().getName());
}
Connection接口
- Connection与特定数据库的连接(会话),在连接上下文中执行SQL语句并返回结果。
- DriverManager的getConnection()方法建立在JDBC URL中定义的数据库Connection连接上
-Mysql
Connection con = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");
-Oracle
Connection con = DriverManager.getConnection("jdbc:oracle:thin@host:port/database", "user", "password");
Statement接口
- 用于执行静态SQL语句并返回它所生成结果的对象。三种Statement类:
- Statement:
由createStatement创建,用于发送简单的SQL语句(不带参数)
Statement createStatement() throws SQLException;
- PreparedStatement:
- 继承自Statement接口,有preparedStatement创建,用于发送含有一个或者多个输入参数的SQL语句。PreparedStatement对象比Statement对象效率更高,并且是防止SQL注入。我们一般都使用PreparedStatement。
PreparedStatement prepareStatement(String sql)throws SQLException;
- CallableStatement:
- 继承自preparedStatement。由方法prePareCall创建,用于调用存储过程。
CallableStatement prepareCall(String sql) throws SQLException;
- 常用的Statement方法
- execute():运行语句,返回是否有结果集。
- executeQuery():运行select语句,返回ResultSet结果节
- executeUpdate():运行insert/update/delete操作,返回更新的行数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。