2012年1月9日月曜日

Spring3 + MyBatis3

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やサービスクラスには手を加えません。

1 件のコメント: