老调重弹:JDBC系列 之 JDBC层次结构和基本构成

前言

最近在研究Mybatis框架,由于该框架基于JDBC,想要很好地理解和学习Mybatis,必须要对JDBC有较深入的了解。所以便把JDBC 这个东东翻出来,老调重弹,好好总结一番,作为自己的笔记,也是给读者一个参考~~~本篇博文是我的上篇博文 老调重弹:JDBC系列 之 <驱动加载原理全面解析> 的续文,主要梳理一下JDBC的层次结构和基本构成。以下是本文的组织内容(用户可以点击上面的目录栏查看):

JDBC的层次结构

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

其中,DriverManager 和 Driver 这两个角色已经在我的上一篇文章:老调重弹:JDBC系列 之 <驱动加载原理全面解析>阐述过了,读者可以点击查看。

Connection:Driver 或者 DriverManager根据连接的url 和参数信息创建Connection实例,用来维持和数据库的数据通信,如果没有销毁或者调用close()对象,此对象和数据库的对象会一直保持连接;

Statement:Connection创建Statement对象,表示需要执行的sql语句或者存储过程;

ResultSet: 表示Statement执行完SQL语句后返回的结果集。

基本构成分析Connection角色

Connection表示与特定数据库的连接,可以获取到数据库的一些信息,这些信息包括:其表信息,应该支持的SQL语法,数据库内有什么存储过程,此链接功能的信息等等。

在一般实际使用情况下,我们关注的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)。

具体事务控制,请关注我的 后续博文老调重弹:JDBC系列

下面通过一个简单的例子演示connection的事务控制:

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){//有异常,则rollbackstaticStatement.getConnection().rollback();}

3.获取数据库连接的元数据,即数据库的整体综合信息。

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

DatabaseMetaData databaseMetaData = connection.getMetaData();具体DatabaseMetaData内包含了什么信息,请查看 JDK 的API对DatabaseMetaData的描述。Statement角色

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

开始的时侯,我们就知道,总会有终结。

老调重弹:JDBC系列 之 JDBC层次结构和基本构成

相关文章:

你感兴趣的文章:

标签云: