上一篇博客简单介绍了JDBC连接的简单知识,下面就详细介绍。李勇老师对JDBC连接有很好的比喻:
首先加载驱动,其实就是一些类,就是jar包,要加载到classpath里面的。实际的程序,服务和数据库不是在同一台机器上的。首先要建立一个网络连接,有这个连接之后就可以通过java语言来访问数据库。比如两个城市之间运送货物,但是有个河,所以要建一座桥,这就是建立连接,而汽车运送货物,汽车就是Statement。而查询语句就是货物,这些货物发送之后获得的数据就是ResultSet。一次发送之后就要把数据清空,汽车销毁,桥也拆掉。
一 注册驱动。
你可以使用下面的六种方法注册,但是一般不常见,其中第一种使用方式最多。
1,DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
这是注册驱动的代码:
其中上面的图片的倒数第三行有个drivers,其定义如下,说明是个列表,可以把多个驱动放进去。
当把驱动加载进去之后,你调用DriverManager.getConnection(xxx)之后,会在驱动列表根据URL挨个找驱动,看哪个驱动可以连接上数据库。如果所有驱动都不能建立连接则报错。
2, System.setProperty("jdbc.driver", "oracle.jdbc.driver.OracleDriver");
这种方法也可以使得虚拟机加载驱动。并且可以一次加载多个,例如:
System.setProperty("jdbc.driver", "oracle.jdbc.driver.OracleDriver:com.mysql.jdbc.Driver");
3,Class.forName("oracle.jdbc.driver.OracleDriver");
这种是最常用的方法,他只是把类装载到虚拟机里面,但是没有构造实例了。一般都是把驱动放到驱动列表里面,但是这里面是怎么实现的呢?当一个类被加载到虚拟机之后呢,就要调用的该类的静态代码块,这是类的初始化的内容。那么看看实现该接口的JDBC驱动里面代码是怎么样的(这里是mysql的):可以看出,当类被加载到虚拟机的时候就会执行静态代码块的内容了。
上面三种方法哪种最好呢?当然是第三种,因为:
第一、二种相当于注册两次,第三种只注册一次。
第一种依赖数据库驱动,如果没有驱动,当然不能通过编译。第二种即使没有驱动,都可以通过编译。
因此建议使用第三种方式。
二 建立连接
一般的连接建立如下:
这里主要讲一下URL是什么。
String url = "jdbc:oracle:thin:@localhost:1521:orcl"; String user ="scott";//用户权限 String password = "scott"; Connection conn = DriverManager.getConnection(url, user, password);
jdbc是个协议,上面的url最后面orcl是数据库实例。每个数据库的url格式都不同 ,下面是总结了大部分的数据库的URL格式:
三 其他
当建立连接之后,用户就可以访问数据库了,相当于桥建好了。但是怎么访问了,当然是使用查询等sql语句,但是这些语句该怎么传送给数据库呢,当然要使用车来运输了,这个车就是要创建Statement对象,它可以传送要发送的sql语句,也会传送查询等的结果。但是有个问题是在数据执行所得到的结果放在哪里呢?一直放在车上?不会的,他会给ResultSet对象,这个对象是个二维表的结构,然后用户可以使用ResultSet对象里面查到的值做一系列操作了。当然最后要释放资源了,释放的顺序也很重要,先创建的后释放。为什么要释放资源呢?因为一个数据库有很多应用来操作,用了数据库之后要及时关闭,不然当超过一定值得时候会导致系统负载很大,导致宕机。
// 3,创建语句 Statement stmt = conn.createStatement(); // 4,执行语句,返回结果集 ResultSet rs = stmt.executeQuery(sql); // 5,处理结果 while (rs.next()) { } // 6,关闭连接 rs.close(); stmt.close(); conn.close();
这些代码是个简单的演示,只是为了熟悉过程。本文来自《JDBC Recipes A Problem-Solution Approach》和传智播客的李勇老师的视频。