Apache iBATIS
O/Rマッピングフレームワークで有名なhibernateを試そうとしたのだが、
「難しい割りに効果が見込めない」とか、「iBATISの方が簡単でよい」
などの意見が各サイトで散見された為、iBATISを試すことにした。
以下のサイトを参考に動かすところまで。
http://634.ayumu-baby.com/ibatis/index.html
Derby、ij起動後
ij>connect 'jdbc:derby://localhost/SampleDB;create=true';
ij>create table iuser (
id numeric(3) not null,
name varchar(10),
age varchar(2),
constraint pk_user primary key (id)
);
userというテーブルが作りたかったのにSyntax Errorに阻まれる。
Derbyにとっての予約語なのかもしれない。
テーブルのカラムに対応してアクセサがついているクラス
User.java
package ibatis; public class User { private String id = null; private String name = null; private String age = null; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
SQL実行結果とPOJOのマッピングを記述するxmlファイル。
human.ibatis.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd"> <sqlMap namespace="User"> <selectsql id="getUser" parameterClass="java.lang.String" resultClass="ibatis.User"> SELECT ID, NAME, AGE FROM app.iUSER WHERE ID = #VALUE# </selectsql> <update id="updateUser" parameterClass="ibatis.User"> UPDATE app.iUSER SET NAME = #name# <dynamic> <isNotNull prepend="," property="age"> AGE = #age# </isNotNull> </dynamic> WHERE id = #id# </update> <delete id="deleteUser" parameterClass="string"> DELETE FROM app.iUSER WHERE ID = #id# </delete> <insert id="insertUser" parameterClass="ibatis.User"> INSERT INTO app.iUSER ( ID, NAME, AGE ) VALUES ( #id#, #name#, #age# ) </insert> </sqlMap>
Config用xmlファイル。ClientDriverはユーザー、パスがないと怒られるので指定。
sql-map-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> <sqlMapConfig> <transactionManager type="JDBC"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="org.apache.derby.jdbc.ClientDriver"/> <property name="JDBC.ConnectionURL" value="jdbc:derby://localhost/SampleDB"/> <property name="JDBC.Username" value="kimu"/> <property name="JDBC.Password" value="pass"/> </dataSource> </transactionManager> <sqlMap resource="human.ibatis.xml"/> </sqlMapConfig>
利用する。
SampleSQL.java
package test; import ibatis.User; import java.io.Reader; import com.ibatis.common.resources.Resources; import com.ibatis.sqlmap.client.SqlMapClient; import com.ibatis.sqlmap.client.SqlMapClientBuilder; public class SampleSQL { public static void main(String[] args)throws Exception{ String resource = "sql-map-config.xml"; Reader reader = Resources.getResourceAsReader(resource); SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); // SELECT User user = (User)sqlMap.queryForObject("getUser", "1"); System.out.println(user.getId() + "\t" + user.getName()); // UPDATE user.setName("hello"); user.setAge("99"); sqlMap.update("updateUser", user); // INSERT user.setName("XYZ"); user.setAge("99"); user.setId("4"); sqlMap.insert("insertUser", user); // DELETE sqlMap.delete("deleteUser", "1"); } }
一通り動かしたが、パラメータにListを渡せばiterateしてくれるなど
他にも便利な機能がたくさんあるようだ。
iBatis自体のレビューは別でやりたい。