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