MyBatis3がMyBatis2に比べて結構使いやすくなっています。
特に実装クラスを必要としないMapperの機能が便利です。
他には、XMLでognl式が使えたり、使いやすいタグが増えています。
Spring3 + MyBatis3の実装例で試してみます。
まず、データクラスを作成します。
- User.java
-
package com.brightgenerous.sample.application.bean; import java.io.Serializable; public class User implements Serializable { private static final long serialVersionUID = -1056270813521861315L; private Integer m_id; private String m_name; private String m_email; public Integer getId() { return m_id; } public void setId(Integer x_id) { m_id = x_id; } public String getName() { return m_name; } public void setName(String x_name) { m_name = x_name; } public String getEmail() { return m_email; } public void setEmail(String x_email) { m_email = x_email; } }
次に、Dao(Mapper)インターフェースを作成します。
- UserDao.java
-
package com.brightgenerous.sample.application.dao; import com.brightgenerous.sample.application.bean.User; public interface UserDao { User select(User x_user); int insert(User x_user); int update(User x_user); int delete(User x_user); }
そして、UserDao.javaと同じパッケージにUserDao.xmlを置きます。(拡張子以外のファイル名を同じにする)
それだけでインターフェースとXMLファイルが関連付けられます。
- UserDao.xml
-
select coalesce((select max(id) from t_user),0) + 1 as id insert into t_user ( id, name, email ) values ( #{id}, #{name}, #{email} )update t_user set name = #{name}, email = #{email} where id = #{id} delete from t_user where id = #{id}
最後に、トランザクション境界となるServiceクラスを作成します。
- UserService.java
-
package com.brightgenerous.sample.application.service; import javax.inject.Inject; import com.brightgenerous.sample.application.bean.User; import com.brightgenerous.sample.application.dao.UserDao; public class UserService { @Inject private UserDao m_userDao; public User get(User x_user) { return m_userDao.select(x_user); } public void update(User x_user) { m_userDao.update(x_user); } }
あとは設定ファイルを書くだけです。
注入先フィールドのInjectアノテーションはjavax.inject.Injectです。
実は、上記のすべてのクラスでMyBatisやSpringに関するインポートがないのです。
- applicationContext.xml
PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED,readOnly
applicationContext.xmlには
com.brightgenerous.extension.spring3.FqcnBeanNameGeneratorというクラスがありますが、
これは、ただFQCNを返すだけのSpringのBeanNameGenerator実装です。
database.propertiesファイルは特にここで書くほどでもないので省略します。
- sqlMapConfig.xml
実行方法は以下のようになります。
- UserServiceTestSpring
package com.brightgenerous.sample.application.service; import com.brightgenerous.sample.application.bean.User; import com.brightgenerous.sample.application.dao.UserDao; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UserServiceTestSpring { private ApplicationContext context; @Before public void before() { context = new ClassPathXmlApplicationContext("applicationContext.xml"); } @Test public void test01() { UserService service = context.getBean(UserService.class); User user = new User(); user.setId(Integer.valueOf(1)); user = service.get(user); user.setName(user.getName() + "-"); service.update(user); } }
これ以上ソースコードの記述量を減らせないんじゃないのかと思えるほど、簡単になりました。
設定ファイルは一度書いてしまえば、以降は編集しないので、
実際に作成するファイルはデータクラス、Mapperインターフェース、MapperのXMLファイル、サービスクラスの4つです。
次回は、SpringをGuiceに置き換えて同じ機能を実現してみようと思います。
具体的には、Springでの設定ファイルにあたる部分をソースで書くだけで、Mapperやサービスクラスには手を加えません。
これ動かないよ。嘘書かないで
返信削除