一、JDBC为什么需要数据库驱动?
数据库是一个产品,想要访问它,就得通过它定义的方式去访问。你可能觉得平时操作时好像并没有按照什么协议访问呀,就是敲了下SQL命令,就有返回结果了。但你记得你是在什么环境下访问的吗?你在cmd终端下输入mysql启动的就是mysql client,是一个客户端,这个客户端其实就是一段程序,它的内部逻辑对你来说是透明的,你给它一段SQL,其实它是会做一定包装的,然后通过一些协议发送给mysql的server服务端。
抓包工具:WireShark
然后打脸了,并没有抓到3306端口的网络包
然后查阅了下《MySQL技术内幕InnoDB存储引擎》:
常用的进程间通信方式有:管道,命名管道,命名字,TCP套接字,Unix域套接字。而MySQL提供的连接方式从本质上看都是上述提及的进程通信方式
1.TCP/IP
TCP/IP套接字的方式是MySQL在任何平台上都提供的连接方式,也是用的最多的。一般情况客户端一台机器去连接服务器另一台机器。两台机器之间就是通过TCP/IP连接。客户端会向服务器MySQL实例发出TCP/IP连接请求,并连接成功
2,。命名管道和共享内存
Windows2003、vista及在此之上的平台,如果两个需要进程通信的进程在同一台机器上,那么可以使用命名管道,配置文件启用--enable-named-pipe。也可以使用共享内存的连接方式,只需要进行配置。
无论哪种方式,与数据库服务器通信肯定还是有一定的协议的
那么mysql,oracle,DB2他们的协议是一样的吗?不是。那么JAVA为每一个协议都去写一个类,是不切合实际的。首先这个协议是别人定的,第二数据库产品太多了。所以JAVA定义了一套接口,也就是JDBC。而协议的实现与通讯就由数据库厂商来提供了,这也就是驱动程序的JAR包。
看一下标准的连接语句
//声明Connection对象
Connection con;
//驱动程序名
String driver = "com.mysql.jdbc.Driver";
//URL指向要访问的数据库名test
String url = "jdbc:mysql://localhost:3306/test";
String user = "root";
String password = "root";
//遍历查询结果集
try {
//加载驱动程序
Class.forName(driver);
//1.getConnection()方法,连接MySQL数据库
con = DriverManager.getConnection(url,user,password);
//2.创建statement类对象,用来执行SQL语句
Statement statement = con.createStatement();
//要执行的SQL语句
String sql = "select * from student";
//3.ResultSet类,用来存放获取的结果集!!
ResultSet rs = statement.executeQuery(sql);
while(rs.next()){
//获取name这列数据
name = rs.getString("name");
//获取uid这列数据
id = rs.getString("uid");
}
rs.close();
con.close();
} catch(ClassNotFoundException e) {
//数据库驱动类异常处理
System.out.println("Sorry,can`t find the Driver!");
e.printStackTrace();
} catch(SQLException e) {
//数据库连接失败异常处理
e.printStackTrace();
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally{
System.out.println("数据库数据成功获取!!");
}
}
所以这个过程总结起来就是:
1.注册一个Driver
2.建立一个到数据库的连接
3.创建一个Statement
4.执行SQL语句
5.处理结果
6.关闭JDBC对象
但是我们都是面向接口编程的,但运行时的对象还是使用的底层实现
来看一个图,看我们是如何使用驱动的(很明显的体现出来了面向接口编程)
二、为什么使用Class.forName来加载数据库驱动,DriverManager的作用
我们平时用Class.forName去加载驱动,可能很多初学者都没太懂这个底层。所以我们来解释下
我们先用最直观的方式连接一下:
<pre name="code" class="java">Driver driver=new com.mysql.jdbc.Driver();
Connection conn=driver.connect(url, info);
System.out.println(conn);
读者可以用这种方式去试试,看能不能获取连接(肯定是可以的啦