→データベース関連

#contents

*一般 [#e155b143]
-[[O/Rマッピング技術の進化が皮肉にも助長している「えせMVC症候群」>http://satoshi.blogs.com/life/2009/10/ormappingmvc.html]] 2009.10.13
--「この業界でプロとして仕事をするなら、使う言語やフレームワークにかかわらず、オブジェクト指向とMVCのコンセプトだけはしっかりと理解した上で仕事をしてほしい。そして、O/Rマッピングを使う時には、それだけでModel作りが終わったと誤解してはいけない」

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


*Hibernate [#ieccfe1e]
-http://hibernate.org/

-Hibernate Reference Documentation
--http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/

-[[Hibernateを使ってみる(JPAを使って)>http://d.hatena.ne.jp/tanakakns/20120619/1340097496]] 2012.6
--JPAはO/Rマッパーの違いを隠ぺいするためのAPIである。

-[[Hibernate解説>http://www.techscore.com/tech/Java/Others/Hibernate/index/]]
--注意:ややバージョンが古いです

-[[Hibernate入門@syboos>http://www.syboos.jp/hibernate/]]

-[[チュートリアルを利用したHibernate入門>http://www.omotenashi-mind.com/index.php/%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9FHibernate%E5%85%A5%E9%96%80]]

-[[SQLに似たHQLでリレーショナルデータを柔軟に検索 (1/2)>http://www.atmarkit.co.jp/ait/articles/0409/22/news094.html]]


**Nhibernate [#x67fe53b]
-[[NHibernateを利用してSQLを書かずにデータベースにアクセスする方法 >http://codezine.jp/a/article.aspx?aid=156]]

-[[NHibernateによるO/Rマッピング>http://wiki.nhibernate.org/display/NH/Home]]



*S2JDBC [#v6b79245]
-エンティティを生成したときにできる 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に追加すべし

-[[バッチ処理でトランザクションかますサンプル>http://code.nanigac.com/source/wiki/view/597/104]]


-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>http://s2container.seasar.org/2.4/ja/s2jdbc_abstract.html]]
--[[チュートリアル>http://s2container.seasar.org/2.4/ja/s2jdbc_tutorial.html]]

-ビューの扱い
--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にある模様

-S2AbstractServiceについて
--http://d.hatena.ne.jp/dewa/20080706/1215308304
--http://d.hatena.ne.jp/dkfj/20090306/1236301619
--Serviceクラスは、Entityクラスと1:1で対応させる。
--Serviceクラスは、Entityに対する処理以外はやらない。
--Serviceクラス以外は、jdbcManagerを生で使用しない。(Actionにとか)
--AbstractServiceを作成し、DBに関する共通処理を集約させる(削除フラグとか更新
日とか)
--[[続・SAStruts + S2JDBCのアーキテクチャ>http://d.hatena.ne.jp/dewa/20080606#1212716896]]

-[[S2JDBCとS2Daoのいけてないところ>http://blog.tsukuba-bunko.jp/ppoi/archives/2008/06/s2jdbcs2dao.html]] 
--S2DBCP は,ローカルトランザクションの内部では,Connection を要求ごとに新規に取り直すような動きをします。
--つまり,手動での JDBC 操作の部分と,S2JDBC/S2Dao の呼び出し部分では,それぞれ別々の Connection が使用されてしまう訳です。
--当然,トランザクションもばらばらになってしまうため,事実上一つのトランザクションで処理を行うということができなくなります。

-トランザクション管理は[[S2Tx>http://s2container.seasar.org/2.4/ja/tx.html]]を使うとのこと
--デフォルトだとコンポーネントが例外をスローした場合はトランザクションをロールバックしますが、発生した例外に応じてトランザクションをコミットするかロールバックするかを指定することもできます。
--addCommitRule(Class)メソッドを使用すると、トランザクションをコミットする例外を指定することができます。
--addRollbackRule(Class)メソッドを使用すると、トランザクションをロールバックする例外を指定することができます。


-[[S2JDBCのトランザクション>http://kanon986.blog95.fc2.com/blog-entry-1.html]]
--SAStrutsと組み合わせれば、デフォルトでAction単位でトランザクションを制御してくれます。
--参考:[[SAStrutsにおけるトランザクション>http://sastruts.seasar.org/featureReference.html#Transaction]]

-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 [#a46cecb6]
-[[Developer Guid>http://ibatisnet.sourceforge.net/DevGuide.html]]
-[[Quick Start Guide>http://opensource.atlassian.com/confluence/oss/display/IBATIS/Quick+Start+Guide]]
-[[ASP.NETで実践するiBATIS>http://www.atmarkit.co.jp/fdotnet/special/ormap02/ormap02_01.html]]
-「iBATIS.NET」は「SQL Maps=DataMapper」と「DAO Framework=DataAccess」という2つのフレームワークから構成される
--SQL Maps:XMLに記述したSQLの実行結果をマッピングする
--DAO Framework:DI機能。DBアクセスとビジネスロジックの依存性を下げる。
--ADO.NETのデータプロバイダに依存する
--2つのフレームワークはそれぞれ単体で使用可能

-[[iBATIS.NETによるO/Rマッピング(SQL Maps編):http://codezine.jp/a/article.aspx?aid=112]]
-[[iBATIS.NETによるO/Rマッピング(DAO Framework編):http://codezine.jp/a/article.aspx?aid=113]]

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

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


*その他 [#a1fc340a]
-[[Gentle.NET>http://www.mertner.com/confluence/display/Gentle/Home]]
-[[SQLを記述しないO/RマッピングツールTorque:http://www.thinkit.co.jp/free/article/0606/13/4/index.html]]

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS