サンプルプロジェクトはこちら S2DaoExam.zip
(ビルドや実行には Eclipse + m2plugin が必要です)
> set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_06 > cd C:\Program Files\Sun\JavaDB\bin > setEmbeddedCP.bat > ij ij バージョン 10.3 ij> connect 'jdbc:derby:C:\javadb\mydb;create=true'; ij> run 'C:\S2DAOSample.ddl'; ij> run 'C:\S2DAOInitial.dml'; ij> exit;
set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_01 set DERBY_HOME=%JAVA_HOME%\db cd %JAVA_HOME%\db\frameworks\embedded\bin setEmbeddedCP.bat ij ij バージョン 10.2 ij> connect 'jdbc:derby:C:\javadb\mydb;create=true'; ij> run 'C:\S2DAOSample.ddl'; ij> run 'C:\S2DAOInitial.dml'; ij> exit;
ALTER TABLE ORDER_TBL DROP CONSTRAINT ORDER_PRIMARY_KEY; ALTER TABLE ORDER_TBL DROP CONSTRAINT ORDER_CUSTOMER_FK; ALTER TABLE ORDER_TBL DROP CONSTRAINT ORDER_ITEM_FK; ALTER TABLE ITEM_TBL DROP CONSTRAINT ITEM_PRIMARY_KEY; ALTER TABLE CUSTOMER_TBL DROP CONSTRAINT CUSTOMER_PRIMARY_KEY; DROP TABLE CUSTOMER_TBL; DROP TABLE ITEM_TBL; DROP TABLE ORDER_TBL; CREATE TABLE CUSTOMER_TBL( ID BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, NAME VARCHAR(32) NOT NULL, ADDRESS VARCHAR(256), DISCOUNT_RATE REAL, CREDIT_FACILITY INTEGER, ON_CREATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP, ON_UPDATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ALTER TABLE CUSTOMER_TBL ADD CONSTRAINT CUSTOMER_PRIMARY_KEY PRIMARY KEY (ID); CREATE TABLE ITEM_TBL( ID BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, NAME VARCHAR(32) NOT NULL, FULL_PRICE INTEGER, STOCK INTEGER, ON_CREATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP, ON_UPDATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ALTER TABLE ITEM_TBL ADD CONSTRAINT ITEM_PRIMARY_KEY PRIMARY KEY (ID); CREATE TABLE ORDER_TBL( ID BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY, CUSTOMER_ID BIGINT NOT NULL, ITEM_ID BIGINT NOT NULL, TRADE_PRICE INTEGER, AMOUNT INTEGER, STATUS CHAR, ON_CREATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP, ON_UPDATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ALTER TABLE ORDER_TBL ADD CONSTRAINT ORDER_PRIMARY_KEY PRIMARY KEY (ID); ALTER TABLE ORDER_TBL ADD CONSTRAINT ORDER_CUSTOMER_FK FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMER_TBL (ID); ALTER TABLE ORDER_TBL ADD CONSTRAINT ORDER_ITEM_FK FOREIGN KEY (ITEM_ID) REFERENCES ITEM_TBL (ID); COMMIT;
INSERT INTO CUSTOMER_TBL(NAME,ADDRESS,DISCOUNT_RATE,CREDIT_FACILITY) VALUES('たびのどうぐや','メルキド',0.05,700); INSERT INTO CUSTOMER_TBL(NAME,ADDRESS,DISCOUNT_RATE,CREDIT_FACILITY) VALUES('スーパー・リムル','リムルダール',0.1,5000); INSERT INTO CUSTOMER_TBL(NAME,ADDRESS,DISCOUNT_RATE,CREDIT_FACILITY) VALUES('ミリ金物店','ドムドーラ',0.0,2500); INSERT INTO ITEM_TBL(NAME,FULL_PRICE,STOCK) VALUES('ぬののふく',20,100); INSERT INTO ITEM_TBL(NAME,FULL_PRICE,STOCK) VALUES('やくそう',5,100); INSERT INTO ITEM_TBL(NAME,FULL_PRICE,STOCK) VALUES('どくけしそう',10,100); INSERT INTO ITEM_TBL(NAME,FULL_PRICE,STOCK) VALUES('たいまそう',100,100); INSERT INTO ORDER_TBL(CUSTOMER_ID,ITEM_ID,TRADE_PRICE,AMOUNT,STATUS) VALUES( (SELECT ID FROM CUSTOMER_TBL WHERE NAME='たびのどうぐや'), (SELECT ID FROM ITEM_TBL WHERE NAME='ぬののふく'), (SELECT (1.0 - c.DISCOUNT_RATE) * i.FULL_PRICE FROM CUSTOMER_TBL c, ITEM_TBL i WHERE c.NAME='たびのどうぐや' and i.NAME='ぬののふく'), 5, '0'); INSERT INTO ORDER_TBL(CUSTOMER_ID,ITEM_ID,TRADE_PRICE,AMOUNT,STATUS) VALUES( (SELECT ID FROM CUSTOMER_TBL WHERE NAME='たびのどうぐや'), (SELECT ID FROM ITEM_TBL WHERE NAME='やくそう'), (SELECT (1.0 - c.DISCOUNT_RATE) * i.FULL_PRICE FROM CUSTOMER_TBL c, ITEM_TBL i WHERE c.NAME='たびのどうぐや' and i.NAME='やくそう'), 5, '0'); INSERT INTO ORDER_TBL(CUSTOMER_ID,ITEM_ID,TRADE_PRICE,AMOUNT,STATUS) VALUES( (SELECT ID FROM CUSTOMER_TBL WHERE NAME='たびのどうぐや'), (SELECT ID FROM ITEM_TBL WHERE NAME='どくけしそう'), (SELECT (1.0 - c.DISCOUNT_RATE) * i.FULL_PRICE FROM CUSTOMER_TBL c, ITEM_TBL i WHERE c.NAME='たびのどうぐや' and i.NAME='どくけしそう'), 5, '0'); INSERT INTO ORDER_TBL(CUSTOMER_ID,ITEM_ID,TRADE_PRICE,AMOUNT,STATUS) VALUES( (SELECT ID FROM CUSTOMER_TBL WHERE NAME='たびのどうぐや'), (SELECT ID FROM ITEM_TBL WHERE NAME='たいまそう'), (SELECT (1.0 - c.DISCOUNT_RATE) * i.FULL_PRICE FROM CUSTOMER_TBL c, ITEM_TBL i WHERE c.NAME='たびのどうぐや' and i.NAME='たいまそう'), 5, '0');
m2plugin で、Maven Project を作成し、次のように資産を配置する
src/main/java/com/snail/exam/s2dao | Javaソースファイルを格納(S2Containerに、走査するパッケージ名を指定するので、S2Containerを使ってインスタンス化するものは同一パッケージにする) |
src/main/resources/ | diconファイルなどの設定ファイルを格納 |
pom.xml | 依存ライブラリを定義する |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "http://www.seasar.org/dtd/components.dtd"> <components> <include path="dao.dicon"/> <!-- DAOs --> <component class="com.snail.exam.s2dao.CustomerDao"> <aspect>dao.interceptor</aspect> </component> <!-- <component class="com.snail.exam.s2dao.OrderDao"> <aspect>dao.interceptor</aspect> </component> <component class="com.snail.exam.s2dao.ItemDao"> <aspect>dao.interceptor</aspect> </component> --> </components>
<?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>"com.snail.exam.s2dao"</arg> </initMethod> </component> <component class="org.seasar.framework.convention.impl.PersistenceConventionImpl"/> </components>
<?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"/> <include path="jdbc-extension.dicon"/> <component class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/> <component class="org.seasar.extension.jdbc.impl.ConfigurableStatementFactory"> <arg> <component class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/> </arg> <property name="fetchSize">100</property> <!-- <property name="maxRows">100</property> --> </component> <!-- <component name="xaDataSource" class="org.seasar.extension.dbcp.impl.XADataSourceImpl"> <property name="driverClassName"> "oracle.jdbc.driver.OracleDriver" </property> <property name="URL"> "jdbc:oracle:thin:@xxx:1521:yyy" </property> <property name="user">"aaa"</property> <property name="password">"bbb"</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> <property name="validationQuery">"select * from dual"</property> <property name="validationInterval">10000</property> <destroyMethod name="close"/> </component> <component name="dataSource" class="org.seasar.extension.dbcp.impl.DataSourceImpl"/> --> <!-- for Derby --> <component name="xaDataSource" class="org.seasar.extension.dbcp.impl.XADataSourceImpl" instance="singleton" autoBinding="auto"> <property name="driverClassName"> "org.apache.derby.jdbc.EmbeddedDriver" </property> <property name="URL"> "jdbc:derby:C:\\javadb\\mydb;create=false" </property> </component> <component name="connectionPool" class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl" instance="singleton" autoBinding="auto"> <property name="timeout">600</property> <property name="maxPoolSize">0</property> <property name="allowLocalTx">true</property> <destroyMethod name="close"/> </component> <component name="DataSource" class="org.seasar.extension.dbcp.impl.DataSourceImpl" instance="singleton" autoBinding="auto"/> <!-- from JNDI --> <!-- <component name="DataSource" class="javax.sql.DataSource"> @org.seasar.extension.j2ee.JndiResourceLocator@lookup("java:comp/env/jdbc/DataSource") </component> --> <!-- <component name="dataSource" class="org.seasar.extension.datasource.impl.SelectableDataSourceProxy"/> --> </components>
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "org/apache/log4j/xml/log4j.dtd"> <log4j:configuration xmlns:log4j= 'http://jakarta.apache.org/log4j/'> <!-- ********************** 標準出力への出力 ********************** --> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <param name="threshold" value="debug"/> <!-- レイアウトの指定 --> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy/MM/dd HH:mm:ss.SSS} [%x%-5p] %m @ %c %n"/> </layout> </appender> <!-- ********************** Nullへの出力 ********************** --> <appender name="NULL" class="org.apache.log4j.varia.NullAppender"> <param name="threshold" value="debug"/> </appender> <!-- ********************** category定義 ************************* --> <category name="com.snail.exam.s2dao"> <priority value="debug"/> <appender-ref ref="STDOUT"/> </category> <category name="org.seasar"> <priority value="debug"/> <appender-ref ref="STDOUT"/> </category> <!-- ********************** root定義 ***************************** --> <root> <level value="fatal"/> <appender-ref ref="NULL"/> </root> </log4j:configuration>
<?xml version="1.0" encoding="UTF-8"?><project> <modelVersion>4.0.0</modelVersion> <groupId>S2DAOExam</groupId> <artifactId>S2DAOExam</artifactId> <version>0.0.1-SNAPSHOT</version> <description></description> <build> <finalName>S2DAOExam</finalName> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> <repositories> <repository> <id>maven.seasar.org</id> <name>The Seasar Foundation Maven2 Repository</name> <url>http://maven.seasar.org/maven2</url> </repository> <repository> <id>maven2-repository.dev.java.net</id> <name>Java.net Maven 2 Repository</name> <url>http://download.java.net/maven/2</url> </repository> <repository> <id>maven-repository.dev.java.net</id> <name>Java.net Maven 1 Repository (legacy)</name> <url>http://download.java.net/maven/1</url> <layout>legacy</layout> </repository> </repositories> <dependencies> <dependency> <groupId>org.seasar.container</groupId> <artifactId>s2-tiger</artifactId> <version>2.4.32</version> </dependency> <dependency> <groupId>org.seasar.dao</groupId> <artifactId>s2-dao-tiger</artifactId> <version>1.0.49</version> </dependency> <dependency> <groupId>org.apache.derby</groupId> <artifactId>derby</artifactId> <version>10.3.1.4</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.3</version> <scope>provided</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.15</version> <exclusions> <exclusion> <artifactId>jmxtools</artifactId> <groupId>com.sun.jdmk</groupId> </exclusion> <exclusion> <artifactId>jmxri</artifactId> <groupId>com.sun.jmx</groupId> </exclusion> <exclusion> <artifactId>jms</artifactId> <groupId>javax.jms</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>javax.transaction</groupId> <artifactId>transaction-api</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.7.0</version> </dependency> </dependencies> </project>
※ Derby のバージョンが 10.2 (JDK1.6.0_01付属) の場合には、Derby の <version> を変更する必要がある
package com.snail.exam.s2dao; import java.sql.Timestamp; import org.seasar.dao.annotation.tiger.Bean; import org.seasar.dao.annotation.tiger.Column; import org.seasar.dao.annotation.tiger.Id; import org.seasar.dao.annotation.tiger.IdType; import org.seasar.dao.annotation.tiger.Ids; @Bean(table = "CUSTOMER_TBL",timeStampProperty="onUpdate") public class CustomerBean { private String pAddress; private int pCreditFacility; private double pDiscountRate; private long pId; private String pName; private Timestamp pOnCreate; private Timestamp pOnUpdate; @Column("ADDRESS") public String getAddress() { return pAddress; } @Column("CREDIT_FACILITY") public int getCreditFacility() { return pCreditFacility; } @Column("DISCOUNT_RATE") public double getDiscountRate() { return pDiscountRate; } @Column("ID") @Ids( { @Id(value = IdType.IDENTITY, dbms = "derby"), @Id(value = IdType.SEQUENCE, sequenceName = "SEQ_CUSTOMER", dbms = "oracle") }) public long getId() { return pId; } @Column("NAME") public String getName() { return pName; } @Column("ON_CREATE") public Timestamp getOnCreate() { return pOnCreate; } @Column("ON_UPDATE") public Timestamp getOnUpdate() { return pOnUpdate; } public void setAddress(String address) { this.pAddress = address; } public void setCreditFacility(int creditFacility) { this.pCreditFacility = creditFacility; } public void setDiscountRate(double discountRate) { this.pDiscountRate = discountRate; } public void setId(long id) { this.pId = id; } public void setName(String name) { this.pName = name; } public void setOnCreate(Timestamp onCreate) { pOnCreate = onCreate; } public void setOnUpdate(Timestamp onUpdate) { pOnUpdate = onUpdate; } }
@Ids( { @Id(value = IdType.IDENTITY, dbms = "derby"), @Id(value = IdType.SEQUENCE, sequenceName = "SEQ_CUSTOMER", dbms = "oracle") })
package com.snail.exam.s2dao; import java.util.List; import org.seasar.dao.annotation.tiger.Arguments; import org.seasar.dao.annotation.tiger.Query; import org.seasar.dao.annotation.tiger.S2Dao; import org.seasar.dao.annotation.tiger.Sql; @S2Dao(bean = CustomerBean.class) public interface CustomerDao { /** * select処理. * 返り値が、Entity でないとき、 SELECT COUNT(*) FROM CUSTOMER のように、 * 値がひとつだけ返ってくる検索処理とみなされる。 * * @return 格納されている CUSTOMER の数 */ @Sql(value = "SELECT COUNT(ID) FROM CUSTOMER") int countAll(); /** * delete処理. * delete処理は、delete,remove で始まるメソッド名にする。 * 返り値は、int か void。 * * @param customer Customer * @return 更新された行数 */ int delete(CustomerBean customer); /** * select処理. 引数を指定しないと全件検索 */ List<CustomerBean> findAll(); /** * select処理. * @Query アノテーション で、複雑なWHERER句 ORDER BY句を記述することが * できます。 * * @param id ID * @return Customer */ @Query("ADDRESS LIKE ?%") List<CustomerBean> findByAddress(final String address); /** * select処理. * 返り値が、Entity , List(List<Entity>) , Entity[] のとき Entity * を返す検索処理とみなされる。 @Arguments アノテーションで、 * 引数に対応する"列名"を 指定すると、単純な WHERE 句が生成される。 * * (引数の値がnullのときに検索条件に含めないような処理が 行われる) * * @param id ID * @return Customer */ @Arguments( { "ID" }) CustomerBean findCustomer(final int id); /** * insert処理. * insert処理は、insert,add,create で始まるメソッド名にする。 * 返り値は、int か void。 * * @param customer Customer * @return 更新された行数 */ int insert(CustomerBean customer); /** * update処理. * update処理は、update,modify,store で始まるメソッド名にする。 * 返り値は、int か void。 * * @param customer Customer * @return 更新された行数 */ int update(CustomerBean customer); /** * update処理. * メソッド名の末尾に UnlessNull がついている update 処理は * null でないフィールドのみ更新。 返り値は、int か void。 * * @param customer Customer * @return 更新された行数 */ int updateUnlessNull(CustomerBean customer); }
package com.snail.exam.s2dao; import java.util.List; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.seasar.framework.container.S2Container; import org.seasar.framework.container.factory.S2ContainerFactory; public class S2DAOExam { private static Log logger = LogFactory.getLog(S2DAOExam.class); public static void main(String[] args) { S2Container container = null; try { container = S2ContainerFactory.create("app.dicon"); CustomerDao dao = (CustomerDao) container.getComponent(CustomerDao.class); List<CustomerBean> customerList = dao.findAll(); for( CustomerBean bean : customerList ){ logger.debug(BeanUtils.describe(bean)); } } catch (Exception e) { e.printStackTrace(); } finally { if (container != null) { container.destroy(); } } } }
S2Containerを作成します。path=app.dicon S2Containerを作成します。path=dao.dicon S2Containerを作成します。path=j2ee.dicon S2Containerを作成します。path=jta.dicon S2Containerを作成しました。path=jta.dicon S2Containerを作成します。path=jdbc.dicon S2Containerを作成します。path=jdbc-extension.dicon S2Containerを作成します。path=convention.dicon S2Containerを作成しました。path=convention.dicon S2Containerを作成しました。path=jdbc-extension.dicon S2Containerを作成しました。path=jdbc.dicon S2Containerを作成しました。path=j2ee.dicon S2Containerを作成しました。path=dao.dicon S2Containerを作成しました。path=app.dicon 物理的なコネクションを取得しました 論理的なコネクションを取得しました。tx=null 論理的なコネクションを閉じました。tx=null 物理的なコネクションを閉じました 物理的なコネクションを取得しました 論理的なコネクションを取得しました。tx=null 論理的なコネクションを閉じました。tx=null 物理的なコネクションを閉じました 物理的なコネクションを取得しました 論理的なコネクションを取得しました。tx=null SELECT CUSTOMER_TBL.CREDIT_FACILITY, CUSTOMER_TBL.DISCOUNT_RATE, CUSTOMER_TBL.ON_CREATE, CUSTOMER_TBL.ON_UPDATE, CUSTOMER_TBL.ID, CUSTOMER_TBL.ADDRESS, CUSTOMER_TBL.NAME FROM CUSTOMER_TBL 論理的なコネクションを閉じました。tx=null 物理的なコネクションを閉じました {id=1, onCreate=2008-11-24 17:33:35.821, address=メルキド, name=たびのどうぐや, class=class com.snail.exam.s2dao.CustomerBean, creditFacility=700, onUpdate=2008-11-24 17:33:35.821, discountRate=0.05000000074505806} {id=2, onCreate=2008-11-24 17:33:35.842, address=リムルダール, name=スーパー・リムル, class=class com.snail.exam.s2dao.CustomerBean, creditFacility=5000, onUpdate=2008-11-24 17:33:35.842, discountRate=0.10000000149011612} {id=3, onCreate=2008-11-24 17:33:35.86, address=ドムドーラ, name=ミリ金物店, class=class com.snail.exam.s2dao.CustomerBean, creditFacility=2500, onUpdate=2008-11-24 17:33:35.86, discountRate=0.0}
※適宜、編集・改行をしています
まずは、Order Bean からマッピングされる Item Bean を作る。この Bean は、Customer Bean と同様に外部への参照はない。
package com.snail.exam.s2dao; import org.seasar.dao.annotation.tiger.Bean; import org.seasar.dao.annotation.tiger.Column; import org.seasar.dao.annotation.tiger.Id; import org.seasar.dao.annotation.tiger.IdType; import org.seasar.dao.annotation.tiger.Ids; import java.sql.Timestamp; @Bean(table = "ITEM_TBL",timeStampProperty="onUpdate") public class ItemBean { private int pFullPrice; private long pId; private String pName; private Timestamp pOnCreate; private Timestamp pOnUpdate; private int pStock; @Column("ID") @Ids( { @Id(value = IdType.IDENTITY, dbms = "derby"), @Id(value = IdType.SEQUENCE, sequenceName = "SEQ_ITEM", dbms = "oracle") }) public long getId() { return pId; } @Column("NAME") public String getName() { return pName; } @Column("ON_CREATE") public Timestamp getOnCreate() { return pOnCreate; } @Column("ON_UPDATE") public Timestamp getOnUpdate() { return pOnUpdate; } @Column("FULL_PRICE") public int getPrice() { return pFullPrice; } @Column("STOCK") public int getStock() { return pStock; } public void setId(long id) { pId = id; } public void setName(String name) { pName = name; } public void setOnCreate(Timestamp onCreate) { pOnCreate = onCreate; } public void setOnUpdate(Timestamp onUpdate) { pOnUpdate = onUpdate; } public void setPrice(int price) { pFullPrice = price; } public void setStock(int stock) { pStock = stock; } }
getter への @Relationアノテーションで、N:1 マッピングを行う。N:1 マッピングを行う場合に、getter/setter で扱うのは "1" 側をマッピングする Bean。
package com.snail.exam.s2dao; import java.sql.Timestamp; import org.seasar.dao.annotation.tiger.Bean; import org.seasar.dao.annotation.tiger.Column; import org.seasar.dao.annotation.tiger.Id; import org.seasar.dao.annotation.tiger.Ids; import org.seasar.dao.annotation.tiger.IdType; import org.seasar.dao.annotation.tiger.Relation; @Bean(table = "ORDER_TBL", timeStampProperty = "onUpdate") public class OrderBean { private int pAmount; private CustomerBean pCustomerBean; private long pId; private ItemBean pItemBean; private Timestamp pOnCreate; private Timestamp pOnUpdate; private char pStatus; private int pTradePrice; @Column("AMOUNT") public int getAmount() { return pAmount; } @Relation(relationNo = 0, relationKey = "CUSTOMER_ID:ID") public CustomerBean getCustomerBean() { return pCustomerBean; } @Column("ID") @Ids( { @Id(value = IdType.IDENTITY, dbms = "derby"), @Id(value = IdType.SEQUENCE, sequenceName = "SEQ_PURCHASE", dbms = "oracle") }) public long getId() { return pId; } @Relation(relationNo = 1, relationKey = "ITEM_ID:ID") public ItemBean getItemBean() { return pItemBean; } @Column("ON_CREATE") public Timestamp getOnCreate() { return pOnCreate; } @Column("ON_UPDATE") public Timestamp getOnUpdate() { return pOnUpdate; } @Column("STATUS") public char getStatus() { return pStatus; } @Column("TRADE_PRICE") public int getTradePrice() { return pTradePrice; } public void setAmount(int amount) { pAmount = amount; } public void setCustomerBean(CustomerBean CustomerBean) { pCustomerBean = CustomerBean; } public void setId(long id) { pId = id; } public void setItemBean(ItemBean ItemBean) { pItemBean = ItemBean; } public void setOnCreate(Timestamp onCreate) { pOnCreate = onCreate; } public void setOnUpdate(Timestamp onUpdate) { pOnUpdate = onUpdate; } public void setStatus(char status) { pStatus = status; } public void setTradePrice(int tradePrice) { pTradePrice = tradePrice; } }
とりあえず、findAll() だけ
package com.snail.exam.s2dao; import java.util.List; import org.seasar.dao.annotation.tiger.S2Dao; @S2Dao(bean = OrderBean.class) public interface OrderDao { /** * select処理. 引数を指定しないと全件検索 */ List<OrderBean> findAll(); }
package com.snail.exam.s2dao; import java.util.List; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.seasar.framework.container.S2Container; import org.seasar.framework.container.factory.S2ContainerFactory; public class S2DAOExam2 { private static Log logger = LogFactory.getLog(S2DAOExam.class); public static void main(String[] args) { S2Container container = null; try { container = S2ContainerFactory.create("app.dicon"); OrderDao dao = (OrderDao) container.getComponent(OrderDao.class); List<OrderBean> orderList = dao.findAll(); for(OrderBean bean : orderList ){ StringBuilder sb = new StringBuilder(); sb.append("id=" + bean.getId()); sb.append(",item=" + bean.getItemBean().getName()); sb.append(",customer=" + bean.getCustomerBean().getName()); sb.append(",amount=" + bean.getAmount()); sb.append(",trade price=" + bean.getTradePrice()); sb.append(",full price=" + bean.getItemBean().getPrice()); logger.debug(sb.toString()); } } catch (Exception e) { e.printStackTrace(); } finally { if (container != null) { container.destroy(); } } } }
S2Containerを作成します。path=app.dicon S2Containerを作成します。path=dao.dicon S2Containerを作成します。path=j2ee.dicon S2Containerを作成します。path=jta.dicon S2Containerを作成しました。path=jta.dicon S2Containerを作成します。path=jdbc.dicon S2Containerを作成します。path=jdbc-extension.dicon S2Containerを作成します。path=convention.dicon S2Containerを作成しました。path=convention.dicon S2Containerを作成しました。path=jdbc-extension.dicon S2Containerを作成しました。path=jdbc.dicon S2Containerを作成しました。path=j2ee.dicon S2Containerを作成しました。path=dao.dicon S2Containerを作成しました。path=app.dicon 物理的なコネクションを取得しました 論理的なコネクションを取得しました。tx=null 論理的なコネクションを閉じました。tx=null 物理的なコネクションを閉じました 物理的なコネクションを取得しました 論理的なコネクションを取得しました。tx=null 論理的なコネクションを閉じました。tx=null 物理的なコネクションを閉じました 物理的なコネクションを取得しました 論理的なコネクションを取得しました。tx=null SELECT ORDER_TBL.ON_CREATE, ORDER_TBL.ON_UPDATE, ORDER_TBL.ID, ORDER_TBL.AMOUNT, ORDER_TBL.TRADE_PRICE, ORDER_TBL.STATUS, customerBean.CREDIT_FACILITY AS CREDIT_FACILITY_0, customerBean.DISCOUNT_RATE AS DISCOUNT_RATE_0, customerBean.ON_CREATE AS ON_CREATE_0, customerBean.ON_UPDATE AS ON_UPDATE_0, customerBean.ID AS ID_0, customerBean.ADDRESS AS ADDRESS_0, customerBean.NAME AS NAME_0, itemBean.ON_CREATE AS ON_CREATE_1, itemBean.ON_UPDATE AS ON_UPDATE_1, itemBean.ID AS ID_1, itemBean.FULL_PRICE AS FULL_PRICE_1, itemBean.STOCK AS STOCK_1, itemBean.NAME AS NAME_1 FROM ORDER_TBL LEFT OUTER JOIN CUSTOMER_TBL customerBean ON ORDER_TBL.CUSTOMER_ID = customerBean.ID LEFT OUTER JOIN ITEM_TBL itemBean ON ORDER_TBL.ITEM_ID = itemBean.ID 論理的なコネクションを閉じました。tx=null 物理的なコネクションを閉じました id=1,item=ぬののふく,customer=たびのどうぐや,amount=5,trade price=19,full price=20 id=2,item=やくそう,customer=たびのどうぐや,amount=5,trade price=4,full price=5 id=3,item=どくけしそう,customer=たびのどうぐや,amount=5,trade price=9,full price=10 id=4,item=たいまそう,customer=たびのどうぐや,amount=5,trade price=95,full price=100
※適宜、編集・改行をしています
package com.snail.exam.s2dao; import java.util.List; import org.seasar.dao.annotation.tiger.Arguments; import org.seasar.dao.annotation.tiger.S2Dao; @S2Dao(bean = OrderBean.class) public interface OrderDao { List<OrderBean> findAll(); @Arguments( { "ID" }) OrderBean findOrder(final int id); int update(OrderBean order); }
package com.snail.exam.s2dao; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.seasar.framework.container.S2Container; import org.seasar.framework.container.factory.S2ContainerFactory; public class S2DAOExam3 { private static Log logger = LogFactory.getLog(S2DAOExam3.class); public static void main(String[] args) { S2Container container = null; try { container = S2ContainerFactory.create("app.dicon"); OrderDao dao = (OrderDao) container.getComponent(OrderDao.class); // 1) Aさんが受注番号1の受注を紹介 OrderBean beanA = dao.findOrder(1); // 2) Bさんが受注番号1の受注を紹介 OrderBean beanB = dao.findOrder(1); // 3) Aさんが更新処理をする beanA.setStatus('1'); int resA = dao.update(beanA); logger.debug("■■" + resA + "行上書きしました"); // 4) Bさんが更新処理をする beanB.setStatus('1'); int resB = dao.update(beanB); logger.debug("■■" + resB + "行上書きしました"); } catch (Exception e) { e.printStackTrace(); } finally { if (container != null) { container.destroy(); } } } }
S2Containerを作成します。path=app.dicon S2Containerを作成します。path=dao.dicon S2Containerを作成します。path=j2ee.dicon S2Containerを作成します。path=jta.dicon S2Containerを作成しました。path=jta.dicon S2Containerを作成します。path=jdbc.dicon S2Containerを作成します。path=jdbc-extension.dicon S2Containerを作成します。path=convention.dicon S2Containerを作成しました。path=convention.dicon S2Containerを作成しました。path=jdbc-extension.dicon S2Containerを作成しました。path=jdbc.dicon S2Containerを作成しました。path=j2ee.dicon S2Containerを作成しました。path=dao.dicon S2Containerを作成しました。path=app.dicon 物理的なコネクションを取得しました 論理的なコネクションを取得しました。tx=null 論理的なコネクションを閉じました。tx=null 物理的なコネクションを閉じました 物理的なコネクションを取得しました 論理的なコネクションを取得しました。tx=null 論理的なコネクションを閉じました。tx=null 物理的なコネクションを閉じました 物理的なコネクションを取得しました 論理的なコネクションを取得しました。tx=null SELECT ORDER_TBL.ON_CREATE, ORDER_TBL.ON_UPDATE, ORDER_TBL.ID, ORDER_TBL.AMOUNT, ORDER_TBL.TRADE_PRICE, ORDER_TBL.STATUS, customerBean.CREDIT_FACILITY AS CREDIT_FACILITY_0, customerBean.DISCOUNT_RATE AS DISCOUNT_RATE_0, customerBean.ON_CREATE AS ON_CREATE_0, customerBean.ON_UPDATE AS ON_UPDATE_0, customerBean.ID AS ID_0, customerBean.ADDRESS AS ADDRESS_0, customerBean.NAME AS NAME_0, itemBean.ON_CREATE AS ON_CREATE_1, itemBean.ON_UPDATE AS ON_UPDATE_1, itemBean.ID AS ID_1, itemBean.FULL_PRICE AS FULL_PRICE_1, itemBean.STOCK AS STOCK_1, itemBean.NAME AS NAME_1 FROM ORDER_TBL LEFT OUTER JOIN CUSTOMER_TBL customerBean ON ORDER_TBL.CUSTOMER_ID = customerBean.ID LEFT OUTER JOIN ITEM_TBL itemBean ON ORDER_TBL.ITEM_ID = itemBean.ID WHERE ORDER_TBL.ID = 1 論理的なコネクションを閉じました。tx=null 物理的なコネクションを閉じました 物理的なコネクションを取得しました 論理的なコネクションを取得しました。tx=null SELECT ORDER_TBL.ON_CREATE, ORDER_TBL.ON_UPDATE, ORDER_TBL.ID, ORDER_TBL.AMOUNT, ORDER_TBL.TRADE_PRICE, ORDER_TBL.STATUS, customerBean.CREDIT_FACILITY AS CREDIT_FACILITY_0, customerBean.DISCOUNT_RATE AS DISCOUNT_RATE_0, customerBean.ON_CREATE AS ON_CREATE_0, customerBean.ON_UPDATE AS ON_UPDATE_0, customerBean.ID AS ID_0, customerBean.ADDRESS AS ADDRESS_0, customerBean.NAME AS NAME_0, itemBean.ON_CREATE AS ON_CREATE_1, itemBean.ON_UPDATE AS ON_UPDATE_1, itemBean.ID AS ID_1, itemBean.FULL_PRICE AS FULL_PRICE_1, itemBean.STOCK AS STOCK_1, itemBean.NAME AS NAME_1 FROM ORDER_TBL LEFT OUTER JOIN CUSTOMER_TBL customerBean ON ORDER_TBL.CUSTOMER_ID = customerBean.ID LEFT OUTER JOIN ITEM_TBL itemBean ON ORDER_TBL.ITEM_ID = itemBean.ID WHERE ORDER_TBL.ID = 1 論理的なコネクションを閉じました。tx=null 物理的なコネクションを閉じました 物理的なコネクションを取得しました 論理的なコネクションを取得しました。tx=null UPDATE ORDER_TBL SET ON_CREATE = '2008-11-24 17.33.35', ON_UPDATE = '2008-11-27 01.14.33', AMOUNT = 5, TRADE_PRICE = 19, STATUS = '1' WHERE ID = 1 AND ON_UPDATE = '2008-11-27 01.10.11' 論理的なコネクションを閉じました。tx=null 物理的なコネクションを閉じました ■■1行上書きしました 物理的なコネクションを取得しました 論理的なコネクションを取得しました。tx=null UPDATE ORDER_TBL SET ON_CREATE = '2008-11-24 17.33.35', ON_UPDATE = '2008-11-27 01.14.33', AMOUNT = 5, TRADE_PRICE = 19, STATUS = '1' WHERE ID = 1 AND ON_UPDATE = '2008-11-27 01.10.11' 論理的なコネクションを閉じました。tx=null 物理的なコネクションを閉じました org.seasar.dao.NotSingleRowUpdatedRuntimeException: [EDAO0005]更新の対象は1行(実際:0)でなければなり ません。(com.snail.exam.s2dao.OrderBean@ae4646) at org.seasar.dao.impl.AbstractAutoHandler.execute(AbstractAutoHandler.java:150) at org.seasar.dao.impl.AbstractAutoHandler.execute(AbstractAutoHandler.java:126) at org.seasar.dao.impl.AbstractAutoStaticCommand.execute(AbstractAutoStaticCommand.java:53) at org.seasar.dao.interceptors.S2DaoInterceptor.invoke(S2DaoInterceptor.java:53) at org.seasar.dao.pager.PagerS2DaoInterceptorWrapper.invoke(PagerS2DaoInterceptorWrapper.java:71) at com.snail.exam.s2dao.OrderDao$$EnhancedByS2AOP$$da3a1e$$MethodInvocation$$update2.proceed(Met hodInvocationClassGenerator.java) at com.snail.exam.s2dao.OrderDao$$EnhancedByS2AOP$$da3a1e.update(OrderDao$$EnhancedByS2AOP$$da3a1 e.java) at com.snail.exam.s2dao.S2DAOExam3.main(S2DAOExam3.java:35)