SAStruts+S2JDBCでwebアプリ(5)
S2JDBC(ORマッピング)
S2JDBCはDBのアクセスとJavaオブジェクトの変換を行うO/RマッピングのフレームワークDB接続設定
今回は、DBにMysqlを使用します。設定ファイルは、jdbc.diconとs2jdbc.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()する。