【MyBatis源码-1】JDBC

  1. Connection是JDBC对数据连接的抽象,可以通过 DriverManager和DataSource获得Connection对象。
  2. Statement接口可以理解为JDBC API中提供的SQL语句执行器,定义了执行SQL语句的方法。
  3. 通过Statement接口提供的getResultset()来获取查询结果集、通过getUpdateCount()获取更新操作影响的行数。
  4. PooledConnection表示与数据库建立的物理连接,当应用程序调用DataSource的getConnection()时,它返回一个Connection对象。但是当我们使用数据库连接池时(如Druid),该Connection对象实际上是到PooledConnection的句柄,这是个物理连接。
  5. RowSet对象可以建立一个与数据源的连接,并在整个生命周期中维持该连接,在这种情况下,该对象被称为连接的RowSet。
  6. 非连接RowSet可以在短开始更改数据,然后将这些更改写回底层数据源,不过得重新建立连接,才能完成此操作
  7. RowSet的离线操作能够有效的利用计算机越来越充足的内存,减轻数据库服务器的负担。
  8. RowSet默认是一个可滚动、可更新、可序列化的结果集。
  9. SPI(Service Provider Interface)是jdk内置的一种服务提供发现机制。
  10. 使用 DataSource对象可以提高应用程序的可移植性,应用程序通过逻辑名称来获取DataSource对象,JNDI(Java Naming and Directory Interface)把一个逻辑名称和数据源对象建立映射关系。
  11. 实现接口DataSource的类可以提供的功能有:通过连接池提高系统性能和可伸缩性、支持分布式事务
  12. 使用isValid()判断链接是否有效
  13. PrepareStatement接口中增加了一些方法,可以为占位符设置值。使用PrepareStatement实例执行SQL语句时,可以使用“?”作为参数占位符,JDBC驱动通过getAsciiStream、getUnicodeStream、SetBoolean()、SetInt()、SetString()、SetObject()、SetNull()等方法来为占位符设置值。
  14. JDBC Type 和Java Type的对应关系
JDBC TypeJava Type
CHARString
VARCHARString
LONGVARCHARString
NUMERICjava.math.BigDecimal
DECIMALjava.math.BigDecimal
BITboolean
BOOLEANboolean
TINYINTbyte
SMALLINTshort
INTEGERINTEGER
BIGINTlong
REALfloat
FLOATdouble
DOUBLEdouble
BINARYbyte[]
VARBINARYbyte[]
LONGVARBINARYbyte[]
DATEjava.sql.Date
TIMEjava.sql.Time
TIMESTAMPjava.sql.Timestamp
CLOBClob
BLOBBlob
ARRAYArray
  1. CallableStatement接口用于调用存储过程
  2. ResultSet的类型主要体现在:
    1. 游标可操作
    2. ResultSet对象的修改会影响数据库的值
  3. ResultSet的并行性决定了它支持更新的级别
    1. CONCUR_READ_ONLY:只能从ResultSet中读数据,不能更新ResultSet中的数据
    2. CONCUR_UPDATABLE :既可以从ResultSet读书据,也可以更新ResultSet数据
  4. ResultSet的可保持性:
    1. HOLD_CONSORS_OVER_COMMIT:当调用Connection对象的commit()方法时,不关闭当前事物创建的ResultSet对象
    2. HOLD_CONSORS_AT_COMMIT:当调用Connection对象的commit()方法时关闭当前事物创建的ResultSet对象,可以提高系统性能
  5. 下面的代码修改了一行ResultSet中的数据,并调用updateRow将修改应用到数据库
    ResultSet rs = statement.executeQuery("select ...");
    rs.next();
    rs.updateString("key", "value");
    rs.updateRow();
    
  6. deleteRow会删除数据库中对应的行
  7. 关闭ResultSet对象的两种方法:
    • 显式关闭:
      • 调用ResultSet的close方法
      • 创建ResultSet对象的Statement或Connection被显式的关闭
    • 隐式关闭:
      • 相关联的Statement重复执行
      • 可保持性为HOLD_CONSORS_AT_COMMIT的ResultSet对象在当前事物提交之后会被关闭
  8. 数据并发访问会出现的问题:
    1. 脏读——发生在事务中允许读未提交读数据,如:A事务修改了一条数据,没有commit,此时B事务可以读到A事务没有commit的修改,一旦A回滚,B就读到了脏数据。
    2. 不可重复读,如:A事务中读取一行数据,B事务修改了该行数据,A事务再次读的时候,将得到不同的结果
    3. 幻读,A事务中通过where读取若干行数据,B事务插入若干行符合该条件的数据,A事务再次读的时候,将得到不同的结果
  9. 事务隔离级别
    1. TRANSACTION_READ_UNCOMMITTED:允许事务读取未提交更改的数据,可能出现脏读、不可重复读、幻读
    2. TRANSACTION_READ_COMMITTED:事务中进行的任何修改,在提交之前对其他事务不可见,可能出现不可重复读和幻读
    3. TRANSACTION_REPEATABLE_READ:可重复读,不能解决幻读
    4. TRANSACTION_SERIALIZABLE:串行执行,可解决三个问题,但是效率低下
  10. Connection接口提供setSavepoint()方法用于在当前事务设置保存点,方法的返回值是Savepoint对象,可作为rollback的参数,用于回滚到对应的保存点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值