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 blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {// 使用完成后管理链接,释放资源,释放顺序应该是: ResultSet ->Statement ->Connectiontry {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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java异常处理机制很有意思

版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/43015379 前言:在网络上看到一篇《深入理解Java异常处理机制》,看完感觉自己也有一点小想法,的确在很多Java学者的眼里&…

你如何去管理你的团队?

一下是我自己也不知道如何去回答的问题,或者只是想着这么解决,写在这里,那一天等我知道答案了再来给自己解答和完善。 作为一个团队负责人,你如何去管理的你团队,你怎么样来做开始启动你的团队,计划&#x…

2019-5-30-websocket下readyState常量

0 (CONNECTING) 正在链接中1 (OPEN) 已经链接并且可以通讯2 (CLOSING) 连接正在关闭3 (CLOSED) 连接已关闭或者没有链接成功转载于:https://www.cnblogs.com/zhangjiajun9404/p/10947697.html

Java自动注入默认_java – 自动注入与Spring

更新:2016年2月自动装配将在Spring Framework 4.3中正式支持。实现可以在这个GitHub commit看到。你不能自动安装的最终原因是Spring的DefaultListableBeanFactory.findAutowireCandidates(String,Class,DependencyDescriptor)方法的实现明确…

摘要

《秦前历史》13章 姜子牙 有一天,武王姬发问姜子牙:“我打算减轻刑罚而又能 树立我的权威,少施行一些赏赐而又能使人们从善,少颁布一些政令法规而民众又都能自觉按一定的规范行事。请问师尚父,怎样做才能实现这一点呢&…

关于ole

在word文档里,当插入一个图片或是电子表格,从而生成一个复合文档,这其中用到ole规范OLE文档:完善了早期的混合文档功能,不仅支持简单链接和嵌入,还支持在位激活、拖放等功能有一片文章你可以看看OLE概述 OL…

Uva489

Hangman Judge UVA - 489 In “Hangman Judge,” you are to write a program that judges a series of Hangman games. For each game, the answer to the puzzle is given as well as the guesses. Rules are the same as the classic game of hangman, and are given as f…

HTML5实现刮奖效果

原文:HTML5实现刮奖效果要实现刮奖效果,最重要的是要找到一种方法:当刮开上层的涂层是就能看到下层的结果。而HTML5的canvas API中有一个属性globalCompositeOperation,这个属性有多个值,而实现刮奖效果要用到的值就是destination…

Java多线程复习_Java多线程复习

一、线程的基本概念简单的说:线程就是一个程序里不同的执行路径在同一个时间点上cpu只会有一个线程在执行Java里的多线程是通过java.lang.Thread类来实现的每个线程都拥有自己独立的方法栈空间二、java线程的创建和启动第一种定义线程类实现Runnable接口Thread myTh…

HTML段落自动换行的样式设置

在HTML的P标记中,默认情况下是自动换行的。 如果你的段落是由中文字符或者英文单词组成的,这基本没什么问题。但是如果你的段落是由不间断的英文字母(浏览器会认为是一个单词)组成,则默认情况下不会换行,将…

DES加密/解密

1 /// <summary>2 /// DES加密(数据加密标准&#xff0c;速度较快&#xff0c;适用于加密大量数据的场合)3 /// </summary>4 /// <param name"EncryptString">待加密的密文</param>5 /// <param name&qu…

Spring中使用Spark连接的DataSource

在Spring中配置Spark hive-thriftserver的连接DataSource与配置其他数据源连接方式是一样的&#xff0c;如一般Oracle数据源配置&#xff0c;使用如下必须的Jar包&#xff1a;使用JDBC程序示例&#xff1a;package com.hadoop.test;import java.sql.Connection; import java.sq…

中文字符匹配java_java正则匹配HTML中a标签里的中文字符示例

java正则匹配HTML中a标签里的中文字符示例发布于 2020-8-12|复制链接摘记: 本文实例讲述了java正则匹配HTML中a标签里的中文字符。分享给大家供大家参考&#xff0c;具体如下&#xff1a;今天群里一位朋友问到了一个正则表达式的问题&#xff0c;有如下内容&#xff1a;xhtml特…

多语言制作工具(2013-01-24更新,支持VS2005、2008、2010、2012)(已开源)

前一段时间&#xff0c;制作了一个多语言资源文件制作工具&#xff0c;现在把这个工具集成到VS2005、VS2008&#xff0c;vs2010中&#xff0c;以增加VS自身资源编辑界面&#xff0c;对多资源编辑的麻烦&#xff0c;简化多语言资源文件的制作。 这个插件是和VS的项目绑定的&…

尚学人工智能课程---1、大数据和人工智能介绍

尚学人工智能课程---1、大数据和人工智能介绍 一、总结 一句话总结&#xff1a; 机器学习是什么&#xff1a;数据背后体现的客观算法&#xff1a;人在电脑上留下的大量日志可以反映人的性格和习惯 深度学习是什么&#xff1a;神经网络如果深度大于3&#xff0c;就是深度学习 神…

Flatten Binary Tree to Linked List (DFS)

Given a binary tree, flatten it to a linked list in-place. For example,Given 1/ \2 5/ \ \3 4 6The flattened tree should look like: 1\2\3\4\5\6代码&#xff1a; class Solution{ public:void flatten(TreeNode *root) {if(rootNULL) return;TreeNode* proot-…

mysql 回表查询优化_MySQL优化:如何避免回表查询?什么是索引覆盖?

转自&#xff1a;https://mp.weixin.qq.com/s?__bizMjM5ODYxMDA5OQ&mid2651962609&idx1&sn46e59691257188d33a91648640bcffa5&chksmbd2d092d8a5a803baea59510259b28f0669dbb72b6a5e90a465205e9497e5173d13e3bb51b19&mpshare1&scene1&srcid&sh…

安装 Windows 自动化 API 3.0 后,Visual Studio 2010 的运行速度更快

安装 Windows 自动化 API 3.0 后&#xff0c;Visual Studio 2010 的运行速度更快 本文适用于以下产品&#xff1a; Microsoft Visual Studio 2010如果未安装 Windows 自动化 API 3.0&#xff0c;则使用 Windows 自动化 API 的应用程序会明显降低 Microsoft Visual Studio Inte…

cocos2d-x3.2创建项目

mac&#xff1a; 1.用终端进入/Users/lixiang/Desktop/cocos2d-x-3.2/tools/cocos2d-console/bin目录执行./cocos.py。 &#xff08;出现Permission denied&#xff0c;是权限问题&#xff0c;可以先使用chmod命令获得权限&#xff0c;输入chmod ux ./cocos.py 回车&#xff0c…

使用ASP.Net WebAPI构建REST服务(一)——简单的示例

由于给予REST的Web服务非常简单易用&#xff0c;它越来越成为企业后端服务集成的首选方法。本文这里介绍一下如何通过微软的Asp.Net WebAPI快速构建REST-ful 服务。 首先创建一个Asp.Net Web应用程序&#xff08;我这里用的是Visual Studio 2013&#xff0c;它已经内置了Web AP…