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 學起來就會比較繁瑣也比較難
沒有留言:
張貼留言