ホーム > DBA, java > Spring Framework の SqlUpdate で OracleのclobをInsert・Updateする

Spring Framework の SqlUpdate で OracleのclobをInsert・Updateする

2009 年 9 月 9 日 tdtsh

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 });
}

カテゴリー: DBA, java タグ:
コメントは受け付けていません。