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