iBatis 在DAO層的用法很基礎,和通常 JDBC 用法沒太多的不一樣之處,主要是實現數據的持久化。它的優點是用法比較靈活,能夠根據業務須要,寫出適應須要的sql,其使用簡單,只要會使用sql,就能使用該框架開發。下面咱們主要學習一些關於iBatis的基礎sql配置語法,稍複雜的語法將在下一章討論。
在上一張咱們討論瞭如何搭建一個 iBatis 的開發環境,很是簡單,導入相應的 jar 包,而後就能夠開始享受框架的魅力了,這一章咱們着重講基礎的 iBatis 語法,SqlMapClient這個類是咱們經過 iBatis 操做數據庫的關鍵類,它提供了咱們鏈接數據庫的接口,並提供了一系列訪問數據庫的接口方法,咱們只要拿到了這個對象,就能實現對數據庫的各類操做了。java
本節要點:
1、SqlMapClient對象的經常使用方法sql
2、核心配置文件的說明數據庫
3、SQL配置文件簡要用法
一、使用 iBatis 實現查詢功能,即 select 的功能
二、使用 iBatis 實現更新功能,即 update 的功能
三、使用 iBatis 實現新增功能,即 insert 的功能
四、使用 iBatis 實現刪除功能,即 delete 的功能緩存
-------------------------- 1、SqlMapClient對象的經常使用方法 -------------------------------
一、queryForObject()
該方法主要從數據庫中獲取一條記錄,並將它放到一個 java 對象中,主要有以下兩種用法,第一種較爲經常使用。
sqlMapClient.queryForObject(String id, Object parameter);
sqlMapClient.queryForObject(String id, Object parameter,Object result);數據結構
其中的id 是一個關聯到sql配置文件的標示,parameter是sql語句的入參,後面雷同,再也不詳述。
須要注意的是,使用這個方法只能返回一條記錄,若是返回記錄超過一條,將拋出異常,因此咱們須要限制返回結果只有一條記錄。併發
二、queryForList()
該方法主要從數據庫中獲取一個List的 java 對象列表,返回的能夠是一道多行,主要有以下兩種用法:
sqlMapClient.queryForList(String id, Object parameter);
sqlMapClient.queryForList(String id, Object parameter,int skip,int size)app
注意其中的第二種用法,它能夠返回從 skip 的位置開始,並向後取 size 條數據。通常的分頁功能能夠經過它來實現。框架
三、queryForMap()
該方法用於從數據庫獲取一行或者多行組成的一個Map,它主要有以下兩個本版的方法:
sqlMapClient.queryForMap(String id, Object parameter,String key);
sqlMapClient.queryForMap(String id, Object parameter,String key,String value);學習
須要指出的是,第一個方法返回的 Map 的 key 有方法中的第三個參數指定,具體取對象的哪一個屬性做爲 key 能夠指定,其 value 是一個具體的java 類;一樣的,第二個方法與第一個方法的差異是其 map 的 value 也能夠指定,且再也不是java 對象,而是一個字符串String。測試
四、sqlMapClient.update();
該方法主要用於執行更新語句
sqlMapClient.update(String id, Object parameter)
五、sqlMapClient.insert()
該方法主要用於將數據插入到數據庫中。
sqlMapClient.insert(String id, Object parameter)
六、sqlMapClient.delete()
該方法主要用於將數從數據庫中刪除。
sqlMapClient.delete(String id, Object parameter)
-------------------------- 2、核心配置文件的說明 -------------------------------
iBatis的核心配置文件,通常命名爲SqlMapConfig.xml,固然咱們也能夠命名爲其餘的名字。這個文件稱爲核心配置文件,也叫主配置文件,包括數據庫鏈接以及sql配置文件的引用都是在這個文件中完成的。下面咱們看一下這個配置文件的具體元素。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<!-- 一、資源文件引用 -->
<properties resource="db.properties"/>
<!-- 二、 全局配置管理-->
<settings
maxSession="20"
/>
<!-- 三、配置事務管理 -->
<transactionManager type="JDBC">
<!-- 配置數據源 -->
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="${driver}"/>
<property name="JDBC.ConnectionURL" value="${url}"/>
<property name="JDBC.Username" value="${user}"/>
<property name="JDBC.Password" value="${password}"/>
</dataSource>
</transactionManager>
<!-- 四、引用具體的 sql 配置文件 -->
<sqlMap resource="config/sqlmap-mapping-student.xml"/>
</sqlMapConfig>
咱們能夠看到主配置文件主要包含4大部分,下面分別講這幾個部分的做用。
一、資源文件應用部分,這個主要是讓咱們能夠將一些信息寫到資源文件中,而後再這個文件中經過引用這個資源文件便可訪問資源文件中的數據信息,例如咱們能夠將數據庫鏈接信息寫到資源文件中,而後再這個文件中讀取信息便可。
二、全局配置選項部分,這個部分的配置對整個項目來說都是全局的,咱們能夠將一些全局的選項配置到這裏面,例如數據是否使用緩存等信息
三、事務管理配置部分,這個部分主要配置數據庫的事務管理,以及數據源的加載等信息。關於數據庫的事務管理咱們在本章最後講解。
四、引入具體的sql配置文件,咱們在整個項目中可能存在衆多的sql配置文件,咱們須要在這裏對全部的sql配置文件進行註冊引用,才能正常的使用。
-------------------------- 3、SQL配置文件簡要用法 -------------------------------
看完了SqlMapClient的具體方法,那麼在java代碼中如何獲取數據庫中的數據就有了一個基本的認識,可是具體從數據中得到數據的具體配置還須要詳細討論,下面咱們主要看一下sql的配置文件的用法。
通常的語法以下:
<sqlMap>
<何種語法 id="XXX" parameterClass="入參類型" resultClass="返回值的類型">
具體的SQL語句
</何種語法>
<sqlMap>
其中的"何種語法"主要包括的 insert、select、update、delete等基本語法,ID是咱們與SqlMapClient交互的一個信號,這個ID決定咱們代碼中的程序讀取sql配置文件中的哪一個sql語句的對應關係。parameterClass指定的sql的入參類型,resultClass決定了sql語句最終的返回值類型。
下面分別舉例說明。先附數據信息以下:
一、使用 iBatis 實現查詢功能,即 select 的功能
sqlmap-mapping-student.xml:
<sqlMap>
<select id="test_select" parameterClass="java.lang.Integer" resultClass="com.test.bean.Student">
select name,sex from t_stu where id=#id#
</select>
<sqlMap>
--java代碼以下:
SqlMapClient sqlMapClient = BaseDAO.getInstance();
try {
Student student = (Student) sqlMapClient.queryForObject("test_select",1);
System.out.println(student.getName());
} catch (SQLException e) {
e.printStackTrace();
}
咱們能夠看出,經過查詢後返回的結果放到了一個 Student 實例中。
二、使用 iBatis 實現更新功能,即 update 的功能
sqlmap-mapping-student.xml:
<update id="test_update" parameterClass="com.test.bean.Student">
update t_stu set name=#name# where id=#id#
</update>
--java代碼以下:
SqlMapClient sqlMapClient = BaseDAO.getInstance();
try {
Student student = new Student();
student.setId(3);
student.setName("修改後的姓名");
int k = sqlMapClient.update("test_update", student);
System.out.println("更新記錄條數爲:"+k);
} catch (SQLException e) {
e.printStackTrace();
}
執行更新後數據庫記錄以下:
三、使用 iBatis 實現新增功能,即 insert 的功能
sqlmap-mapping-student.xml:
<update id="test_insert" parameterClass="com.test.bean.Student">
insert into t_stu(name,sex) values(#name#,#sex#)
</update>
--java代碼以下:
SqlMapClient sqlMapClient = BaseDAO.getInstance();
try {
Student student = new Student();
student.setName("新增學生測試");
student.setSex("男");
sqlMapClient.insert("test_insert", student);
System.out.println("新增學生成功");
} catch (SQLException e) {
e.printStackTrace();
}
新增學生成功:
四、使用 iBatis 實現刪除功能,即 delete 的功能
sqlmap-mapping-student.xml:
<update id="test_delete" parameterClass="com.test.bean.Student">
delete from t_stu where id=#id#
</update>
--java代碼以下
SqlMapClient sqlMapClient = BaseDAO.getInstance();
try {
Student student = new Student();
student.setId(10);
int k = sqlMapClient.delete("test_delete", student);
System.out.println("刪除學生記錄條數:"+k);
} catch (SQLException e) {
e.printStackTrace();
}
第10條記錄成功刪除。
--------------------------------------------------------------------------------
一、補充一個SQL配置文件中別名的使用方法
<!-- 給類定義別名,簡化代碼 -->
<typeAlias alias="student" type="com.test.bean.Student"></typeAlias>
<!-- 新增 -->
<update id="test_insert" parameterClass="student">
insert into t_stu(name,sex) values(#name#,#sex#)
</update>
咱們誰也不肯意在SQL配置文件中寫超長的全類路徑,因此能夠經過標籤<typeAlias> 定義一個別名,而後直接使用這個別名便可達到簡化的目的。
二、關於數據庫的事務講解:百度百科解釋以下:
數據庫事務
數據庫事務(Database Transaction) ,是指做爲單個邏輯工做單元執行的一系列操做,要麼徹底地執行,要麼徹底地不執行。 事務處理能夠確保除非事務性單元內的全部操做都成功完成,不然不會永久更新面向數據的資源。經過將一組相關操做組合爲一個要麼所有成功要麼所有失敗的單元,能夠簡化錯誤恢復並使應用程序更加可靠。一個邏輯工做單元要成爲事務,必須知足所謂的ACID(原子性、一致性、隔離性和持久性)屬性。事務是數據庫運行中的一個邏輯工做單位,由DBMS中的事務管理子系統負責事務的處理。
事務的4個特性【ACID】:
原子性
(Atomic)(Atomicity)
事務必須是原子工做單元;對於其數據修改,要麼全都執行,要麼全都不執行。一般,與某個事務關聯的操做具備共同的目標,而且是相互依賴的。若是系統只執行這些操做的一個子集,則可能會破壞事務的整體目標。原子性消除了系統處理操做子集的可能性。
一致性
(Consistent)(Consistency)
事務在完成時,必須使全部的數據都保持一致狀態。在相關數據庫中,全部規則都必須應用於事務的修改,以保持全部數據的完整性。事務結束時,全部的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。某些維護一致性的責任由應用程序開發人員承擔,他們必須確保應用程序已強制全部已知的完整性約束。例如,當開發用於轉賬的應用程序時,應避免在轉賬過程當中任意移動小數點。
隔離性
(Insulation)(Isolation)
由併發事務所做的修改必須與任何其它併發事務所做的修改隔離。事務查看數據時數據所處的狀態,要麼是另外一併發事務修改它以前的狀態,要麼是另外一事務修改它以後的狀態,事務不會查看中間狀態的數據。這稱爲隔離性,由於它可以從新裝載起始數據,而且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。當事務可序列化時將得到最高的隔離級別。在此級別上,從一組可並行執行的事務得到的結果與經過連續運行每一個事務所得到的結果相同。因爲高度隔離會限制可並行執行的事務數,因此一些應用程序下降隔離級別以換取更大的吞吐量。
持久性
(Duration)(Durability)
事務完成以後,它對於系統的影響是永久性的。該修改即便出現致命的系統故障也將一直保持。
另外,在事務處理中須要明白幾個概念,事務的提交和回滾,提交是指整個流程走完,正常的將整個動做提交,這時候全部的操做都將真正的生效。回滾是指因爲各類緣由,事務須要回退到某個操做前得狀態,對於回滾的這些操做,是不生效的。通常事務是自動提交的,咱們能夠根據須要,將事務設置成手動提交,而後在程序中一旦發生異常或者錯誤,就回滾事務,避免數據出現紊亂的狀況。
在第五章中咱們將詳細討論數據庫的事務問題。