insert

下記のテーブルを使用します。DBはhsqldbです。


CREATE TABLE ACCOUNT (
ACCOUNTID INTEGER NOT NULL IDENTITY PRIMARY KEY
, USERID LONGVARCHAR NOT NULL
, PASSWORD LONGVARCHAR NOT NULL
, EMAIL LONGVARCHAR NOT NULL
, NAME LONGVARCHAR NOT NULL
, RDATE DATE DEFAULT 'CURRENT_TIMESTAMP' NOT NULL
, UDATE DATE
);


package org.seasar.application.gusuku.model;

import java.io.Serializable;
import java.util.Date;

/**
* @author duran
*/
public class Account implements Serializable {

public static final String accountid_ID = "identity";

private long accountid;

private String userid;

private String password;

private String email;

private String name;

private Date rdate;

private Date udate;

public long getAccountid() {
return accountid;
}

public void setAccountid(long accountid) {
this.accountid = accountid;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public Date getRdate() {
return rdate;
}

public void setRdate(Date rdate) {
this.rdate = rdate;
}

public Date getUdate() {
return udate;
}

public void setUdate(Date udate) {
this.udate = udate;
}

public String getUserid() {
return userid;
}

public void setUserid(String userid) {
this.userid = userid;
}

public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("accountid=").append(this.accountid);
sb.append(",userid=").append(this.userid);
sb.append(",password=").append(this.password);
sb.append(",name=").append(this.name);
sb.append(",email=").append(this.email);
sb.append(",rdate=").append(this.rdate);
sb.append(",udate=").append(this.udate);
return sb.toString();
}
}


package org.seasar.application.gusuku.dao;

import java.util.List;

import org.seasar.application.gusuku.model.Account;

/**
* @author duran
*/
public interface AccountDao {

public final static Class BEAN = Account.class;

public final static String insert_NO_PERSISTENT_PROPS = "rdate";

public final static String findAll_QUERY = "select * from Account";

public int insert(Account account);

public int update(Account account);

public int delete(Account account);

public int deleteBatch(List accounts);

public List findAll();

}


package org.seasar.application.gusuku.test;

import java.util.Iterator;
import java.util.List;

import org.seasar.application.gusuku.dao.AccountDao;
import org.seasar.application.gusuku.model.Account;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;

/**
* @author duran
*
*/
public class DaoTest {

private final static String PATH = "org/seasar/application/gusuku/dao/AccountDao.dicon";

public static void main(String[] args) {
S2Container container = S2ContainerFactory.create(PATH);
container.init();
try {
AccountDao dao = (AccountDao) container
.getComponent(AccountDao.class);

Account account = new Account();
account.setUserid("userid");
account.setPassword("password");
account.setName("duran");
account.setEmail("duran@hoge.org");

dao.insert(account);

List result = dao.findAll();

for(Iterator ite = result.iterator();ite.hasNext();){
System.out.println(ite.next());
}

//全件削除
dao.deleteBatch(result);

} finally {
container.destroy();
}
}
}

  • dao.dicon


< ?xml version="1.0" encoding="UTF-8"?>







< ?xml version="1.0" encoding="Shift_JIS"?>









"org.hsqldb.jdbcDriver"


"jdbc:hsqldb:hsql://localhost:9001"

"sa"
""



600
10



  • AccountDao.dicon


< ?xml version="1.0" encoding="UTF-8"?>





dao.interceptor


やっとここから解説です。


public static final String accountid_ID = "identity";
これで、DBから連番を取得します。
あとはDBのカラムに合わせたsetter/getterを定義しています。


public final static Class BEAN = Account.class;
DaoがどのJavaBeanと関連付けるのかを指定しています。ここではAccountと関連付けています。

public final static String insert_NO_PERSISTENT_PROPS = "rdate";
カラム「rdate」にはDB側でデフォルト値を設定しているので、insert時にはrdateを永続化の対象から外しています。

public final static String findAll_QUERY = "select * from Account";
全件取得を行うfindAllメソッドのSQLを定義しています。

  • dao.dicon

S2Daoで必要なS2DaoInterceptorを定義しています。

DB接続に必要な情報を定義しています。

  • AccountDao.dicon

AccountDaoにS2Daoを適用するためにAOPの定義を行っています。

  • 実行結果


DEBUG 2005-02-07 23:37:21,265 [main] 物理的なコネクションを取得しました
DEBUG 2005-02-07 23:37:21,265 [main] 論理的なコネクションを取得しました
DEBUG 2005-02-07 23:37:21,375 [main] 論理的なコネクションを閉じました
DEBUG 2005-02-07 23:37:21,406 [main] 論理的なコネクションを取得しました
DEBUG 2005-02-07 23:37:21,406 [main] INSERT INTO Account (name, userid, password, email, udate)
VALUES('duran', 'userid', 'password', 'duran@hoge.org', null)
DEBUG 2005-02-07 23:37:21,421 [main] CALL IDENTITY()
DEBUG 2005-02-07 23:37:21,421 [main] 物理的なコネクションを取得しました
DEBUG 2005-02-07 23:37:21,421 [main] 論理的なコネクションを取得しました
DEBUG 2005-02-07 23:37:21,421 [main] 論理的なコネクションを閉じました
DEBUG 2005-02-07 23:37:21,421 [main] 論理的なコネクションを閉じました
DEBUG 2005-02-07 23:37:21,437 [main] select * from Account
DEBUG 2005-02-07 23:37:21,437 [main] 論理的なコネクションを取得しました
DEBUG 2005-02-07 23:37:21,468 [main] 論理的なコネクションを閉じました
accountid=133,userid=userid,password=password,name=duran,
email=duran@hoge.org,rdate=2005-02-07 00:00:00.0,udate=null
DEBUG 2005-02-07 23:37:21,468 [main] 論理的なコネクションを取得しました
DEBUG 2005-02-07 23:37:21,468 [main] DELETE FROM Account WHERE accountid = 133
DEBUG 2005-02-07 23:37:21,468 [main] 論理的なコネクションを閉じました
DEBUG 2005-02-07 23:37:21,468 [main] 物理的なコネクションを閉じました
DEBUG 2005-02-07 23:37:21,484 [main] 物理的なコネクションを閉じました
思った通りの結果を得ることができました。
次はS2DaoTestCaseとトランザクションに挑戦します。