JDBC原理之层次结构

目录

  • JDBC的层次结构

    • 前言
    • Collection角色
    • Statement角色
    • ResultSet角色
    • JDBC工作的基本流程

JDBC的层次结构

前言

JDBC API提供了以下接口和类:

  • DriverManager: 这个类管理数据库驱动程序的列表。确定内容是否符合从Java应用程序使用的通信子协议正确的数据库驱动程序的连接请求。识别JDBC在一定子协议的第一个驱动器将被用来建立数据库连接。
  • Driver: 此接口处理与数据库服务器通信。很少直接直接使用驱动程序(Driver)对象,一般使用DriverManager中的对象,它用于管理此类型的对象。它也抽象与驱动程序对象工作相关的详细信息
  • Connection:Driver 或者 DriverManager根据连接的url 和参数信息创建Connection实例,用来维持和数据库的数据通信,如果没有销毁或者调用close()对象,此对象和数据库的对象会一直保持连接;
  • Statement:Connection创建Statement对象,表示需要执行的sql语句或者存储过程;
  • ResultSet: 表示Statement执行完SQL语句后返回的结果集。
  • SQLException: 这个类用于处理发生在数据库应用程序中的任何错误。

总体而言,JDBC包含以下几大角色 : Driver、DriverManager、Connection、Statement、ResultSet。这几大角色之间的层次关系如下图所示:

Collection角色

在一般实际使用情况下,我们关注的Connection的功能有以下几点:

1.创建可以执行sql语句或者存储过程的对象statement,用来和数据库进行交互;
比如,以下代码创建了几种不同类型的Statement:

//加载Oracle数据库驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//根据特定的URL,返回可以接受此URL的数据库驱动对象
Driver driver = DriverManager.getDriver(URL);
//使用数据库驱动创建数据库连接Connection会话
Connection connection = driver.connect(URL, props);
//创建静态的sql语句 Statement 对象来将 SQL 语句发送到数据库。
Statement staticStatement= connection.createStatement();
//创建CallableStatement 对象来调用数据库存储过程。
CallableStatement callableStatement = connection.prepareCall(sqlString);
//创建参数化的Statement对象
PreparedStatement preparedStatement = connection.prepareStatement(sqlString);

2.控制sql语句的事务;

Connection默认情况下,对于创建的statement执行的sql语句都是自动提交的,即在statement语句执行完后,自动执行commit操作,将结果影响到物理数据库。为了满足更好地事务控制需求,我们也可以手动地控制事务,手动地对statement 的sql语句执行进行提交(commit)或者回滚(rollback)。

String sqlString="insert into tableName(column1,column2) values(value1,value2)";
//加载Oracle数据库驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//根据特定的URL,返回可以接受此URL的数据库驱动对象
Driver driver = DriverManager.getDriver(URL);
//使用数据库驱动创建数据库连接Connection会话
connection = driver.connect(URL, props);
//使用自定义的事务,要设置connection不自动提交
connection.setAutoCommit(false);
//创建静态的sql语句 Statement 对象来将 SQL 语句发送到数据库。
Statement staticStatement= connection.createStatement();
try{
//执行插入操作
staticStatement.execute(sqlString);
staticStatement.getConnection().commit();//和上面的connection等价,statement只有一个创建自身的connection的引用
}catch(Exception e)
{
//有异常,则rollback
staticStatement.getConnection().rollback();
}

3.获取数据库连接的元数据,即数据库的整体综合信息。
连接的数据库整体信息被封装在了一个 DatabaseMetaData类型的对象上,可以通过以下代码获得:

    DatabaseMetaData databaseMetaData = connection.getMetaData()

具体DatabaseMetaData内包含了什么信息,请查看 JDK 的API对DatabaseMetaData的描述。

Statement角色

Statement 的功能在于根据传入的sql语句,将传入sql经过整理组合成数据库能够识别的sql语句(对于静态的sql语句,不需要整理组合;而对于预编译sql语句和批量语句,则需要整理),然后传递sql请求,之后会得到返回的结果。
对于查询sql,结果会以ResultSet的形式返回。

SQL语句可以分为增删改查(CRUD,Create,Read,Update,Delete)四种形式,JDBC 从对数据更新与否的角度上看,将上面的四种形式分为两类:查询类别和更新类别。即:

  • 查询类别:select 语句
  • 更新类别:Insert 、update、delete语句

对应地,Statement执行sql的几种形式:

  1. 对sql语句类型不进行区分,执行sql语句的方法;
    statement提供了execute(String sql)方法支持此种形式,定义如下:

  • 如果是执行的sql是查询类型的select语句,此方法会返回true,需要自己再调用 statement.getResultSet() 方法来获取 Resultset结果集;
  • 如果是执行的更新类的sql语句如 update,delete,insert语句,此方法会返回false,自己调用statement.getUpdateCount() 返回sql语句影响的行数。
  1. 对查询类型的sql语句的执行方法
    statement提供了executeQuery(String sql)方法支持此形式,定义如下:

  2. 对更新类的sql语句 的执行方法
    statement提供了executeUpdate(String sql)方法支持此形式,定义如下:
  3. 批量sql的执行方法
    有时候需要将一些sql语句一起提交给数据库,批量执行,statement提供了一些方法,对批量sql的支持:

ResultSet角色

当Statement查询sql执行后,会得到ResultSet对象,ResultSet对象是sql语句查询的结果,作为数据库结果的映射,其映射关系如下图所示。ResultSet对从数据库返回的结果进行了封装,使用迭代器的模式逐条取出结果集中的记录。其遍历结果集的基本形式如下:

while(resultSet.next())
{
//传入列明或者列索引获取记录中对应列的值
resultSet.getXXX(param);
}

ResultSet游标的移动和定位:

Resultset 提供了很多游标定位的方法,部分方法已经在下面列出(部分方法,详情查API):

ResultSet结果集的元数据信息

元信息是指关于 ResultSet 对象中列的类型和属性信息的对象。可以通过以下方法获取:

ResultSet.getXXX(param) 、ResultSet.updateXXX()的XXX问题
JDBC中定义了数据库中的数据类型和java数据类型的映射,用于数据库和Java数据类型之间的转换。在使用ResultSet去记录中的某一列值的时候,用户要根据数据库对应列的数据类型地应的java数据类型,否则的话有可能抛出异常。下图定义了数据库和Java类型之间的映射:

JDBC工作的基本流程

一个基本的JDBC工作流程,分为以下几步:

  1. 加载特定数据库驱动器实现类,并注册驱动器(Driver会注册到DriverManager中);
  2. 根据特定的URL,返回可以接受此URL的数据库驱动对象Driver;
  3. 使用数据库驱动 Driver 创建数据库连接Connection会话;
  4. 使用 Connection对象创建 用于操作sql的Statement对象;
  5. statement对象 .执行 sql语句,返回结果ResultSet 对象;
  6. 处理ResultSet中的结果;
  7. 关闭连接,释放资源。

以下是一个简单的案例:

package com.sxt.reflectdemo05;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class DBConnection {
    static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
    static final String USER_NAME = "xyr";
    static final String PASSWORD = "123456";

public static void main(String[] args) {
    connectionTest();
}

public static void connectionTest() {
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;
    try {
        // 1.加载类,并注册驱动器(Driver会注册到DriverManager中)
        // 加载Oracle数据库驱动
        Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
        // 2.根据特定的URL,返回可以接受此URL的数据库驱动对象
        Driver driver = DriverManager.getDriver(URL);
        Properties props = new Properties();
        props.put("user", USER_NAME);
        props.put("password", PASSWORD);
        // 3.使用数据库驱动创建数据库连接Connection会话
        connection = driver.connect(URL, props);
        // 4.获得Statement对象
        statement = connection.createStatement();
        // 5.执行 sql语句,返回结果
        resultSet = statement.executeQuery("select * from emp");
        // 6.处理结果,取出数据
        while (resultSet.next()) {
            System.out.println(resultSet.getString(2));
        }
        // 7.关闭链接,释放资源
    } catch (ClassNotFoundException e) {
        System.out.println("加载Oracle类失败!");
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        // 使用完成后管理链接,释放资源,释放顺序应该是: ResultSet ->Statement ->Connection
        try {
            resultSet.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
}


以上

@Fzxey

原文地址:https://www.cnblogs.com/fzxey/p/10946762.html

时间: 2024-11-09 00:10:04

JDBC原理之层次结构的相关文章

简述JDBC原理 + 在JAVA中异常是什么 + throws 与 throw 区别 + 简单解释以下JAVA中的多态

JDBC原理: 加:加载驱动 链:创建连接 预:创建预编译 执:执行SQL语句(查询需要处理结果级) 释:关闭链接: DBC中定义了一些接口:  1.驱动管理:  DriverManager  2.连接接口  Connection  DatabasemetaData  3.语句对象接口  Statement  PreparedStatement  CallableStatement  4.结果集接口  ResultSet  ResultSetMetaData JDBC只定义接口,具体实现由各个数

JVM 的 工作原理,层次结构 以及 GC工作原理

JVM Java 虚拟机 Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.JVM实现了Java语言最重要的特征:即平台无关性.原理:编译后的 Java 程序指令并不直接在硬件系统的 CPU 上执行,而是由 JVM 执行.JVM屏蔽了与具体平台相关的信息,使Java语言编译程序只需要生成在JVM上运行的目标字节码(.class),就可以在多种平台上不加修改地运行.Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行.因此实

java篇之JDBC原理和使用方法

JDBC学过但又属于很容易忘记的那种,每次要用到,都要看下连接模式.每次找又很费时间,总之好麻烦呀呀呀,所以写篇博客,总结下原理和常用接口,要是又忘了可以直接来博客上看,嘿嘿. 一.什么是JDBC 1.JDBC全称是 Java DataBase Connectivity,可以为多种关系型数据库DBMS提供统一的访问方式,主要目的是用Java来操作数据库. 2.JDBC API主要负责三个功能:(1)与数据库建立连接(2)发送SQL语句给数据库(3)数据库将结果返回 具体过程大致是这样子的: 3.

JDBC原理

JDBC是什么: Java Database Connectivity:Java访问数据库的解决方案 JDBC是Java应用程序访问数据库的里程碑式解决方案.Java研发者希望用相同的方式访问不同的数据库,以实现与具体数据库无关的Java操作界面. JDBC定义了一套标准接口,即访问数据库的通用API,不同的数据库厂商根据各自数据库的特点去实现这些接口. JDBC只定义接口,具体实现由各个数据库厂商负责. 程序员使用时只需要调用接口,实际调用的是底层数据库厂商的实现部分. 图-2 通过JDBC访

【Spring】Spring JDBC原理与应用实例讲解

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.概述 使用Spring进行基本的JDBC访问数据库有多种选择.Spring至少提供了三种不同的工作模式:Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式.三种模式如下: JdbcTemplate:是Spring中最基本的JDBC模板, 利用JDBC和简单的索引

JDBC原理及常见错误分析

1.JDBC:Java DataBase Connectivity 可以为多种关系型数据库DBMS 提供统一的访问方式,用Java来操作数据库 2.JDBC API 主要功能: 三件事,具体是通过以下类/接口实现: DriverManager : 管理jdbc驱动 Connection: 连接(通过DriverManager产生) Statement(PreparedStatement) :增删改查 (通过Connection产生 ) CallableStatement : 调用数据库中的 存储

JDBC小结

JDBC(java数据连接)是一种用于执行SQL语句的Java API. JDBC是Java访问数据库的标准规范,可以为不同的关系类型数据库提供统一的访问,它由一组用Java语言编写的接口和类组成. MySQL的驱动mysql-connector-java-5.1.37-bin.jar JDBC原理 Java提供访问数据库规范称为JDBC,而生产商提供规范实现类称为驱动. JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库的连接,从而不能操作数据库 开发步骤 准备MySQL数据库驱动包m

jdbc复习笔记

jdbc原理:java提供了一组规范,由各大数据库厂商针对自己的数据库来提供这组规范的实现,这个规范称为jdbc,而实现称之为jdbc驱动表程序 四大核心类: DriverManager ---- getConnection() //获取连接 Connection ------ createStatement //一般语句集 -----  prepareStatement //预编译语句集(防sql攻击,可读性高,效率高.检查语法,编译动作只执行一次,参数化sql语句) Statement --

JDBC实现数据库的增删改查

本文主要讲解: JDBC的概念 JDBC的原理 创建用于测试的数据库 使用JDBC操作数据库 思考与分析 关于JDBC JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API.JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成. 2.JDBC原理: JDBC说白了就是一套AIP接口,一套规范.然后各大数据库的驱动都实现并遵守了这套接口. 3.准备数据库: m