一、JDBC入门
JDBC 是用于执行SQL的解决方案,开发人员使用JDBC 的标准接口,数据库厂商则对接口进行操作,开发人员无须接触底层数据库驱动程序的差异性。
二、厂商在操作JDBC驱动程序时,依操作方式可将驱动程序分为4种类型。
(1) Type 1:JDBC-ODBC Bridge Driver
ODBC(Open DataBase Connectivity)是由 Microsoft主导的数据库连接标准,基本上JDBC是参考ODBC 制订而来,所以ODBC在 Microsoft系统上最为成熟,例如 MicrosoftAccess数据库存取就是使用ODBC。由于利用现成的ODBC架构,只需要将JDBC调用转换为ODBC调用,所以要操作这种驱动程序非常简单。在 Oracle/Sun JDK 中就附带有驱动程序,包名称以sun.jdbc.odbc开头。不过由于JDBC与ODBC并非一对一的对应,所以部分调用无法直接转换,因此有些功能受限,而多层调用转换的结果,访问速度也受到限制,ODBC本身需在平台上先设定好,弹性不足,ODBC 驱动程序本身也有跨平台限制。
(2) Type 2:Native API Driver
这个类型的驱动程序会以原生(Native)方式,调用数据库提供的原生链接库(通常由C/CH+操作),JDBC 的方法调用都会转换为原生链接库中的相关 API调用。由于使用了原生链接库,所以驱动程序本身与平台相依,没有达到JDBC驱动程序的目标之一:跨平台。不过由于直接调用数据库原生API,因此在速度上,有机会成为4种类型中最快的驱动程序。
Type 2驱动程序有机会成为速度最快的驱动程序,速度的优势是在于获得数据库响应数据后,创建相关JDBC API操作对象时,然而驱动程序本身无法跨平台,使用前必须先在各平台进行驱动程序的安装设定(像是安装数据库专属的原生链接库)。
(3) Type 3:JDBC-Net Driver
这类型的 JDBC 驱动程序会将JDBC 方法调用转换为特定的网络协议(Protocol)调用,目的是远程与数据库特定的中介服务器或组件进行协议操作,而中介服务器或组件再真正与数据库进行操作。
由于实际与中介服务器或组件进行沟通时,是利用网络协议的方式,所以客户端这里安装的驱动程序,可以使用纯粹的Java技术来实现(基本上就是将JDBC调用对应至网络协议而已),因此这种类型的驱动程序可以跨平台。使用这种类型驱动程序的弹性高,例如可以设计一个中介组件,JDBC 驱动程序与中介组件间的协议是固定的,如果需要更换数据库系统,则只需要更换中介组件,但客户端不受影响,驱动程序也无须更换,但由于通过中介服务器转换,速度较慢,获得架构弹性是使用这种类型驱动程序的目的。
(4) Type 4: Native Protocol Driver
这种类型驱动程序操作通常由数据库厂商直接提供,驱动程序操作会将 JDBC调用转换为与数据库特定的网络协议,以与数据库进行沟通操作。
由于这种类型驱动程序主要的作用,是将JDBC 调用转换为特定网络协议,所以驱动程序可以使用纯粹Java技术实现,因此这种类型驱动程序可以跨平台,在效能上也能有不错的表现。在不需要如Type 3获得架构上的弹性时,通常会使用这种类型驱动程序,算是最常见的驱动程序类型。
三、基本数据库操作相关的JDBC接口或类是位于java.sql包中。要取得数据库联机,必须有几个动作:
(1)注册 Driver操作对象。(2)取得 Connection操作对象。(3)关闭Connection操作对象。
四、使用JDBC时,要求加载.class文档的方式有4种:MySQL为例
(1)使用class.forName ()。
try { Class.forName ("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { throw new RuntimeException("找不到指定的类"); }
(2)自行建立Driver接口操作类的实例。
java.sql.Driver driver = new com.mysql.jdbc.Driver();
(3)启动JVM时指定jdbc.drivers属性。
> java -Djdbc.drivers=com.mysql.jdbc.Driver; ooo.XXXDriver YourProgram
(4)设定JAR中/services/java.sql.Driver文档。
在驱动程序操作的JAR文档/services文件夹中,放置一个java.sql.Driver文档,当中撰写Driver接口的操作类名称全名,DriverManager 会自动读取这个文档并找到指定类进行注册。
五、取得Connection对象
Connection conn = DriverManager.getConnection( jdbcUrl,username,password);
除了基本的用户名称、密码之外,还必须提供 JDBC URL,其定义了连接数据库时的协议、子协议、数据源识别:
协议:子协议:数据源识别
例如使用MySQL 的话,子协议名称是mysql。“数据源识别”标出数据库的地址、端口号、名称、用户、密码等信息。举个例子来说,MySQL的 JDBCURL撰写方式如下:
jdbe:mysql://主机名:端口/数据库名称?参数=值&参数=值
主机名可以是本机(localhost)或其他联机主机名、地址,MySQL端口默认为3306。例如要连接 demo数据库,并指明用户名称与密码,可以这样指定:
jdbc:mysql://localhost:3306/demo?user=root&password=123456
如果要使用中文存取,还必须给定参数useUnicode 及 characterEncoding,表明是否使用Unicode,并指定字符编码方式。例如(假设数据库表格编码使用UTF8):
jcbc:mysql ://localhost:3306/demo?user=root&password=123&useUnicode=true&characterEncoding=UTF8
有的时候会将JDBC URL 撰写在XML配置文件中,此时不能直接在XML中写&符号,而必须改写为&替代字符。例如:
jdbc:mysql ://localhost:3306/demo ?user=root&password=123&useUnicode=true&characterEncoding=UTF8
如果要直接通过DriverManager的getConnection()连接数据库一个比较完整的代码段如下:
String url ="jdbc:mysql://localhost:3306/demo"; String user - "root"; String password = "openhome"; Connection conn = null; SQLException ex = null; try{ conn = DriverManager.getConnection (url, user, password); ... } catch (SQI.Exception e){ ex =e; } finally { if(conn != nul1) { try { conn.close(); } catch (SQLException e){ if(ex == null){ ex = e; } else { ex.addSuppressed (e); } } } if(ex!= null) { throw new RuntimeException (ex) ; } }
SQLException是在处理JDBC时常遇到的异常对象,为数据库操作过程发生错误时的代表对象。SQLException是受检异常(Checked Exception),必须使用try...catch. . .finally明确处理,在异常发生时尝试关闭相关资源。
六、关闭 Connection操作对象
取得 Connection对象之后,可以使用isclosed()方法测试与数据库的连接是否关闭。在操作完数据库之后,若确定不再需要连接,则必须使用close()来关闭与数据库的连接,以释放连接时相关的必要资源,像是联机相关对象、授权资源等。