トップ 差分 一覧 ソース 置換 検索 ヘルプ PDF RSS ログイン

S2JDBCについて

スタンドアロンで使う

 サンプル

s2jdbc_stand-alone_sample.zip(570)

 ディレクトリ構成

 [root]
 │  build.xml
 │  s2jdbc-gen-build.xml
 │
 ├─conf
 │      app.dicon <- アプリケーションを構成するルートとなるdiconファイルです.
 │      convention.dicon <- アプリケーションのネーミング規約を定義するdiconファイルで,SMART deployを利用する場合に必要となります.
 │      jdbc.dicon <- JDBCデータソースを定義するdiconファイル
 │      s2jdbc.dicon <- jdbcManagerの定義等
 │
 ├─lib
 └─src

 設定ファイル

app.dicon

 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
 "http://www.seasar.org/dtd/components24.dtd">
 <components>
   <include path="convention.dicon"/>
   <include path="aop.dicon"/>
   <include path="s2jdbc.dicon"/>
   <component name="runtest" class="examples.RunTest" instance="singleton" />
 </components>

convention.dicon

 <?xml version="1.0" encoding="UTF-8"?>
 
 <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
   "http://www.seasar.org/dtd/components24.dtd">
 <components>
   <component class="org.seasar.framework.convention.impl.NamingConventionImpl">
     <initMethod name="addRootPackageName">
       <arg>""</arg>
 
     </initMethod>
   </component>
   <component class="org.seasar.framework.convention.impl.PersistenceConventionImpl"/>
 </components>

s2jdbc.dicon

 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
 "http://www.seasar.org/dtd/components24.dtd">
 <components>
   <include path="jdbc.dicon"/>
   
   <include path="s2jdbc-internal.dicon"/>
   <component name="jdbcManager" class="org.seasar.extension.jdbc.manager.JdbcManagerImpl">
     <property name="maxRows">0</property>
     
     <property name="fetchSize">0</property>
     <property name="queryTimeout">0</property>
     <!--<property name="dialect">sqliteDialect</property>-->
     <property name="dialect">hsqlDialect</property>
     
   </component>
 </components>

jdbc.dicon

 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
 "http://www.seasar.org/dtd/components24.dtd">
 <components namespace="jdbc">
   <include path="jta.dicon"/>
   
   <component name="xaDataSource"
     class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
     <property name="driverClassName">
       "org.hsqldb.jdbcDriver"
     </property>
     <property name="URL">
       "jdbc:hsqldb:file:hsql.db"
     </property>
     <property name="user">"sa"</property>
     <property name="password">""</property>
   </component> 
   
   <!--<component name="xaDataSource"
   class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
   <property name="driverClassName">
   "org.sqlite.JDBC"
   </property>
   <property name="URL">
   "jdbc:sqlite:c:/data/source/java/s2jdbc/test.db"
   </property>
   <property name="user">""</property>
   <property name="password">""</property>
   </component>-->
   
   <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>
   
   
   <component name="DataSource"
   class="org.seasar.extension.dbcp.impl.DataSourceImpl"
   />
   
   
 </components>

 エンティティ作成

s2jdbc-gen-build.xml

 <?xml version="1.0"?>
 <project name="sample" default="gen-entity" basedir=".">
   <path id="classpath">
     <fileset dir="lib"/>
   </path>
   <taskdef resource="s2jdbc-gen-task.properties" classpathref="classpath"/>
   
   <target name="gen-entity">
     <gen-entity
     rootpackagename="examples"
     classpathref="classpath"
     classpath="conf"
     overwrite="true"
     />
   </target>
   
   <target name="gen-ddl">
     <gen-ddl
     classpathdir="build/classes"
     rootpackagename="examples"
     classpathref="classpath"
     classpath="conf"
     />
   </target>
   
   <target name="migrate">
     <migrate
     classpathdir="build/classes"
     rootpackagename="examples"
     classpathref="classpath"
     />
   </target>
   
 </project>

エンティティ作成

ant -f s2jdbc-gen-build.xml

 コンパイル、実行

テストソース

Run.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package examples;

import examples.entity.*;
import java.util.*;
import org.seasar.extension.jdbc.JdbcManager;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
import org.seasar.framework.container.SingletonS2Container;

import org.seasar.framework.container.factory .S2ContainerFactory;
import org.seasar.framework.container.S2Container;

public class Run {
  public static void main(String[] args){
    SingletonS2ContainerFactory.init();
    RunTest test = SingletonS2Container.getComponent(RunTest.class);
    test.test();
  }
}

RunTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package examples;

import examples.entity.*;
import java.util.*;
import org.seasar.extension.jdbc.JdbcManager;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
import org.seasar.framework.container.SingletonS2Container;

import org.seasar.framework.container.factory .S2ContainerFactory;
import org.seasar.framework.container.S2Container;

public class RunTest {
  public JdbcManager jdbcManager;
  
  public void test(){
    System.out.println(jdbcManager);
    
    Test data = new Test();
    data.test = "hoge";
    data.test2 = "hoge2";
    jdbcManager.insert(data).execute();
    
    List<Test> results = 
    jdbcManager
    .selectBySql(
    Test.class, 
    "select * from test")
    .getResultList();
    
    for(Test result: results){
      System.out.println(result);
    }
    
  }
}

build.xml

 <?xml version="1.0"?>
 <project name="sample" default="compile" basedir=".">
   
   <property name="app.home" location="."/>
   <property name="app.lib"   location="${app.home}/lib"/>
   <property name="app.conf"   location="${app.home}/conf"/>
   <property name="app.class" location="${app.home}/build/classes"/>
   <property name="app.src"   location="${app.home}/src"/>
   <property name="app.dist"   location="${app.home}/dist"/>
   
   <path id="classpath">
     <fileset dir="${app.lib}" includes="**/*.jar"/>
     <pathelement location="${app.conf}"/>
     <pathelement location="${app.class}"/>
   </path>
   
   
   <target name="compile" >
     <mkdir dir="${app.class}"/>
     
     <javac includeantruntime="false" srcdir="${app.src}" destdir="${app.class}" encoding="UTF-8">
       <classpath refid="classpath" />
     </javac>
   </target>
   
   <target name="run" depends="compile">
     <java classname="examples.Run">
       <classpath refid="classpath" />
     </java>
   </target>
   
   <!-- クリーン処理 -->
     <target name="clean" >
       <delete dir="${app.class}"/>
     </target>
   
 </project>

コンパイルと実行

ant run

 Unitテスト

S2Unitを使う。

サンプル

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package examples;

import org.seasar.extension.unit.S2TestCase;
import org.seasar.framework.aop.interceptors.MockInterceptor;
import org.seasar.extension.jdbc.JdbcManager;
import org.seasar.extension.dataset.impl.DataSetImpl;
import org.seasar.extension.dataset.DataSet;

import examples.entity.*;
import java.util.*;

public class test01 extends S2TestCase {
  public JdbcManager jdbcManager; 
  
  protected void setUp() throws Exception {
    include("app.dicon");
  }
  
  public void testHoge(){
    // DataSet before = new DataSetImpl();
    // before.addTable("Test");
    
    readXlsAllReplaceDb("testdata01.xls");
    DataSet expect = readXls("testdata02.xls");
    
    Test t = new Test();
    t.test = "hoge";
    t.test2 = "hogehoge";
    jdbcManager.insert(t).execute();
    
    // 比較したくない項目は、xlsに書かなければ比較されない
    assertEquals(expect, readDb(expect));
    
    
  }
  
}

IDとか実行日時などの項目でテストの対象から除外したいカラムがある場合は、
xlsファイルの項目から削除しておくと、比較対象にならない。
参考:http://ameblo.jp/kazuya232323/entry-11227861408.html



Strutsで使う

 設定

classes/app.dicon

<include path="s2jdbc.dicon"/>

を有効にする。

classes/s2jdbc.dicon

のダイアレクトを自分のDBに合わせる。
例えば、Oracleの場合は

<property name="dialect">oracleDialect</property>

classes/jdbc.dicon

自分のDBに合わせて

xaDataSource
connectionPool
DataSource

を有効にする。

 エンティティを使わない

List<BeanMap> results = 
jdbcManager
.selectBySql(
BeanMap.class, 
"select * from test")
.getResultList();

でエンティティを使わずにデータを取得できる。

 エンティティを使う

準備

S2JDBC-Gen

を使ってエンティティを生成する。

  1. S2JDBC-Gen をダウンロードして解凍
  2. s2jdbc-gen/resources/s2jdbc-gen-build.xml を編集
  3. ant -f s2jdbc-gen-build.xml gen-entity

エンティティを使う

List<hogehoge.entity.Test> results =
jdbcManager
.from(hogehoge.entity.Test.class)
.where("id = ?", 1)
.getResultList();

 複数のDBへ接続する

http://ymotoba.blogspot.jp/2008/10/s2jdbcdb.html

作成するファイル

jdbca.dicon
jdbcb.dicon
s2jdbca.dicon
s2jdbcb.dicon

s2jdbc.dicon

まずは、デフォルトで用意されているs2jdbc.diconを以下のように編集

<components>
<include path="s2jdbca.dicon"/>
<include path="s2jdbcb.dicon"/>
</components>

s2jdbca.dicon

<components namespace="s2jdbcA">
  <include path="jdbca.dicon"/>
  <include path="s2jdbc-internal.dicon"/>
  <component name="jdbcManagerA" class="org.seasar.extension.jdbc.manager.JdbcManagerImpl">
    <property name="maxRows">0</property>
    <property name="fetchSize">0</property>
    <property name="queryTimeout">0</property>
    <property name="dialect">mysqlDialect</property>
    <property name="dataSource">DataSource</property>
  </component>
</components>

s2jdbcb.dicon

<components namespace="s2jdbcB">
  <include path="jdbcb.dicon"/>
  <include path="s2jdbc-internal.dicon"/>
  <component name="jdbcManagerB" class="org.seasar.extension.jdbc.manager.JdbcManagerImpl">
    <property name="maxRows">0</property>
    <property name="fetchSize">0</property>
    <property name="queryTimeout">0</property>
    <property name="dialect">mysqlDialect</property>
    <property name="dataSource">DataSource</property>
  </component>
</components>

jdbca.dicon

<components namespace="jdbc">
  <include path="jta.dicon"/>
  
  <component name="xaDataSource"
    class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
    <property name="driverClassName">"org.h2.Driver"</property>
    <property name="URL">
      "jdbc:h2:tcp://localhost:8082/test"
    </property>
    <property name="user">"sa"</property>
    <property name="password">""</property>
    <destroyMethod>
      @org.seasar.framework.util.DriverManagerUtil@deregisterAllDrivers()
    </destroyMethod>
  </component>
  
  <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>
  
  <component name="DataSource" class="org.seasar.extension.dbcp.impl.DataSourceImpl"/>
  
</components>

jdbcb.dicon

<components namespace="jdbc">
  <include path="jta.dicon"/>
  
  <component name="xaDataSource"
    class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
    <property name="driverClassName">
      "com.mysql.jdbc.Driver"
    </property>
    <property name="URL">
      "jdbc:mysql://localhost:3306/clontalk03?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull"
    </property>
    <property name="user">"root"</property>
    <property name="password">""</property>
  </component>
  
  
  <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>
  
  <component name="DataSource"
  class="org.seasar.extension.dbcp.impl.DataSourceImpl"
  />
  
</components>

JdbcManager

上記設定が完了すれば。
下記のように@BindingでインジェクションしたいJdbcManagerを選択すればオッケー!

   @Binding("jdbcManagerA")
   private JdbcManager h2JdbcManager;

   @Binding("jdbcManagerB")
   private JdbcManager mySqlJdbcManagerB;

[カテゴリ: プログラミング言語 > Servlet & Struts]

[通知用URL]



  • Hatenaブックマークに追加
  • livedoorクリップに追加
  • del.icio.usに追加
  • FC2ブックマークに追加

最終更新時間:2014年06月08日 01時34分09秒