JDBC学习

jopen 10年前

java的持久层,与数据库打交道,其实最终的底层实现都是通过JDBC相关的接口和类来完成。

JDBC,主要涉及以下一些主要的接口和类:

1、java.sql.DriverManager:管理一组JDBC驱动程序的基本服务。该类包以下几个主要的方法:
1)registerDriver(java.sql.Driver driver):向DriverManager注册给定的驱动程序。
通常,每个数据库驱动程序类,都会在静态的代码模块中,调用DriverManager.registerDriver,将自己注册到DriverManager。程序还可以使用这种方式显式地加载JDBC驱动程序:Class.forName("my.sql.Driver");
2)getDriver(String url):根据connectionUrl,从已注册的驱动程序集中,查找能理解给定connectionUrl的驱动程序。每个驱动程序,都会实现Driver接口的acceptsURL方法,该方法用来判断该驱动程序能否理解这种connectionUrl。
3)getDrivers():获取当前已加载的所有JDBC驱动程序。
4)getConnection():DriverManager试图从已注册的驱动程序中,选择一个适当的驱动程序,然后建立到给定数据库URL的连接。
Connection con = DriverManager.getConnection(url, username, password);

2、java.sql.Driver:每个驱动程序类必须实现的接口。
每个驱动程序都应该提供一个实现Driver接口的类。在加载某一Driver类时,它应该创建自己的实例,并向DriverManager注册该实例。这意味着用户可以通过调用以下程序加载和注册一个驱动程序:
Class.forName("foo.bah.Driver")
Driver两个主要的方法:
1)Connection connect(String url, java.util.Properties info)
2)boolean acceptsURL(String url)

3、java.sql.Connection:与特定数据库的连接会话,在连接上下文中执行SQL语句并返回结果。
默认情况下,Connection对象处于自动提交模式下,这意味着它在执行每个语句后都会自动提交更改。如果禁用自动提交模式,为了提交更改,必须显式调用commit方法,否则无法保存数据库变更。
Connection可以通过DriverManager获取,也可以通过新的API DataSource获取。

4、java.sql.Statement:用于执行静态SQL语句并返回它所生成结果的对象。
在默认情况下,同一时间,每个Statement对象只能打开一个ResultSet对象
Statement stmt = conn.createStatement();

5、java.sql.PreparedStatement(继承了Statement):表示预编译的SQL语句对象。SQL语句被预编译并且存储在PreparedStatement对象中,然后可以使用此对象高效地多次执行该语句。
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES                                       SET SALARY = ? WHERE ID = ?");

6、java.sql.CallableStatement(继承了PreparedStatement):用于执行SQL存储过程的接口。
CallableStatement cstmt = con.prepareCall("xxx");

7、java.sql.ResultSet:表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
默认的ResultSet对象不可更新,仅有一个向前移动的指针。因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。
ResultSet接口提供用于从当前行检索列值的获取方法,可以使用列的索引编号或列的名称检索值。一般情况下,使用列索引较为高效。列从1开始编号。使用列名称,不区分大小写。
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
 
8、java.sql.ResultSetMetaData:可用于获取关于ResultSet对象中列的类型和属性信息的对象。
ResultSetMetaData rsmd = rs.getMetaData();

9、java.sql.ParameterMetaData:可用于获取关于PreparedStatement对象中参数的类型和属性信息的对象。
ParameterMetaData pmd = pstmt.getParameterMetaData();

10、java.sql.DatabaseMetaData:关于数据库的整体综合信息。
DatabaseMetaData dmd = connection.getMetaData();

JDBC 2.0 新增的API
11、javax.sql.DataSource:是JDBC2.0 API中新增的内容,它提供了连接到数据源的另一种方法。作为DriverManager设施的代替项,DataSource对象是获取连接的首选方法。实现DataSource接口的对象通常基于JNDI API的命名服务中注册。
通过DataSource对象访问的驱动程序不会向DriverManager注册。
Connection con = dataSource.getConnection();

12、javax.sql.PooledConnection:为连接池管理提供挂钩的对象。PooledConnection对象表示到数据源的物理连接(Connection表示逻辑连接)。该连接在应用程序使用完后可以回收而不用关闭,从而减少了需要建立连接的次数。
应用程序员不直接使用PooledConnection接口,而是使用Connection接口。当应用程序关闭连接时,它调用Connection.close()方法关闭逻辑连接,而基础物理连接会被回收而不是被关闭。在连接池管理器调用PooledConnection.close()方法之前,物理连接不会被关闭。

13、javax.sql.ConnectionPoolDataSource:PooledConnection对象的工厂。实现此接口的对象通常在JNDI的命名服务中注册。

 

程序访问数据库,也存在编码的问题

Oracle通常使用的字符集是ISO-8859-1,而程序使用的字符集是GBK(或UTF-8),因此为了解决编码不一致导致乱码的问题,通常会在数据库驱动程序中提供编码和解码的功能。(当然,如果数据库和程序使用的字符集是一致的,则不需要进行编码解码)

举例:客户端程序使用GBK字符集,而Oracle使用ISO-8859-1字符集。

1)往数据库插入数据前,先对要插入的字符串数据进行编码:

String res = new String(str.getBytes("GBK"), "ISO-8859-1");

2)从数据库查询数据后,需要对查询结果的字符串数据进行解码:

String res = new String(str.getBytes("ISO-8859-1"), "GBK");