kareの日記 このページをアンテナに追加 RSSフィード

2004-09-14

[] S2DAO への要望

  • Bean を引数にして SELECT 文の自動生成
  • 更新の排他制御に Timestamp を使えるように

実は,知らないだけで既にできるのかも?

Bean を引数にとる SELECT 文は以下のような SQL を用意しておけばいいのだが…

SELECT * from XXXX
/*BEGIN*/ WHERE
	/*IF a.col1 != null */ col1 = /*a.col1*/'COL1' /*END*/
	/*IF a.col2 != null */ AND col2 = /*a.col2*/'COL2' /*END*/
	…
	/*IF a.colN != null */ AND colN = /*a.colN*/'COL3' /*END*/
/*END*/

やはり,自動生成できたほうがうれしい.

[] (続) Oracle での文字化け対策

とりあえず、以下のような方法で大丈夫そう.

#素直に DB 側で JIS16SJISTILDE を使えれば何もしなくてもいいんだが…

OracleResultSet, OracleResultSetFactory を用意し,どっかの DI に以下を記述する

	<component class="example.OracleResultSetFactory">
		<initMethod>
			@org.seasar.extension.jdbc.impl.BasicSelectHandler@register(#self)
		</initMethod>
	</component>

OracleResultSet, OracleResultSetFactory は以下のような単純なもの

package example;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.seasar.extension.jdbc.impl.ResultSetWrapper;

public class OracleResultSet extends ResultSetWrapper {

    private static final int WAVE_DASH = 0x301c;

    private static final int FULLWIDTH_TILDE = 0xff5e;

    public OracleResultSet(ResultSet resultSet) {
        super(resultSet);
    }

    public String getString(int columnIndex) throws SQLException {
        return convert(super.getString(columnIndex));
    }

    public String getString(String columnName) throws SQLException {
        return convert(super.getString(columnName));
    }

    private String convert(String source) {
        StringBuffer result = new StringBuffer();
        char ch;

        for (int i = 0; i < source.length(); i++) {
            ch = source.charAt(i);

            switch (ch) {
                case WAVE_DASH: // 〜 WAVE DASH -> FULLWIDTH TILDE
                    ch = FULLWIDTH_TILDE;
                    break;
                default:
                    break;
            }

            result.append(ch);
        }

        return result.toString();
    }

}

OracleResultSetFactory

package example;

import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.seasar.extension.jdbc.impl.BasicResultSetFactory;

public class OracleResultSetFactory extends BasicResultSetFactory {

    public ResultSet createResultSet(PreparedStatement ps) {
        return new OracleResultSet(super.createResultSet(ps));
    }

}
Connection: close