ibatis實戰之基礎環境搭建

來源:互聯網
上載者:User

關於ibatis的介紹、優缺點,以及ibatis和hibernate的比較再此不在贅述,可參閱其他資料。

一、準備工作

1、下載ibatis軟體包http://download.csdn.net/detail/itmyhome/7473661

   所需jar包為:ibatis-xxx.jar,mysql-connector-java-xxx-bin.jar

2、建立測試資料庫,並建立user表,其中包含三個欄位:

   id(int)
   name(varchar)
   age(int)

   ps:以mysql資料庫為例

create table user(    id int,    name varchar(50),    age int);

二、構建ibatis基礎代碼

ibatis基礎程式碼封裝括:

1、ibatis執行個體配置

   一個典型的設定檔如下

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMapConfigPUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN""http://www.ibatis.com/dtd/sql-map-config-2.dtd"><sqlMapConfig><settings cacheModelsEnabled="true" enhancementEnabled="true"lazyLoadingEnabled="true"errorTracingEnabled="true"maxRequests="32"maxSessions="10"maxTransactions="5"useStatementNamespaces="false" /><transactionManager type="JDBC"><dataSource type="SIMPLE"><property name="JDBC.Driver" value="com.mysql.jdbc.Driver" /><property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/ibatis" /><property name="JDBC.Username" value="root" /><property name="JDBC.Password" value="root" /><property name="Pool.MaximumActiveConnections" value="10" /><property name="Pool.MaximumIdleConnections" value="5" /><property name="Pool.MaximumCheckoutTime" value="120000" /><property name="Pool.TimeToWait" value="500" /><property name="Pool.PingQuery" value="select 1 from ACCOUNT" /><property name="Pool.PingEnabled" value="false" /><property name="Pool.PingConnectionsOlderThan" value="1" /><property name="Pool.PingConnectionsNotUsedFor" value="1" /></dataSource></transactionManager><sqlMap resource="com/itmyhome/User.xml" /></sqlMapConfig>

ibatis設定檔各節點簡單說明:

(1)Settings節點

參數 描述
cacheModelsEnabled 是否啟用 SqlMapClient 上的緩衝機制。
建議設為"true"
enhancementEnabled 是否針對POJO啟用位元組碼增強機制以提升
getter/setter 的調用效能,避免使用Java
Reflect 所帶來的效能開銷。
同時,這也為Lazy Loading帶來了極大的效能
提升。建議設為"true"
errorTracingEnabled 是否啟用錯誤記錄檔,在開發期間建議設為"true"
以方便調試
lazyLoadingEnabled 是否啟用消極式載入機制,建議設為"true"
maxRequests 最大並發請求數(Statement並發數)
maxTransactions 最大並發事務數
maxSessions 最大Session數.即當前最大允許的並發SqlMapClient數
maxSessions設定必須介於
maxTransactions和maxRequests之間,即
maxTransactions<maxSessions=< maxRequests
useStatementNamespaces 是否使用Statement命名空間。
這裡的命名空間指的是對應檔中,sqlMap節點
的namespace屬性,如在上例中針對user
表的對應檔sqlMap節點:
<sqlMap namespace="User">
這裡,指定了此sqlMap節點下定義的操作均從
屬於"User"命名空間。
在useStatementNamespaces="true"的情況下,
Statement調用需追加命名空間,如:
sqlMap.update("User.updateUser",user);
否則直接通過Statement名稱調用即可,如:
sqlMap.update("updateUser",user);
但請注意此時需要保證所有對應檔中,
Statement定義無重名

(2)transactionManager節點

   transactionManager節點定義了ibatis的交易管理員,目前提供了以下幾種選擇:
   1)  JDBC
   通過傳統 JDBC Connection.commit/rollback實現事務支援。
   2)  JTA
   使用容器提供的JTA服務實現全域交易管理。
   3)  EXTERNAL
   外部交易管理,如在EJB中使用ibatis,通過EJB的部署配置即可實現自動的交易管理機制。

   此時ibatis將把所有事務委託給外部容器進行管理。此外,通過Spring等輕量級容器實現事務的配置化管理也是一個不錯的選

   擇。關於結合容器實現交易管理,參見“進階特性”中的描述。

(3)dataSource節點

   dataSource從屬於transactionManager節點,用於設定ibatis運行期使用的DataSource屬性。

   type屬性:dataSource節點的type屬性指定了dataSource的實作類別型。

   可選項目:

   1)  SIMPLE:

   SIMPLE是ibatis內建的dataSource實現,其中實現了一個簡單的資料庫連接池機制,對應ibatis實作類別為

   com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory。

   3)  DBCP:

   基於Apache DBCP串連池組件實現的DataSource封裝,當無容器提

   供DataSource服務時,建議使用該選項,對應ibatis實作類別為com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory。

   3)  JNDI:

   使用J2EE容器提供的DataSource實現,DataSource將通過指定

   的JNDI Name從容器中擷取.對應ibatis實作類別為com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory。

    dataSource的子節點說明(SIMPLE&DBCP):

JDBC.Driver JDBC驅動.如:com.mysql.jdbc.Driver
JDBC.ConnectionURL 資料庫URL。如:jdbc:mysql://localhost:3306/ibatis
如果用的是SQLServer JDBC Driver,需要
在url後追加SelectMethod=Cursor以獲得
JDBC事務的多Statement支援。
JDBC.Username 資料庫使用者名稱
JDBC.Password 資料庫使用者密碼
Pool.MaximumActiveConnections 資料庫連接池可維持的最大容量。
Pool.MaximumIdleConnections 資料庫連接池中允許的掛起(idle)串連數。

(4)sqlMap節點

sqlMap節點指定了對應檔的位置,配置中可出現多個sqlMap節點,以指定

項目內所包含的所有對應檔。

2、POJO

下面是我們用作樣本的一個POJO

public class User implements Serializable {private static final long serialVersionUID = 1L;private int id;private String name;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}


3、對應檔

與Hibernate不同,因為需要人工編寫sql代碼 ibatis的對應檔一般採用手動編寫

<?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="User"><typeAlias alias="user" type="com.itmyhome.User" /><!-- 查詢 --><select id="getUser" parameterClass="java.lang.Integer" resultClass="user"><![CDATA[    select name,age from user where id = #id#]]></select><!-- 插入 --><insert id="insertUser" parameterClass="user">    insert into user values(#id#,#name#,#age#)</insert><!-- 更新 --><update id="updateUser"     parameterClass="user"> <![CDATA[update user SET name=#name#, age=#age#WHERE id = #id# ]]></update><!-- 刪除 --><delete id="deleteUser" parameterClass="java.lang.Integer">delete from user where id = #id# </delete></sqlMap>
從上面的對應檔可以看出,通過<insert>、<delete>、<update>、

<select>四個節點,我們分別定義了針對User對象的增刪改查操作。在這

四個節點中,我們指定了對應的SQL語句,以update節點為例:

<update id="updateUser"                        (1parameterClass="user">                     (2<![CDATA[                                  (3  update user                            (4  SET name=#name#, age=#age#             (5WHERE id = #id# ]]></update>
⑴ID

指定了操作ID,之後我們可以在代碼中通過指定操作id來執行此節點所定義的操作,如:

sqlMap.update("updateUser",user);

ID設定使得在一個設定檔中定義兩個同名節點成為可能(兩個update節點,以不同id區分)

⑵ parameterClass

指定了操作所需的參數類型,此例中update操作以

com.itmyhome.User 類型的對象作為參數,目標是將提供的User執行個體更新到資料庫。

parameterClass="user"中,user為"com.itmyhome.User"類的別名,別名可通過typeAlias節點指定,

如樣本設定檔中的:<typeAlias alias="user" type="com.itmyhome.User"/>

⑶  <![CDATA[… ]]>

通過<![CDATA[… ]]>節點,可以避免SQL中與XML規範相衝突的字元對XML對應檔的合法性造成影響。

⑷執行更新操的SQL,這裡的SQL即實際資料庫支援的SQL語句,將由ibatis填入參數後交給資料庫執行。

⑸ SQL中所需的使用者名稱參數,"#name#"在運行期會由傳入的user對象的name屬性填充。(其他參數同)

對於這個樣本,ibatis在運行期會讀取id為"updateUser"的update節點

的SQL定義,並調用指定的user對象的對應getter方法擷取屬性值,並用此

屬性值,對SQL中的參數進行填充後提交資料庫執行。

好了,我們完成了所有的設定檔和對應檔,就剩下應用的編碼工作了。

首先要設定SQL Map,讀入剛建立好的SQL Map XML設定檔。為簡化這個工作,可以使用

SQL Map架構中提供的Resources類。

Stringresource ="SqlMapConfig.xml"; Readerreader=Resources.getResourceAsReader(resource); SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);

以上的SqlMapClient對象是安全執行緒,並且應持久生存。對於一個特定的應用,只需

進行一次SqlMap配置。因此,它可以作為基類的一個靜態對象(即DAO對象的基類),或

者,如果您想讓它有更大的作用範圍,可以把它封裝在方便使用的類中。例如:

public class MyAppSqlConfig {private static final SqlMapClient sqlMap;static {try {String resource = "SqlMapConfig.xml";Reader reader = Resources.getResourceAsReader(resource);sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);} catch (Exception e) {e.printStackTrace();throw new RuntimeException("Error initializing MyAppSqlConfig class. Cause: " + e);}}public static SqlMapClient getSqlMapInstance() {return sqlMap;}}

從資料庫讀取對象

既然SqlMap對象已完成初始化,那麼就可以方便地使用它了。首先我們用它

從資料庫中讀取一個User對象(本例中 先假設User表中一村莊N條記錄,id從i到N)

要從資料庫中得到一個User對象,只需要SqlMap執行個體,讓我們讀入id為1的User對象

SqlMapClient sqlMap = MyAppSqlConfig.getSqlMapInstance(); User user = (User)sqlMap.queryForObject ("getUser", 1);

把對象寫入資料庫
User u = new User();u.setId(2);u.setName("wangwu");u.setAge(23);sqlMap.insert("insertUser",u);

更新對象

User u = new User();u.setId(3);u.setName("itmyhome");u.setAge(25);sqlMap.update("updateUser",u)

刪除對象

sqlMap.delete("deleteUser", 1)


項目工程圖如下:



項目源碼下載:http://download.csdn.net/detail/itmyhome/7473721



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.