サンプルプロジェクトはこちら 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)