MyBatis 源码学习1——JDBC规范

mybatis框架是对JDBC API的轻量级封装,所以先学习下JDBC规范。

一、JDBC API简介

JDBC(java database connectivity):java语言中提供的访问关系型数据库的接囗。

二、JDBC操作数据源的步骤:

1.与数据源建立连接:API中定义了Connection接囗,用来表示与底层数据源的连接。
有两种获得Connection对象的方式
a.DriverManager:加载JDBC驱动,调用getConnection()方法,获取Connection对象
b.DataSource:一个DataSource对象属性被设置后,代表一个数据源,调用getConnection()方法,获取Connection对象
注意:
JDBC API只提供了DataSource接囗,不提供实现,具体的实现收JDBC驱动程序提供,mytatis框架也提供了DataSource接囗的实现

JDBC API定义了两个DataSource:
ConnectionPoolDataSource:支持缓存和复用Connection对象
XADataSource:支持分布式事务

2.执行sql语句
DatabaseMetadata接囗:其实例可以确认数据源是否支持某一特性
Statement接囗:SQL语句执行器

3.检索sql执行结果
ResultSet接囗:其实现类封装了对SQL查询的结果
ResultSetMetaData对象:通过ResultSet对象的getMetaData()获得存放结果集元数据信息

4.关闭连接
例如:
在这里插入图片描述

三、JDBC API中的类与接囗

JDBC API主要有两个包
java.sql包:涵盖了JDBC最核心的API
1.数据类型
2.枚举
3.API相关
4.驱动相关
5.异常
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
java.sql包核心类之间的关系在这里插入图片描述javax.sql
1.数据源
2.连接池相关
3.ResultSet扩展
4.分布式扩展
在这里插入图片描述
连接池的调用关系
在这里插入图片描述

RowSet:数据源与应用程序在内存中的映射

RowSet与ResultSet之前的关系:
在这里插入图片描述

四、Connection

两种获得Connection对象的方式
a.DriverManager:加载JDBC驱动,调用getConnection()方法,获取Connection对象
b.DataSource:一个DataSource对象属性被设置后,代表一个数据源,调用getConnection()方法,获取Connection对象

Drive接囗:所有JDBC驱动都要实现此接囗,并且实现类必须包含一个静态初始化代码块,作用:向DriveManager注册一个自己的实例。

DriverManager接囗:通过Driver接囗为JDBC客户端管理一组可用的驱动实现,其实现类初始化时会加载所有驱动。
registerDriver():将驱动的实现类注册到DriverManager中,驱动加载时隐式地调用,在每个驱动实现类的静态初始化代码块中调用
getConnection():提供给JDBC客户端调用。

DataSource接囗:DataSource对象用于表示能够提供数据库链接的数据源对象。可以通过逻辑名来获取DataSource对象,使用JNDI把一个逻辑名和数据源对象建立映射关系。

JNDI(java naming and directory interface,java命令和目录接囗):为应用程序提供了一种通过网络访问远程服务的方式,JDK中只提供了JNDI的规范,具体实现由不同的服务器厂商来完成。

DriverAction接囗:监听DriverManager类的deregisterDriver()方法的调用 。

两种加载驱动的方式
1.显示加载驱动:Class.forName(“com.mysql.cj.jdbc.Driver”);
2.隐匿加载驱动:借助SPI(service Provider Interface)是JDK内置的一种服务提供发现机制,其中查找服务实现的工具是java.util.ServiceLoader,不做详细解释。

关闭Connection对象
close():显式地关闭,调用该方法后,所有由Connection对象创建的Statement对象都会被关闭。
isClosed():判断应用是否调用了close()方法关闭Connection对象,但不能用于判断数据库连接是否有效。
isValid():判断数据库连接是否有效。

五、Statement

Statement接囗:JDBC API操作数据库的核心接囗,具体实现由JDBC驱动来完成。
创建:调用Connection对象的createStatement()方法,每个Connection对象可以创建多个Statement对象。

Statement接囗:不支持参数输入
常用方法
execute(String sql)
ResultSet getResultSet()
boolean execute(String sql, int autoGeneratedKeys)
其中autoGeneratedKeys指定insert语句时,自动生成的键能否被检索
ResultSet getGeneratedKeys()

PreparedStatement接囗:增加参数占位符的功能,用"?"代表占位符 ,其实例代表可以被预编译的sql语句。
设置参数:setObject(int parameterIndex, Object x)
获得参数信息:ParameterMetaData getParameterMetaData()

CallableStatement接囗:增加了调用存储过程以及检索存储过程调用结果的方法
registerOutParameter()

六、ResultSet

ResultSet接囗:提供了检索和操作sql执行结果相关的方法,接囗的实现类封装了sql查询的结果,可以对ResultSet进行遍历,通过getxxx()方法获取查询结果集.

三种不同类型:
TYPE_FORWARD_ONLY:ResultSet不同滚动,只能向前移动。
TYPE_SCROLL_INSENSITIVE:ResultSet可滚动,对数据库不敏感。
TYPE_SCROLL_SENSITIVE:ResultSet可滚动,对数据库敏感,即ResultSet未关闭时,对ResultSet对象修改会直接影响数据库中的记录。
数据库驱动支持的类型,可通过DatabaseMetaData接囗提供一个supportsResultSetType()方法来判断。

并行性:
CONCUR_READ_ONLY:只能读,不能改动ResultSet中的数据。
CONCUR_UPDATABLE:既能读又能写。

可保持性:
HOLD_CURSORS_OVER_COMMIT:当调用Connection对象的commit()方法时,不关闭当前事务创建的ReusltSet对象。
CLOSE_CURSORS_AT_COMMIT:当调用Connection对象的commit()方法时,自动关闭当前事务创建的ReusltSet对象。

关闭ResultSet对象:
显示地关闭:
1.调用ResultSet对象的close()方法
2.创建ResultSet对象的Statement或者Connection对象被显示地关闭。
隐式地关闭
1.相关联的Statement对象重复执行
2.可保持性为CLOSE_CURSORS_AT_COMMIT,调用Connection对象的commit()方法时。

七、DatabaseMetaData

DatabaseMetaData接囗:由JDBC驱动实现,用于提供底层数据源相关的信息。

创建:调用Connection对象的getMetadata()方法

方法类型主要为5类:
1.获取数据源信息,如getURL(),getUserName()
2.确认数据源是否支持某一特性或功能,如supportsStoredProcedures()
3.获取数据源的限制,如getMaxConnections()
4.确定数据源包含哪些sql对象及其属性,如getPrimaryKeys()
5.获取数据源对事务的支持,如supportsTransactions()

八、JDBC事务

并发访问带来的问题:
1.脏读
2.不可重复读
3.幻读

事务隔离级别:事务中对数据的操作对其他事务的"可见性",Connection对象的默认事务级别是由JDBC驱动程序指定的,它是底层数据源支持的事务隔离级别.
1.TRANSACTION_NONE:驱动不支持事务
2.TRANSACTION_READ_UNCOMMITTED,读未提交,会出现脏读,不可重复读,幻读。
3.TRANSACTION_READ_COMMITTED:读提交,会出现不可重复读,幻读。
4.TRANSACTION_REPEATABLE_READ:可重复读,会现幻读。
5.TRANSACTION_SERIALIZABLE:并发效率认错

使用:调用Connection对象的setTransactionlsolation()设置对象的事务隔离级别。

事务中的保存点:通过在事务中标记一个中间点来对事务进行更细粒度的控制,调用Connection对象的setSavePoint()方法设置保存点,方法返回的Savepoint对象可以作为
Connection对象rollback()方法的参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值