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 ,並將所需的類別庫匯入
首先先建立一個一般的 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 學起來就會比較繁瑣也比較難
沒有留言:
張貼留言