JDBC 是 JAVA 操作数据库的基本技术,并不是唯一技术。本文将对 Java JDBC 编程进行总结,希望能对大家有所帮助。
Hibernate 、 TopLink 等 OR Mapping 操作数据库的技术都是建立 JDBC 技术之上的,实际来说,他们的性能和 JDBC 是有很大差距的,但反过来说,如果 JDBC 用不好,还不如 hibernate 呢。暂且不说这些孰优孰劣的话了,再次主要是对 Java 的基础技术做个总结,以加深认识。 一、 JDBC 的基本原理 JDBC 是 Java 操作数据库的技术规范。他实际上定义了一组标准的操作数据库的接口。为了能让 Java 操作数据库,必须要有实现了 JDBC 这些接口的类,不同的数据库厂商为了让 Java 语言能操作自己的数据库,都提供了对 JDBC 接口的实现 -- 这些实现了 JDBC 接口的类打成一个 jar 包,就是我们平时看到的数据库驱动。由于不同的数据库操作数据的机制不一样,因此 JDBC 的具体实现也就千差万别,但是你作为 java 程序员,你只和 Java JDBC 的接口打交到,才不用理会他们怎么实现的!呵呵,现在知道 JDBC 驱动是怎么回事了。当然,这些类可以自己去写 -- 如果你很牛! 二、 JDBC 编程的步骤 为了说明这个步骤,假设你要通过 java 程序执行一个 sql 查询,你需要按照如下的步骤去走: 1 、创建指定数据库的 URL 这个 URL 实际上还是统一资源定位器,里面包含了一些连接数据库的信息:数据库类型、端口、驱动类型、连接方式、数据库服务器的 ip( 或名字 ) 、数据库名(有的是别名)等。其格式如下: jdbc:subProtocol:subName://DBserverIP:port/DatabaseName 例如 mysql 的一个 url : jdbc:mysql://192.168.3.143:3306/zfvims 2 、加载驱动类到 JVM 内存区域中 有两种方法: 一种是用 Class.forName() 方法加载指定的驱动程序。 一种是将驱动程序添加到 java.lang.System 的属性 jdbc.drivers 中。 最后说明一点,有时候添加到系统的 CLASSPATH 环境变量是不行的,原因是在使用 JDBC 接口操作数据库前, JVM 还没有加载上驱动。 Class.forName("com.mysql.jdbc.Driver") 3 、、通过 DriverManager 类管理驱动、创建数据库连接。 DriverManager 类作用于程序员和 JDBC 驱动程序之间,提供注册管理驱动建立连接细节等方法,它所有成员均为静态的。通过其 getConnection 方法会创建一个 JDBC Connection 对象。 Connection conn=DriverManager.registerDriver("jdbc:mysql://192.168.3.143:3306/zfvims","lavasoft","password"); 4 、 Connection 类 -- 数据库连接 这里所说的 Connection 类实际上是实现了 JDBC 的 Connection 接口的类,这个类一般都是 jdbc 驱动程序实现了。 Connection 类表示了数据库连接,通过其对象可以获取一个获取数据库和表等数据库对象的详细信息。但更多的是通过这个连接更进一步去向数据库发送 SQL 语句去执行,下面会讲到。 数据库的连接的建立是很耗费资源和时间的,因此在不用连接的情况下要通过其 close() 方法将连接关闭,以释放系统资源。 5 、 Statement 类 -- 发送并执行(静态) SQL 语句 通过 Connection 对象的 createStatement() 方法可以创建一个 Statement 对象,通过该对象的方法可以(发送)并执行一个静态 sql 语句。如果要执行动态的 sql ( sql 串中有参数),那么就用 PreparedStatement 类,用法和 Statement 类似。 Statement stmt=con.createStatement() 6 、 ResultSet 类 -- 结果集 当你执行一条 sql 查询后,就会产生一个查询结果。 ResultSet 就表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。 ResultSet 对象具有指向其当前数据行的指针。通过 ResultSet 对象不但可以结果集数据,还可以获取结果集表的列名、数据类型等信息。 ResultSet rs=stmt.executeQuery(sql) 7 、关闭数据库连接 当对 sql 操作完成后,应该关闭数据库连接,这样避免因为连接未关闭而耗费系统资源,如果每次都不关闭,多次操作将建立多个连接,最终数据库连接会达到最大限度,或者耗尽系统的资源,从而导致应用崩溃。因此要注意关闭资源,尤其是数据库连接。 三、 JDBC 编程最基本的实例 下面通过一个执行一条简单的 MySQL 查询来说名上面的 JDBC 编程的一般方法和步骤。 public class TestJDBC(){ public static Connection getConnectionByJDBC() { Connection conn = null; try { //装载驱动类 Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { System.out.println("装载驱动异常!"); e.printStackTrace(); } try { //建立JDBC连接 conn = DriverManager.getConnection(""jdbc:mysql://192.168.3.143:3306/zfvims","lavasoft","password"); } catch (SQLException e) { System.out.println("链接数据库异常!"); e.printStackTrace(); } return conn; } public static String test() { String sqlx = "select t.code,t.name from province t order by t.code asc"; try { //创建一个JDBC声明 Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); //执行查询 ResultSet = stmt.executeQuery(sqlx); while (rs.next()) { String code = rs.getString("code"); String name = rs.getString("name"); System.out.println(code+name); } } catch (SQLException e) { System.out.println(e.getMessage()); e.printStackTrace(); } finally { //预防性关闭连接(避免异常发生时在try语句块关闭连接没有执行) try { if (conn != null) conn.close(); } catch (SQLException e) { System.out.println(e.getMessage()); e.printStackTrace(); } } } public static void main(String args[]) { new TestJDBC().test(); } } 四、 JDBC 编程的陷阱 1 、 conn 一定要在 finally 语句块进行关闭。 2 、 Statement 、 ResultSet 尽可能缩小其变量作用域。 3 、 Statement 可以使用多次,定义多个。一个 Statement 对象只和一个 ResultSet 对象关联,并且是最后一次查询。 4 、 ResultSet 在 Connection 、 ResultSet 关闭后自动关闭。 |