一、什么是JDBC的
JDBC(Java Data Base Connectivity)是一套协议,是JAVA开发人员和数据库厂商达成的协议,也就是由Sun定义一组接口,由数据库厂商来实现,并规定了JAVA开发人员访问数据库所使用的方法的调用规范。
二、JDBC的组成
JDBC有两部分组成:JDBC API和JDBC Driver.
(一) JDBC
API:是Sun提供给开发者的一组独立于数据库的API,JAVA开发人员对任何数据库的操作,都可以用这组API来进行。
JDBC API主要位于JDK中的java.sql包中(之后扩展的内容位于javax.sql包中),主要包括(粉色代表接口,需驱动程序提供者来具体实现):
-
- DriverManager:负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)。
- Driver:驱动程序,会将自身加载到DriverManager中去,并处理相应的请求并返回相应的数据库连接(Connection)。
- Connection:数据库连接,负责与进行数据库间通讯,SQL执行以及事务处理都是在某个特定Connection环境中进行的。可以产生用以执行SQL的Statement。
- Statement:用以执行SQL查询和更新(针对静态SQL语句和单次执行)。
- PreparedStatement:用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)。
- CallableStatement:用以调用数据库中的存储过程。
- SQLException:代表在数据库连接的创建和关闭和SQL语句的执行过程中发生了例外情况(即错误)。
(二)JDBC Driver是由具体数据库开发商,通过实现了上述接口的编写而成的数据库驱动程序,当然,其中也会包括各个DB开发商自己扩展的一些类。各个驱动程序可以到各个数据库官网下载。为了使客户端程序独立于特定数据库驱动程序,JDBC规范建议开发者使用接口编程方式,即尽量使应用依赖java.sql 及javax.sql中的接口和类.具体结构图:
三、使用JDBC驱动连接数据库。
1.首先,下载数据库驱动的Jar包,然后导入。
2.使用如下代码连接到数据库:
1 import java.sql.Connection; 2 import java.sql.DriverManager; 3 import java.sql.ResultSet; 4 import java.sql.Statement; 5 6 public class TestSQL { 7 8 /** 9 * @param args 10 * @throws Exception 11 */ 12 public static void main(String[] args) throws Exception { 13 /* 14 * 通过Class.forName()方法来加载JDBC驱动程序(Driver), 15 * Driver类实例化时会初始化这个类的静态初始化部分,该静态部分,就会调用 16 * java.sql.DriverManager.registerDriver(new Driver()); 17 */ 18 Class.forName("com.mysql.jdbc.Driver").newInstance(); 19 /* 20 * 数据库URL:jdbc:subprotocol:subname 形式, 21 * 其实就是jdbc: + 数据库类型 + 主机名 + 端口号 + 所要使用的数据库名 22 */ 23 String url = "jdbc:mysql://localhost:3306/mydatabase"; 24 String userName = "root"; // 数据库的用户名 25 String password = "password"; // 数据库的密码 26 /* 27 * 调用上述已注册了相应JDBC驱动程序(Driver)的DriverManager, 28 * 通过URL,用户名,密码来获取相应的数据库连接(Connection) 29 */ 30 Connection conn = DriverManager.getConnection(url, userName, password); 31 // 获取Statement 对象用于将 SQL 语句发送到数据库中。 32 Statement stmt = conn.createStatement(); 33 // 执行SQL语句,获取结果集ResultSet 34 ResultSet rs = stmt.executeQuery("select * from person"); 35 // 将获得的结果集输出 36 while(rs.next()) { 37 System.out.println(rs.getString(1)); 38 } 39 // 关闭相应的资源 40 rs.close(); 41 stmt.close(); 42 conn.close(); 43 } 44 }
注:①java.sql.DriverManager:从名字就可以看出是用于驱动程序管理的,它的主要责任是保留一个驱动程序的列表,并通过getConnection方法来给应用程序提供与所请求的URL相匹配的Driver(可能是由于同一个数据库的驱动程序可能是有几种不同的实现方式,但如果DriverManager中对一个URL有多个匹配的Driver,它是不是只选择第一个找到的呢?),并返回 Connection对象,如果找不到就会抛出一个异常,也就是这一句 Connection oConn = DriverManager.getConnection(url,userName,password)。
②Statement 对象用于将 SQL 语句发送到数据库中。实际上有三种 Statement 对象,它们都作为在给定连接上执行 SQL语句的包容器:Statement、PreparedStatement(它从 Statement 继承而来)和CallableStatement(它从 PreparedStatement 继承而来)。它们都专用于发送特定类型的 SQL 语句:Statement 对象用于执行不带参数的简单 SQL 语句;PreparedStatement 对象用于执行带或不带 IN参数的预编译 SQL 语句;CallableStatement 对象用于执行对数据库已存储过程的调用。Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和execute。使用哪一个方法由 SQL 语句所产生的内容决定。
方法 executeQuery 用于产生单个结果集的语句,例如 SELECT 语句。
方法 executeUpdate 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQLDDL(数据定义语言)语句,例如
CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或
DELETE语句的效果是修改表中零行或多行中的一列或多列。executeUpdate
的返回值是一个整数,指示受影响的行数(即更新计数)。对于CREATE TABLE 或 DROP TABLE
等不操作行的语句,executeUpdate 的返回值总为零。
方法 execute用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能,就不介绍了。
③事务处理:JDBC的事务处理简单,在执行多条更新语句后,加conn.commit()或conn.rollback()就可以了。
Ⅰ.关闭Connection的自动提交
conn.setAutoCommit(false);
Ⅱ.执行一系列sql语句:执行新sql前,以前的Statement(或PreparedStatemet)必须close
Statement sm ;
sm = cn.createStatement(insert into user...);
sm.executeUpdate();
sm.close();
sm = cn.createStatement("insert into corp...);
sm.executeUpdate();
sm.close();
Ⅲ.提交
cn.commit();
Ⅳ.如果发生异常,回滚:
cn.rollback();