データベース関連

一般

  • 時代はO-Rマッピングからkey-valueストアへ 2009.5.31
    • 昨今のWebアプリの技術を鳥瞰してみると、RailsやSeasarでO-Rマッピングのインピーダンスマッチの問題は事実上解決されたと言える。
    • そして、技術革新の場所は、GoogleのMapReduce、Amazonのレコメンドエンジンなどの機能へ移っている。

JPA

Hibernate

Nhibernate

S2JDBC

  • エンティティを生成したときにできる xxxxNamesクラスは何に使う?
    • 例えば以下のように、includesメソッドにカラム名を渡す場合に使う
      jdbcManager.update(hogeEntity).includes(
         	hogeNames.colA(),
         	hogeNames.colB(),
         	hogeNames.colC()).execute();
  • jdbcManager#updateBySqlで更新した場合、 @Versionをつけていてもバージョン番号は1UPしない
  • エンティティの文字列長チェック
    /***
     * エンティティの文字列フィールドの長さをチェックします<br/>
     * Columnアノテーションの length 属性と比較して長ければエラーログ出力します<br/>
     * ついでにnot null制約がついているフィールドにnullを設定したときもエラーログ出力します
     * @param entity チェックしたいエンティティ
     * @return チェックOKなら true NGなら false
     */
    public static boolean checkStringFieldLength(Object entity){
      boolean b = true;
      try {
        Class<?> cls = entity.getClass();
        Field[] flds = cls.getDeclaredFields();
        for(Field f : flds){
          if( f.getType().equals(String.class) ){
            Column c = f.getAnnotation(Column.class);
            int len = c.length();
            String name = cls.getSimpleName() +"." +f.getName();
            String val = (String) f.get(entity);
            if(StringUtil.isEmpty(val)==false){
              if(val.length() > len){
                Log.error(name + "の値[" + val +
                    "]がエンティティで指定されている長さ(" +
                    len + ")よりも長すぎます");
                b = false;
              }
            }
            if(c.nullable()==false && val == null){
              Log.error(name +"にはnullを設定することはできません");
              b = false;
            }
          }
        }
        return b;
      }catch(Exception e){
        e.printStackTrace();
        return b;
      }
    }
  • スタンドアロンアプリでトランザクションを形成したいとき
    • componentタグの中にaspect タグを書きそこにrequiredTxなどを書いておくとトランザクションが有効になる
    • 独自ファイル(たとえばbean.diconなど)作ってapp.diconからincludeするのがおすす め
      (例)
       <component name="sample" class="jp.co.Sample">
            <aspect>j2ee.requiredTx</aspect>
       </component>
    • 指定したクラスのすべてのメソッドがトランザクション対象になる。
    • pointCutタグを使うとメソッドを特定できる
    • このとき
      [ESSR0046]コンポーネント(j2ee)が見つかりません
      と言われるならば
      <include path="j2ee.dicon"/>
      をapp.diconに追加すべし
  • org.seasar.framework.container.TooManyRegistrationRuntimeException が発生するとき
     [ESSR0045]interface javax.sql.XADataSourceに複数のコンポーネント
    (org.seasar.extension.dbcp.impl.XADataSourceImpl, 
    org.seasar.extension.dbcp.impl.XADataSourceImpl)が登録されています
    • jdbc.diconに <component name="xaDataSource"> のタグが複数あるとこれになる。コメントタグの付け忘れ、消し忘れを確認
  • jdbc.diconでコネクション・プーリングやタイムアウトの設定ができる
    <component name="connectionPool"
      class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
      <property name="timeout">600</property> ←秒数
      <property name="maxPoolSize">10</property>
      <property name="allowLocalTx">true</property>
      <destroyMethod name="close"/>
    </component>
  • ビューの扱い
    • S2JDBC-Genでエンティティを生成できるのはテーブルのみで、ビューのエンティティは作られない。
    • ではどうするかというと、Viewに対しては Dtoを作ってSQL指定で対応する方法がある
      public class ViewTestDtoService extends AbstractService<ViewTestDto> {
        public List<ViewTestDto> getAll(){
             List<ViewTestDto> results = jdbcManager.selectBySql(
                            ViewTestDto.class, "select * from VIEW_TEST ")
                            .getResultList();
             return results;
          }
      }
    • ビューに限らず、複雑なSELECT文を使う場合も同様
    • SQLファイルからDtoクラスを生成する機能がS2JDBC-Genにある模様
  • S2JDBCとS2Daoのいけてないところ
    • S2DBCP は,ローカルトランザクションの内部では,Connection を要求ごとに新規に取り直すような動きをします。
    • つまり,手動での JDBC 操作の部分と,S2JDBC/S2Dao の呼び出し部分では,それぞれ別々の Connection が使用されてしまう訳です。
    • 当然,トランザクションもばらばらになってしまうため,事実上一つのトランザクションで処理を行うということができなくなります。
  • トランザクション管理はS2Txを使うとのこと
    • デフォルトだとコンポーネントが例外をスローした場合はトランザクションをロールバックしますが、発生した例外に応じてトランザクションをコミットするかロールバックするかを指定することもできます。
    • addCommitRule(Class)メソッドを使用すると、トランザクションをコミットする例外を指定することができます。
    • addRollbackRule(Class)メソッドを使用すると、トランザクションをロールバックする例外を指定することができます。
  • MS製のJDBCドライバでSQL Server 2005 Expressにつなぐときのjdbc.diconの記述例
     <component name="xaDataSource"
       class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
       <property name="driverClassName">
         "com.microsoft.sqlserver.jdbc.SQLServerDriver"
           </property>
           <property name="URL">
           "jdbc:sqlserver://localhost;instanceName=SQLEXPRESS;databaseName=hogeDB"
           </property>
           <property name="user">"sa"</property>
           <property name="password">"hogehoge"</property>
       </component>
  • 統合認証で接続する場合のjdbc.dicon
    <component name="xaDataSource"
         class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
      <property name="driverClassName">
         "com.microsoft.sqlserver.jdbc.SQLServerDriver"
      </property>
      <property name="URL">
      "jdbc:sqlserver://localhost;instanceName=SQLEXPRESS;databaseName=hogeDB;integratedSecurity=true"
      </property>
    </component>
  • JDBCドライバのファイルはsqljdbc4.jarだけあれば良い模様。プロジェクトのlibフォルダに置いておくのがいろんな意味で無難と思われる。(外部に置こうとするといろんな局面でJDBCドライバがClassNotFoundをくらう)
  • jdbc.diconで統合認証を使う場合はJDBCドライバに同梱されているsqljdbc_auth.dllをpathの切ってあるところに置く必要あり

iBATIS

  • Developer Guid
  • Quick Start Guide
  • ASP.NETで実践するiBATIS
  • 「iBATIS.NET」は「SQL Maps=DataMapper」と「DAO Framework=DataAccess」という2つのフレームワークから構成される
    • SQL Maps:XMLに記述したSQLの実行結果をマッピングする
    • DAO Framework:DI機能。DBアクセスとビジネスロジックの依存性を下げる。
    • ADO.NETのデータプロバイダに依存する
    • 2つのフレームワークはそれぞれ単体で使用可能

インストール

  • http://ibatis.apache.org/ から最新版を落としてくる
  • インストーラなどは無い。展開したものを適当なフォルダにコピーする
  • VS.NETから以下のdllを参照する
    • IBatisNet.Common.dll
    • IBatisNet.DataMapper.dll (SQL Maps使用時)
    • IBatisNet.DataAccess.dll (DAO Framwork使用時)

使い方

  • マッピング対象のオブジェクトとなるクラスを定義する
  • マッピング用XMLを作り、その中の所定のタグにSQLを書く
  • 管理ファイルSqlMap.configにマッピング用XMLを登録する

その他


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-11-18 (日) 12:50:49 (838d)