2011/03/30

[Java] SpringFrameworkとiBatisを連携させてみる

概要

今更ながら、SpringFrameworkとiBatisを連携を試してみます。
applicationContextの設定から、sqlMapの設定、テストまでを大まかに説明します。

動作環境

項目内容
OSMac OS X 10.06
DBMySQL 5.5
開発環境eclipse3.6
SpringFramework1.2
iBatis2.0

前提事項

・以下のテーブルを作成していること。
CREATE  TABLE `PERSON` (
  `PER_ID` INT NOT NULL ,
  `PER_FIRST_NAME` VARCHAR(40) NOT NULL ,
  `PER_LAST_NAME` VARCHAR(40) NOT NULL ,
  PRIMARY KEY (`PER_ID`) )
ENGINE = InnoDB;
・mysqlのJDBCドライバを入手済であること。

内容


1.SpringFrameworkのライブラリを入手する。
現時点の最新バージョンは3.0.5ですが、今回は1.2系のライブラリを入手します。
以下のURLより入手できますので、入手し適当な場所に解凍して下さい。
こちら

2.iBatisのライブラリを入手する。
現時点では「iBatis」と言う名前から「MyBatis」という名前に変更になっています。
入手についてはこちらを参考にして下さい。

3.Springの定義ファイルを作成する。

Springの定義ファイル「applicationContext-ibatis.xml」を作成します。
このファイルでは、
 ・データソースの設定
 ・iBatis設定ファイルの設定
 ・Daoに対してデータソースの設定
を行っています。



  
  
      
        com.mysql.jdbc.Driver
      
      
        jdbc:mysql://localhost/ibatis
      
      
        ibatis
      
      
        ibatis
      
  

  
      
        
      
  

  
      
        
          dao/sqlMapConfig.xml
        
      
  

  
      
        
      
      
        
      
  

  


4.iBatisの定義ファイルを作成する。

iBatisで使用する定義ファイル「sqlMapConfig.xml」を以下のように作成しました。




  


5.O/Rマッピングファイルを作成する。

O/Rマッピングファイル「PersonDao.xml」を以下のように作成しました。




  
  

上記は見ての通り、SQLです。
Hibernateだと、確かかけないんです。SQLを。
iBatisだとSQLを書けるのでSQLを良く使用しているエンジニアだと取っ付きやすいと思います。

6.DTOを作成する。
DBからの取得した結果を格納するためのDTOを作成します。
以下のようなクラスを作成しました。
public class Person {

 private int id;
 private String firstName;
 private String lastName;
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getFirstName() {
  return firstName;
 }
 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }
 public String getLastName() {
  return lastName;
 }
 public void setLastName(String lastName) {
  this.lastName = lastName;
 }
}

7.Daoクラスを作成する。

今回の例では、インタフェースとその実装クラスそれぞれを作成しました。

・PersonDao
public interface PersonDao {
 public List selectAll();
}
・PersonDaoImpl
public class PersonDaoImpl extends SqlMapClientDaoSupport implements PersonDao {

 @Override
 public List selectAll() {
  return (List) getSqlMapClientTemplate().queryForList("selectAll");
 }
}


テスト

1〜7で使用する準備が整ったので、実際に使用できるか試してみます。
public class StartUp {

 public static void main(String[] args) {

  ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-ibatis.xml");
  BeanFactory factory = (BeanFactory) context;
  PersonDao dao = (PersonDao) factory.getBean("personDao");
  List personList = dao.selectAll();
  System.out.println(personList.size());
 }
}

実行すると、以下のような感じでログが表示されました。
正常に連携できました。
2011/03/30 22:42:27 org.springframework.context.support.AbstractApplicationContext prepareRefresh
情報: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@39617189: display name [org.springframework.context.support.ClassPathXmlApplicationContext@39617189]; startup date [Wed Mar 30 22:42:27 JST 2011]; root of context hierarchy
2011/03/30 22:42:27 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
情報: Loading XML bean definitions from class path resource [applicationContext-ibatis.xml]
2011/03/30 22:42:27 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
情報: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@39617189]: org.springframework.beans.factory.support.DefaultListableBeanFactory@39b8d6f7
2011/03/30 22:42:27 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
情報: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@39b8d6f7: defining beans [dataSource,transactionManager,sqlMapClient,personDao]; root of factory hierarchy
2011/03/30 22:42:27 org.springframework.jdbc.datasource.DriverManagerDataSource setDriverClassName
情報: Loaded JDBC driver: com.mysql.jdbc.Driver
1

参考情報

なし

最後に

説明をほとんどしませんでしたが、上記の内容をおのおのの環境に合わせて使って貰えれば動作すると思います。
次回以降、トランザクションに関して試してみたいと思います。

0 件のコメント:

コメントを投稿