概述
LOB 代表大对象数据包括 BLOB 和 CLOB 两种类型前者用于存储大块 2进制数据如图片数据视频数据等而后者用于存储长文本数据如论坛帖子内容产品详细描述等值得注意是:在区别数据库中大对象对应字段类型是不尽相同如 DB2 对应 BLOB/CLOBMySql 对应 BLOB/LONGTEXTSqlServer 对应 IMAGE/TEXT需要指出是有些数据库大对象类型可以象简单类型样访问如 MySql LONGTEXT 操作方式和 VARCHAR 类型样在般情况下 LOB 类型数据访问方式区别于其它简单类型数据我们经常会以流方式操作 LOB 类型数据此外LOB 类型数据访问不是线程安全需要为其单独分配相应数据库资源并在操作完成后释放资源最后Oracle 9i 非常有个性地采用非 JDBC 标准 API 操作 LOB 数据所有这些情况给编写操作 LOB 类型数据带来挑战Spring 在 org.springframework.jdbc.support.lob 包中为我们提供了相应帮助类以便我们轻松应对这头拦路虎
Spring 大大降低了我们处理 LOB 数据难度首先Spring 提供了 NativeJdbcExtractor 接口您可以在区别环境里选择相应实现类从数据源中获取本地 JDBC 对象;其次Spring 通过 LobCreator 接口取消了区别数据厂商操作 LOB 数据差别并提供了创建 LobCreator LobHandler 接口您只要根据底层数据库类型选择合适 LobHandler 进行配置即可
本文将详细地讲述通过 Spring JDBC 插入和访问 LOB 数据具体过程不管是以块方式还是以流方式您都可以通过 LobCreator 和 LobHandler 方便地访问 LOB 数据对于 ORM 框架来说JPA 拥有自身处理 LOB 数据配置类型Spring 为 Hibernate 和 iBatis 分别提供了 LOB 数据类型配置类您仅需要使用这些类进行简单配置就可以像普通类型样操作 LOB 类型数据
本地 JDBC 对象
当您在 Web 应用服务器或 Spring 中配置数据源时从数据源中返回数据连接对象是本地 JDBC 对象(如 DB2Connection、OracleConnection)代理类这是数据源需要改变数据连接些原有行为以便对其进行控制:如 Connection#close 思路方法时将数据连接返回到连接池中而非将其真关闭
在访问 LOB 数据时根据数据库厂商区别可能需要使用被代理前本地 JDBC 对象(如 DB2Connection 或 DB2ResultSet)特有 API为了从数据源中获取本地 JDBC 对象 Spring 定义了 org.springframework.jdbc.support.nativejdbc.NativeJdbcExtractor 接口并提供了相应实现类NativeJdbcExtractor 定义了从数据源中抽取本地 JDBC 对象若干思路方法:
思路方法 介绍说明
Connection getNativeConnection(Connection con) 获取本地 Connection 对象
Connection getNativeConnectionFromStatement(Statement stmt) 获取本地 Statement 对象
PreparedStatement getNativePreparedStatement(PreparedStatement ps) 获取本地 PreparedStatement 对象
ResultSet getNativeResultSet(ResultSet rs) 获取本地 ResultSet 对象
CallableStatement getNativeCallableStatement(CallableStatement cs) 获取本地 CallableStatement 对象
有些简单数据源仅对 Connection 对象进行代理这时可以直接使用 SimpleNativeJdbcExtractor 实现类但有些数据源(如 Jakarta Commons DBCP)会对所有 JDBC 对象进行代理这时就需要根据具体情况选择适合抽取器实现类了下表列出了区别数据源本地 JDBC 对象抽取器实现类:
数据源类型 介绍说明
WebSphere 4 及以上版本数据源 org.springframework.jdbc.support.nativejdbc.WebSphereNativeJdbcExtractor
WebLogic 6.1+ 及以上版本数据源 org.springframework.jdbc.support.nativejdbc.WebLogicNativeJdbcExtractor
JBoss 3.2.4 及以上版本数据源 org.springframework.jdbc.support.nativejdbc.JBossNativeJdbcExtractor
C3P0 数据源 org.springframework.jdbc.support.nativejdbc.C3P0NativeJdbcExtractor
DBCP 数据源 org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor
ObjectWeb XAPool 数据源 org.springframework.jdbc.support.nativejdbc.XAPoolNativeJdbcExtractor
下面代码演示了从 DBCP 数据源中获取 DB2 本地数据库连接 DB2Connection 思路方法:
清单 1. 获取本地数据库连接
package com.baobaotao.dao.jdbc;
import java.sql.Connection;
import COM.ibm.db2.jdbc.net.DB2Connection;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.datasource.DataSourceUtils;
public PostJdbcDao extends JdbcDaoSupport implements PostDao {
public void getNativeConn{
try {
Connection conn = DataSourceUtils.getConnection(getJdbcTemplate
.getDataSource); ① 使用 DataSourceUtils 从模板类中获取连接
② 使用模板类本地 JDBC 抽取器获取本地 Connection
conn = getJdbcTemplate.getNativeJdbcExtractor.getNativeConnection(conn);
DB2Connection db2conn = (DB2Connection) conn; ③ 这时可以强制进行类型转换了
…
} catch (Exception e) {
e.prStackTrace;
}
}
}
在 ① 处我们通过 DataSourceUtils 获取当前线程绑定数据连接为了使用线程上下文相关事务通过 DataSourceUtils 从数据源中获取连接是正确做法如果直接通过 dateSource 获取连接则将得到个和当前线程上下文无关数据连接例子
JdbcTemplate 可以在配置时注入个本地 JDBC 对象抽取器要使代码 清单 1 正确运行我们必须进行如下配置:
清单 2. 为 JdbcTemplate 装配本地 JDBC 对象抽取器
…
<bean id="dataSource" ="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
① 定义 DBCP 数据源 JDBC 本地对象抽取器
<bean id="nativeJdbcExtractor"
="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"
lazy-init="true" />
<bean id="jdbcTemplate" ="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
② 设置抽取器
<property name="nativeJdbcExtractor" ref="nativeJdbcExtractor"/>
</bean>
<bean id="postDao" ="com.baobaotao.dao.jdbc.PostJdbcDao">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
在获取 DB2 本地 Connection 例子后我们就可以使用该对象些特有功能了如使用 DB2Connection 特殊 API 对 LOB 对象进行操作
最新评论