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 學起來就會比較繁瑣也比較難

沒有留言:

張貼留言