jdbcTempateでストレージプロセスを呼び出して、BLOB/CLOB小記を処理します。
もっと読む
1、springのjdbcTemplateを利用してメモリプロセスを呼び出します。
もし私たちがP_があったらGET_TOP IC_NUMという格納プロセスには、2つのパラメータがあります。最初のパラメータはuserIdによって渡されます。2番目のパラメータは次のように伝えられます。
例として、例の中のt_post表の中のpost_textフィールドはCLOBタイプで、post_atchはブログのタイプです。
1、springのjdbcTemplateを利用してメモリプロセスを呼び出します。
もし私たちがP_があったらGET_TOP IC_NUMという格納プロセスには、2つのパラメータがあります。最初のパラメータはuserIdによって渡されます。2番目のパラメータは次のように伝えられます。
public int getUserTopicNum(final int userId) {
String sql = "{call P_GET_TOPIC_NUM(?,?)}";
// Object execute(String callString, CallableStatementCallback action)
Object obj = getJdbcTemplate().execute(sql,new CallableStatementCallback(){
public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
cs.setInt(1,userId);
cs.registerOutParameter(2, Types.INTEGER);
cs.execute();
return new Integer(cs.getInt(2));
}
});
return ((Integer)obj).intValue();
}
2、springは統一的に各種データベースのLobタイプデータを操作するLobCreatorを定義しています。同時にLobHandlerを提供しています。バイナリフィールドと大きいテキストフィールドを操作するために、統一インターフェースアクセスを提供しています。例として、例の中のt_post表の中のpost_textフィールドはCLOBタイプで、post_atchはブログのタイプです。
public class PostJdbcDao extends JdbcDaoSupport implements PostDao {
private LobHandler lobHandler;
private DataFieldMaxValueIncrementer incre;
public LobHandler getLobHandler() {
return lobHandler;
}
public void setLobHandler(LobHandler lobHandler) {
this.lobHandler = lobHandler;
}
public void addPost(final Post post) {
String sql = " INSERT INTO t_post(post_id,user_id,post_text,post_attach)"
+ " VALUES(?,?,?,?)";
getJdbcTemplate().execute(
sql,
new AbstractLobCreatingPreparedStatementCallback(
this.lobHandler) {
protected void setValues(PreparedStatement ps,
LobCreator lobCreator) throws SQLException {
ps.setInt(1, incre.nextIntValue());
ps.setInt(2, post.getUserId());
lobCreator.setClobAsString(ps, 3, post.getPostText());
lobCreator.setBlobAsBytes(ps, 4, post.getPostAttach());
}
});
}
}
に対応するプロファイル(Oracle 9 iバージョン)を設定します。Oracleのデータベースは特別なものをやるのが一番好きです。
Oracle 10 gまたは他のデータベースは以下のように設定されています。
BLOB/CLOBブロックを読み、例えば: public List getAttachs(final int userId){
String sql = "SELECT post_id,post_attach FROM t_post where user_id =? and post_attach is not null";
return getJdbcTemplate().query(
sql,new Object[] {userId},
new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Post post = new Post();
int postId = rs.getInt(1);
byte[] attach = lobHandler.getBlobAsBytes(rs, 2);
post.setPostId(postId);
post.setPostAttach(attach);
return post;
}
});
}
注:コードは全部<>から来ています。