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