Spring Framework から Oracle の CLOB や BLOG を扱う事がある。

Oracle9i の頃から、LOB にはちょっと苦労させられた。

9iの頃のJDBCドライバ(Thin)では、文字数の制約で色々めんどくさかったけど、

10g以降のJDBCドライバでは、いい感じに変換してくれるのか、CLOBフィールドの参照系ならVARCHAR感覚でコーディングできてた。

でも、更新系では手抜きが通じない。

8000バイト位(多分8192バイト)を超える文字列をInsert/Updagteすると、文字列が一部欠落してしまう。

こっちはいい感じに変換してくれない。

仕方ないから、LobHandlerを使ってちゃんと書いた(つもり)。

Spring は未だに 1.2 を使ってマス。

Sprint 2系でも、いっしょじゃないだろうか。

設定はこんな感じで、lobHanderをインジェクションする。

<bean id=”lobHandler” class=”org.springframework.jdbc.support.lob.OracleLobHandler”>

<property name=”nativeJdbcExtractor” ref=”nativeJdbcExtractor”/>

</bean>

<bean id=”nativeJdbcExtractor” class=”org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor”/>

<bean id=”abstractDao” abstract=”true”>

<property name=”dataSource”>

<ref bean=”dataSource” />

</property>

</bean>

<bean id=”hogeDao” parent=”abstractDao”

class=”your.package.dao.HogeDaoImpl” >

<property name=”lobHandler”>

<ref bean=”lobHandler” />

</property>

</bean>

org.springframework.jdbc.object.SqlUpdate を継承したクラスを作る。

Types は CLOBに。後は特に留意点なし。

package your.package.dao.sql;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Types;

import javax.sql.DataSource;

import org.springframework.jdbc.core.SqlParameter;

import org.springframework.jdbc.object.SqlUpdate;

public class Create extends SqlUpdate {

public Create(DataSource ds) {

super(ds, QUERY);

super.declareParameter(new SqlParameter(Types.INTEGER)); // ID

super.declareParameter(new SqlParameter(Types.CLOB)); // Clob Data

compile();

}

private static final String QUERY = “INSERT INTO Table (ID, CLOBFIELD) VALUES ( ?,? )”;

んで、org.springframework.jdbc.core.support.JdbcDaoSupport を継承して、さっきのSqlUpdateクラスを使う。

DIしたlobHandler を使って、 SqlLobValueを生成してあげる。

package your.package.dao.sql;

public class HogeDaoImpl extends JdbcDaoSupport {

public HogeDaoImpl() {

super();

}

private LobHandler lobHandler_;

public void setLobHandler(LobHandler lobHandler) {

lobHandler_ = lobHandler;

}

public void save(Object entityBean) {

BeanOfTable bean = (BeanOfTable) entityBean;

SqlLobValue clobField = new SqlLobValue(bean.getBody(), lobHandler_);

String id = bean.getId();

Create create = new Create(getDataSource());

create.update(new Object[]{ id, clobField });

}