Java 第十八课:JDBC

一、JDBC是什么
JDBC(Java Database Connectivity)是Java编程语言和数据库之间的与数据库无关连接的标准Java API。从根本上说JDBC是一个规范,它提供了一套完整的接口访问底层数据库API,因此他是可移植的。

  1. JDBC架构设计
    JDBC体系结构由两层组成:
    JDBC API:提供应用程序到JDBC管理器连接。
    JDBC驱动程序API:支持JDBC管理器到驱动程序连接。
    JDBC架构设计图图片来自网络

二、 常见JDBC组件
JDBC API提供以下接口和类 -

DriverManager:此类管理数据库驱动程序列表。 使用通信子协议将来自java应用程序的连接请求与适当的数据库驱动程序进行匹配。在JDBC下识别某个子协议的第一个驱动程序将用于建立数据库连接。
Driver:此接口处理与数据库服务器的通信。我们很少会直接与Driver对象进行交互。 但会使用DriverManager对象来管理这种类型的对象。 它还提取与使用Driver对象相关的信息。
Connection:此接口具有用于联系数据库的所有方法。 连接(Connection)对象表示通信上下文,即,与数据库的所有通信仅通过连接对象。
Statement:使用从此接口创建的对象将SQL语句提交到数据库。 除了执行存储过程之外,一些派生接口还接受参数。
ResultSet:在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。 它作为一个迭代器并可移动ResultSet对象查询的数据。
SQLException:此类处理数据库应用程序中发生的任何错误。

三、 JDBC驱动程序
可以将JDBC驱动程序简单的理解为对JDBC规范完整的实现。它建立了Java程序与数据库服务的通讯渠道。
根据访问数据库的技术不同, JDBC 驱动程序相应地分为四种类型

  1. JDBC-ODBC桥驱动程序(JDBC-ODBC Bridge Driver)
    JDBC-ODBC桥驱动程序
    此类驱动程序由JDBC-ODBC桥和一个ODBC驱动程序组成。其工作原理是,通过一段本地C代码将JDBC调用转化成ODBC调用。这一类型必须在本地计算机上先安装好ODBC驱动程序,然后通过JDBC-ODBCBridge的转换,将Java程序中使用的JDBCAPI访问指令转化成ODBCAPI指令,进而通过ODBC驱动程序调用本地数据库驱动代码完成对数据库的访问。

  2. 部分Java的本地JDBCAPI驱动程序
    本地JDBCAPI驱动程序
    JDBC API驱动程序(Anative API partly Java technology-enabled Driver)此类驱动程序也必须在本地计算机上先安装好特定的驱动程序(类似ODBC),然后通过PartialJavaJDBCDriver的转换,把Java程序中使用的JDBC API转换成NativeAPI,进而存取数据库。

  3. 纯Java的数据库中间件驱动程序
    纯Java的数据库中间件驱动程序
    纯Java的数据库中间件驱动程序(Pure Java Driver for Database Middleware)使用这类驱动程序时,不需要在本地计算机上安装任何附加软件,但是必须在安装数据库管理系统的服务器端加装中间件(Middleware),这个中间件负责所有存取数据库时必要的转换。其工作原理是:驱动程序将JDBC访问转换成与数据库无关的标准网络协议(通常是HTTP或HTTPS)送出,然后再由中间件服务器将其转换成数据库专用的访问指令,完成对数据库的操作。中间件服务器能支持对多种数据库的访问。

  4. 纯Java的JDBC驱动程序
    纯Java的JDBC驱动程序
    纯Java的JDBC驱动程序(Direct-to-DatabasePureJavaDriver)这类驱动程序是直接面向数据库的纯Java驱动程序,即所谓的"瘦"驱动程序。使用这类驱动程序时无需安装任何附加的软件(无论是本地计算机或是数据库服务器端),所有存取数据库的操作都直接由JDBC驱动程序来完成,此类驱动程序能将JDBC调用转换成DBMS专用的网络协议,能够自动识别网络协议下的特殊数据库并能直接创建数据连接。

四、JDBC应用开发

  1. 步骤:
    <1> 导入JDBC包:导入编程开发所需要的JDBC包,一般使用import java.sql.*;就可以了。
    <2> 注册JDBC驱动程序:使JVM将所需的驱动程序实现加载到内存中,从而可以满足JDBC请求。

    方法1:
    Class.forName()方法。将驱动程序的类文件动态加载到内存中,并将其自动注册。这个方法是推荐使用的方法,因为它使驱动程序注册可配置和便携。
    语法:

     Class.forName(driverName);	//	driverName参考表1
    

    实例:

     Class.forName("com.mysql.jdbc.Driver");
    

    方法2:
    DriverManager.registerDriver()方法。使用静态DriverManager.registerDriver()方法来注册驱动程序。
    如果使用的是非JDK兼容的JVM(如Microsoft提供的),则应使用registerDriver()方法。
    语法:

     DriverManager.registerDriver();
    

    实例:

     try {
     	Driver myDriver = new oracle.jdbc.driver.OracleDriver();
     	DriverManager.registerDriver( myDriver );
     }
     catch(ClassNotFoundException ex) {
     	System.out.println("Error: unable to load driver class!");
     	System.exit(1);
     }
    

    表1、JDBC驱动程序名称和数据库URL

    RDBMS JDBC驱动程序名称 URL格式
    ySQL com.mysql.jdbc.Driver jdbc:mysql://hostname/databaseName
    RACLE oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@hostname:portNumber:databaseName
    ostgreSQL org.postgresql.Driver jdbc:postgresql://hostname:port/dbname
    B2 com.ibm.db2.jdbc.net.DB2Driver jdbc:db2:hostname:port Number/databaseName
    ybase com.sybase.jdbc.SybDriver jdbc:sybase:Tds:hostname: portNumber/databaseName

    <3> 打开一个连接:使用DriverManager.getConnection()方法创建一个Connection对象,这个对象表示与数据库的物理连接。
    语法:

     DriverManager.getConnection(String url);//	URL参考表1
    

    实例:

     final String url = "jdbc:mysql://localhost:3306/testDB_01";
     final String user = "root";
     final String passwd = "123";
     conn = DriverManager.getConnection(url, user, passwd);
    

    <4> 执行查询:使用类型为Statement的对象来构建和提交SQL语句到数据库。

     获得了与数据库的连接后,就可以与数据库进行交互了。 JDBC Statement,CallableStatement和PreparedStatement接口定义了可用于发送SQL或PL/SQL命令,并从数据库接收数据的方法和属性
    

    表2. 接口使用说明

    接口 推荐使用
    Statement 用于对数据库进行通用访问,在运行时使用静态SQL语句时很有用。 Statement接口不能接受参数。
    reparedStatement 当计划要多次使用SQL语句时使用。PreparedStatement接口在运行时接受输入参数。
    allableStatement 当想要访问数据库存储过程时使用。CallableStatement接口也可以接受运行时输入参数。

    语法:

    <5> 提取数据:使用相应的ResultSet.get×××()方法从结果集中检索数据。
    <6> 清理资源:显示的关闭所有数据库资源。

package lesson4;

import java.sql.*;

public class JavaLesson4 {
	public static void javaJDBCTest() {
		final String url = "jdbc:mysql://localhost:3306/testDB_01";
		final String user = "root";
		final String passwd = "123";
		
		Connection conn = null;
		Statement stmt = null;
		ResultSet rset = null;
		
		try {
			// 1. register
			Class.forName("com.mysql.jdbc.Driver");
			System.out.println("Register ok...");

			// 2. connect
			conn = DriverManager.getConnection(url, user, passwd);
			System.out.println("connect ok...");
			
			// 3. 
			stmt = conn.createStatement();
			System.out.println("Get statement ok...");
			rset = stmt.executeQuery("SELECT id, age, tel, email FROM Students");
			System.out.println("Proc sql...");
			
			// 4. 
			while (rset.next()) {
				int id = rset.getInt("id");
				int age = rset.getInt("age");
				String tel = rset.getString("tel");
				String email = rset.getString("email");
				System.out.println("id: " + id + " age: " + age + " tel: " + tel + " email: " + email);
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				rset.close();
				conn.close();
				stmt.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	
	public static void main(String [] args) {
		System.out.println("Lesson for JDBC...");
		javaJDBCTest();
	}
}
输出结果:
Lesson for JDBC...
Register ok...
connect ok...
Get statement ok...
Proc sql...
id: 1 age: 22 tel: 13111112222 email: [email protected]
id: 2 age: 20 tel: 13101002222 email: [email protected]
id: 2 age: 21 tel: 13101008868 email: [email protected]
id: 4 age: 22 tel: 13401008868 email: [email protected]

参考资料:
易百教程
百度百科

猜你喜欢

转载自blog.csdn.net/qq_39440596/article/details/88892138