SAStruts+S2JDBCでwebアプリ(5)

S2JDBC(ORマッピング)

S2JDBCはDBのアクセスとJavaオブジェクトの変換を行うO/Rマッピングフレームワーク

DB接続設定

今回は、DBにMysqlを使用します。
設定ファイルは、jdbc.dicons2jdbc.diconです。
jdbc.dicon:DB接続詳細設定、コネクションプール設定etc
s2jdbc.dicon:JdbcManagerのコンポーネント設定


jdbc.dicon

<component name="xaDataSource"
	class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
<property name="driverClassName">"com.mysql.jdbc.Driver"</property>
<property name="URL">
"jdbc:mysql://192.168.0.10:3306/test"
</property>
<property name="user">"xxx"</property>
<property name="password">"xxx"</property>
</component>

s2jdbc.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">mysqlDialect</property>

select

    //条件にidを指定して、単一レコード取得
    public Dept getDept(){
    	Dept dept = jdbcManager.from(Dept.class).id(1).getSingleResult();
    	return dept;
    }
    //一覧取得
    public List<Dept> getDeptList() {
    	List<Dept> list = jdbcManager.from(Dept.class).getResultList();
    	return list;
    }
    //where条件
    public Dept getDeptWhere() {
    	Dept dept = jdbcManager.from(Dept.class).where("LOC = ? ","BOSTON").getSingleResult();
    	return dept;
    }
    //カウント取得
    public int getDeptCount() {
    	return (int) jdbcManager.from(Dept.class).getCount();
    }

ソート

    // IDカラムの降順
    public List<Dept> getSortList() {
    	List<Dept> list = jdbcManager.from(Dept.class).orderBy("ID DESC").getResultList();
    	return list;
    }

insert

    //挿入
    public int exeDeptInsert() {
    	Dept entity = new Dept();
    	entity.deptName = "AAA";
    	entity.deptNo = 110;
    	entity.loc = "Fukuoka";
    	return jdbcManager.insert(entity).execute();
    }

update

    //更新処理
    public int exeDeptUpdate() {
    	Dept entity = jdbcManager.from(Dept.class).id(6).getSingleResult();
    	entity.deptName = "BBB";
    	return jdbcManager.update(entity).execute();
    }

    //排他制御
    public int exeDeptUpdate() {
    	Dept entity = jdbcManager.from(Dept.class).id(6).forUpdate().getSingleResult();
    	entity.deptName = "BBB";
    	return jdbcManager.update(entity).execute();
    }

delete

    // 削除処理
    // versionNo条件も必要になるらしい。
    public int exeDeptDelete() {
    	Dept entity = new Dept();
    	entity.id = (long)8;
    	entity.versionNo = 1;
    	return jdbcManager.delete(entity).execute();
    }

GroupBY

残念ながら、GroupByは、サポートされてないらしい。
よって、SQLべた書きもしくは、外部SQLに記述する
しなかいっぽい。


テーブル結合

1対多
DEPTが1、EMPが多。

//EMPエンティティでの宣言
    @ManyToOne
    @JoinColumn(name="DEPT_ID",referencedColumnName="ID")
    public Dept dept;


//サービスクラスでの宣言
    public Emp getJoin() {
    	Emp emp = jdbcManager.from(Emp.class).innerJoin("DEPT").id(3).getSingleResult();
    	return emp;
    }

多対1
EMPが多、DEPTが1。

//DEPTエンティティでの宣言
    @OneToMany(mappedBy="dept")
    public List<Emp> empList;
//サービスクラスでの宣言(条件も追加できる)
    public Dept getJoin() {
    	Dept dept = jdbcManager.from(Dept.class).leftOuterJoin("empList",true,"EMP_NO > 7800").id(2).getSingleResult();
    	return dept;
    }

SQLべた書き

    public Dept selectSql(){
    	String sql = "SELECT * FROM DEPT WHERE ID = ?";
    	String params = "3";
		Dept dept = jdbcManager.selectBySql(Dept.class, sql, params).getSingleResult();
		return dept;
    }

    public int updateSql(){
    	String sql = "UPDATE DEPT SET LOC = ? WHERE ID = ?";
    	int cnt = jdbcManager.updateBySql(sql,String.class,String.class).params("HHH",7).execute();
    	return cnt;
    }

外部SQLファイル

外部SQL(src/main/resource配下にUTF-8で作成する)

SELECT * FROM DEPT WHERE ID > /*ee*/0
/*IF order != null*/
ORDER BY /*$order*/ID
/*END*/

参照Java

    public List<Dept> selectSqlFile(){
    	String path = "/sql/select.sql";
    	SelectParam param = new SelectParam();
    	param.ee = 3;
    	param.order = "DEPT_NAME";
    	List<Dept> list = jdbcManager.selectBySqlFile(Dept.class, path,param).getResultList();
    	return list;
    }

トランザクション

トランザクションは、基本的にAOPによるトランザクション制御がなされている。
手動でトランザクション制御することもできます。
その場合は、
トランザクションの対象外を設定し、[@TransactionAttribute(TransactionAttributeType.NEVER)]
UserTransactionを使って、setRollbackOnly(),commit()する。


【参考URL】
続・SAStruts + S2JDBCのアーキテクチャ - 出羽ブログ