2011年5月12日 星期四

iBatis 教學 - Eclipse 配置與範例

iBatis Apache Software Foundation 中的一項 ORM 的解決方案

說到 iBatis 的話,其主要是能夠大量減少操作資料庫的繁複程式碼

而 iBatis 也是透過類似 Hibernate 的映射文件的XML格式來做 Javabean  SQL 的語句轉換

但這也是它和 Hibernate 不太一樣的地方。我的解釋是 Hibernate 主要是將物件或物件彼此之間的關係透過映射文件對應到資料庫

通常這些物件都是 Entity Type 也有些許是 Value Type例如將一個 User 的實體類別映射到某 table

甚至是連帶的關聯關係和繼承的等等都能透過 Hibernate 的映射文件映射到資料庫

iBatis 則是將Javabean 透過 XML 的設定來和SQL做轉換


也就是說但它可以讓多個 javabean 映射到一張表也可以將多張表映射成一個 javabean

或許可以說他對資料的定義比較寬鬆,例如你可以自定回傳的型態甚至是它裡面的屬性等

接下來介紹一下用 Eclipse 來配置一個簡單的 iBatis 範例

首先我是在這網址下載他的類別庫

我是下載  iBATIS 2.3.4 release 版本的

下載完成後同樣透過 window > preferences > Java > Build Path > User Libraries 

並新增一個新的 Library 再將下載下來的ZIP檔壓縮後的 lib 資料夾下的JAR檔加入即可

另外你還需要有 JDBC 的驅動包和你所使用的資料庫的相關JAR

首先 iBatis 有分兩大類的配置文件

1. 一個是 ibatis 這個 framework 的配置文件,它就很像 Hibernate 的  hibernate.cfg.xml

2. 當然就是他的映射文件摟

以下先來看看他的配置文件 SqlMapConfig.xml,不外乎就那些最基本的資料庫配置了


首先先建立一個一般的 Java Project ,並將所需的類別庫匯入 


<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMapConfig     
    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"     
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>

    <!-- Configure a built-in transaction manager.  If you're using an
         app server, you probably want to use its transaction manager
         and a managed datasource -->
        
     <!-- 以下這個檔案是有關於資料庫相關訊息的,所以需要讓 iBatis 知道
           但可以不必這樣做,也可以直接將直寫在下面 -->
    <!--properties resource="database.properties" /-->
   
   < 以下很熟悉吧 >
    <transactionManager type="JDBC" commitRequired="false">
        <dataSource type="SIMPLE">
            <property name="JDBC.Driver" value="${driver}"/>
            <property name="JDBC.ConnectionURL" value="${url}"/>
            <property name="JDBC.Username" value="${username}"/>
            <property name="JDBC.Password" value="${password}"/>
        </dataSource>
    </transactionManager>
   
     <!-- 以下是註冊映射文件的地方 -->
    <sqlMap resource="org/sqlMap/ProductManager.xml"/>

</sqlMapConfig>

看完以上配置文件如果你有只用 properites 的檔案配置話那內容大約如下


driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/myweb
username=root
password=123456   而這兩個檔案你可以直接放在 src 的目錄下


看完之後我們來做一個簡單的 javabean 與 SQL 的映射,首先以下有個 ProductManager


package org.pojo;
public class ProductManager 
{
    private int id;
    private String account;
    private String password;
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getAccount() {
        return account;
    }
    public void setAccount(String account) {
        this.account = account;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

而資料庫的不份呢這邊就不再多述,其資料型態和欄位都跟 ProductManager 的個 javabean 一樣

接下來看看最重要的(ProductManager.xml)映射文件,也是一樣將它放在 src 目錄下或是其子目錄都可以


<?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="ProductManager">
     <!—這裡設定了一個 select 標籤,來透過傳入指定的 id 來撈出特定一筆的資料
         parameterClass int 代表傳入的 id 參數的型態, resultClass
         則代表了回傳型態, id 屬性則是在撰寫 Java 時用於指定哪一條 SQL 語句的
         所以不能重複 !!-- >
    <select id="getPM" resultClass="org.pojo.ProductManager" parameterClass="int">
        SELECT * FROM t_pm
        WHERE id = #value#
    </select>
</sqlMap>

以上的配置文件中,傳入的 int 參數在指定值的時候是這樣寫 #value# 

通常一般要求的 CRUD 都有對應到相關的標籤,如:select、update、delete、insert

這部份我之後再慢慢介紹

最後來看看要如何來讓 iBatis 動起來 > 以下主要是要將 SqlMapClient 初始化,他是 iBatis 的核心

IBatisConfig.java

package org.test;
import java.io.IOException;
import java.io.Reader;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class IBatisConfig 
{
    private static final SqlMapClient sqlMapclient; 
    static{
        try {
            String resource = "SqlMapConfig.xml";   //配置檔的路徑, 還記得嗎我是直接放在目錄下
            Reader reader = Resources.getResourceAsReader (resource);
            sqlMapclient = SqlMapClientBuilder.buildSqlMapClient(reader);
        }catch(IOException e){
            e.printStackTrace();
            throw new RuntimeException ("Error initializing MyAppSqlConfig class. Cause: " + e);
        } 
    }
    public static SqlMapClient getSqlMapclient(){
        return sqlMapclient;
    }
}

最後用 JUnit 測試,如果用 JU測試記得匯入他的類別庫


package org.test;
import java.sql.SQLException;
import org.pojo.ProductManager;
import com.ibatis.sqlmap.client.SqlMapClient;
import junit.framework.TestCase;
public class TestIbatis extends TestCase
{
    public void testIbatis()
    {
        // iBatis 的操作核心都在 SqlMapClient 上
        SqlMapClient sqlMapClient = IBatisConfig.getSqlMapclient();
        try{
           //透過 SqlMapClient 的 queryForObject 方法撈出資料,他有多種覆載方法可以用
       //可以去查查他的文件,這裡注意的是 "getPM" 它對應到了映射文件的 id 屬性
           ProductManager pm = (ProductManager)sqlMapClient.queryForObject("getPM", 1);
           if(null != pm){
               System.out.println("PM_name : " + pm.getName());
           }else{
               System.out.println("查無此筆資料");
           }
        }catch(SQLException e) {
           e.printStackTrace();
           System.out.println(e.getMessage());
        }
    }
}

最後做個總結,雖然 iBatis 對資料的定義((包括回傳型態 之後會談到 resultMap

比較寬鬆,但實際上妳還是要撰寫很多的 SQL 語句

不過 iBatis 比較好學習較好上手

但他並不能像 Hibernate 那樣可以不用程式設計師撰寫過多的 SQL

甚至還提供了 HQL 這種以物件為觀點的操作語法

相對的 Hibernate 學起來就會比較繁瑣也比較難

沒有留言:

張貼留言