iBatis對映檔案詳解(一)
以下是iBatis對映檔案的一個簡單例子:
<?xml version="1.0"encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap>
<cacheModelid=”productCache” type=”LRU”>
<flushInterval hours="24"/>
<flushOnExecute statement="insertStudent"/>
<flushOnExecute statement="deleteStudentById"/>
<flushOnExecute statement="updateStudentById"/>
<property name=”size” value=”1000” />
</cacheModel>
<typeAlias alias="Student" type="com.edifier.data.Student"/>
<resultMap id="StudentResult" class="Student">
<resultproperty="sid" column="sid"/>
<resultproperty="sname" column="sname"/>
<resultproperty="major" column="major"/>
<resultproperty="birth" column="birth"/>
<resultproperty="sroce" column="sroce"/>
</resultMap>
<parameterMap id="StudentParameter" class=""Student"">
<parameterproperty="sid" jdbcType="int" javaType="int"/>
<parameterproperty="sname" jdbcType="varchar"javaType="String"/>
</parameterMap>
<select id="selectAllStudents" resultClass="Student" cacheModel=”product-cache”>
select
sid,sname,major,birth,score
from
student;
</select>
<select id="selectStudentById" parameterClass="int"resultClass="Student">
select
sid,sname,major,birth,score
from
student
where
sid= #sid#;
</select>
<insert id="insertStudent" parameterClass="Student">
insert into
student(sid,sname,major,birth,score)
values(#sid#,#sname#,#major#,#birth#,#score#);
</insert>
<delete id="deleteStudentById" parameterClass="int">
delete from
student
where
sid= #sid#;
</delete>
<update id="updateStudentById" parameterClass="student">
update student set
sname= #sname#,
major= #major#,
birth= #birth#,
score= #score#
wheresid = #sid#;
</update>
<!-- 模糊查詢這裡有兩種方式,第一種在sql中這樣寫 sname like #sname#, 程式碼中這樣寫"%e%" 第二種是在sql中sname like '%$sname$%',程式碼中這樣寫"e".-->
<select id="selectStudentByName" parameterClass="String"resultClass="Student">
select
sid,sname,major,birth,score
from
student
where
snamelike '%$sname$%';
</select>
<insert id="insertStudentBySequence" parameterClass="Student">
insert into
student(sname,major,birth,score)
values(#sname#,#major#,#birth#,#score#);
<!—Mysql中用到的-->
<selectKey resultClass="int"keyProperty="sid" >
SELECT @@IDENTITY AS SID
</selectKey>
<!--以下在Oracle中用到
<selectKey resultClass="int" keyProperty="sid">
select studentPKSequence.nextVal as sid from dual;
</selectKey>
-->
</insert>
</sqlMap>
在這個例子中,xml的DTD和SqlMapConfig.xml配置檔案的不一樣要注意,不然會報錯。例子中包括了cacheModel、typeAlias、resultMap、parameterMap、以及增刪改,查詢全部、根據id查詢和模糊查詢。其中增刪改查都屬於statement元素,下表總結了statement 型別及其屬性:
Statement 型別 |
屬性 |
<statement> |
id parameterClass resultClass parameterMap resultMap cacheModel xmlResultName |
<insert> |
id parameterClass parameterMap |
<update> |
id parameterClass parameterMap |
<delete> |
id parameterClass parameterMap |
<select> |
id parameterClass resultClass parameterMap resultMap cacheModel |
<procedure> |
id parameterClass resultClass parameterMap resultMap xmlResultName |
SQL 語句
在statement元素中可以寫所有JDBC Driver所支援的sql語句。但是由於sql語句是鑲嵌在xml文件中,所以有些特殊符號不能直接使用,例如:<、>。iBatis這裡給出瞭解決辦法。
<![CDATA[
select * from student score >#score#
]]>
自動生成的主鍵
iBatis中唯一使用了自動生成主鍵的就是<insert>元素,使用子元素<selectKey>來支援自動生成的主鍵。它同時支援預生成(如Oracle)和後生成(MySQL)。下面是兩個例子:
<!—OracleSEQUENCE Example -->
<insertid="insertStudent-ORACLE" parameterClass="com.edifier.Student">
<selectKey resultClass="int"keyProperty="id" >
SELECT STOCKIDSEQUENCE.NEXTVAL ASID FROM DUAL
</selectKey>
insert into Student (SID,SName)
values (#id#,#name#)
</insert>
<!—Microsoft SQL Server IDENTITY Column Example -->
<insert id=" insertStudent-MS-SQL" parameterClass="com. edifier. Student">
insert into Student ( SName)
values (#name #)
<selectKey resultClass="int"keyProperty="id" >
SELECT @@IDENTITY AS ID
</selectKey>
</insert>
儲存過程
通過<procedure>元素支援儲存過程。下面的例子說明如何使用具有輸出引數的儲存過程。
<parameterMapid="swapParameters" class="map" >
<parameter property="email1"jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
<parameter property="email2"jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
</parameterMap>
<procedureid="swapEmailAddresses" parameterMap="swapParameters" >
{call swap_email_address (?, ?)}
</procedure>
呼叫上面的儲存過程將同時互換兩個欄位(資料庫表)和引數物件(Map)中的兩個 email地址。如果引數的 mode 屬性設為 INOUT 或 OUT,則引數物件的值被修改。否則保持不變。
parameterClass
parameterClass 屬性的值是 Java 類的全限定名(即包括類的包名)。parameterClass 屬性是可選的,但強烈建議使用。它的目的是限制輸入引數的型別為指定的 Java 類,並優化框架的效能。如果您使用 parameterMap,則沒有必要使用 parameterClass 屬性。例如,如果要只允許 Java 類“com. edifier.Student”作為輸入引數,可以這樣作:
<statementid=”statementName” parameterClass=” com. edifier.Student”>
insert into PRODUCT values (#id#, #name#, #score#)
</statement>
parameterMap
屬性 parameterMap 的值等於一個預先定義的<parameterMap>元素的名稱。parameterMap屬性很少使用,更多的是使用上面的 parameterClass 和 inline parameter(接下來會討論)。parameterMap 的基本思想是定義一系列有次序的引數系列,用於匹配 JDBC PreparedStatement的值符號。例如:
<parameterMapid=”insert-student -param” class=”com. edifier. Student”>
<parameter property=”id”/>
<parameter property=” name”/>
</parameterMap>
<statementid=”insertStudent” parameterMap=”insert- student -param”>
insert into Student (SID, SNAME) values(?,?);
</statement>
上面的例子中,parameter map 的兩個引數按次序匹配 SQL 語句中的值符號(?)。因此,第一個“?”號將被“id”屬性的值替換,而第二個“?”號將被“name”屬性的值替換。
Inline Parameter簡介
現在簡單介紹一下 inline parameter,詳細討論見後面章節。Inline parameter 可以嵌在
mappedstatement 內部使用。例如:
<statementid=”insertStudent” >
insert into Student(SID, SNAME)
values (#id#, #name#);
</statement>
以上例子中,內嵌的引數是#id#和#name#。每個引數代表一個 Java Bean 屬性,用於給 SQL 語句中相應的位置賦值。上面例子中,Student 物件的 id 和 description 屬性的值將會替換 SQL 語句中相應的符號。因此,對於 id=5,name=‘Steven’的Student 物件,SQL語句變為:
insert into Student (SID, SNAME) values (5, ‘Steven’);
resultClass
resultClass 屬性的值是 Java 類的全限定名(即包括類的包名)。resultClass 屬性可以讓您指定一個 Java 類,根據 ResultSetMetaData 將其自動對映到 JDBC 的 ResultSet。只要是 JavaBean 的屬性名稱和 ResultSet 的列名匹配,屬性自動賦值給列值。這使得查詢 mappedstatement變得很短。例如:
<statementid="getPerson" parameterClass=”int” resultClass="com.edifier.Person">
SELECT PER_ID as id,
PER_FIRST_NAME as firstName,
PER_LAST_NAME as lastName,
PER_BIRTH_DATE as birthDate,
PER_WEIGHT_KG as weightInKilograms,
PER_HEIGHT_M as heightInMeters
FROM PERSON
WHERE PER_ID = #value#
</statement>
在上面的例子中,Person 類擁有屬性包括 id,firstName,lastName,birthDate,weightInKilograms和 heightInMeters。每一個屬性對應 SQL 查詢語句一個列的別名(使用“as”關鍵字-標準的 SQL 語法)。一般情況下,列名和屬性名稱不匹配,就需要使用“as”關鍵字。當執行 mapped statement 時,Person 類將被初始化,從結果集中得到的列值將根據屬性名和列名對映成 Person 物件的屬性值。正如以前所說,使用 resultClass 的自動對映存在一些限制,無法指定輸出欄位的資料型別(如果需要的話),無法自動裝入相關的資料(複雜屬性),並且因為需要 ResultSetMetaData的資訊,會對效能有輕微的不利影響。但使用 resultMap,這些限制都可以很容易解決。
resultMap
resultMap 是最常用和最重要的屬性。ResultMap 屬性的值等於預先定義的 resultMap 元素的 name 屬性值(參照下面的例子)。使用 resultMap 可以控制資料如何從結果集中取出,以及哪一個屬性匹配哪一個欄位。不象使用 resultClass 的自動對映方法,resultMap 屬性可以允許指定欄位的資料型別,NULL 的替代值複雜型別對映(包括其他 Java Bean,集合型別和基本型別包裝類)。關於 resultMap 的詳細討論放在以後的章節,這裡只給出一個相關 statement 的 resultMap的例子。
<resultMapid=”get-student-result” class=”com.edifier.Student”>
<result property=”id” column=”SID”/>
<result property=”name” column=”SNAME”/>
</resultMap>
<statementid=”getStudent” resultMap=”get- student -result”>
select * from Student
</statement>
上面的例子中,通過 resultMap 的定義,查詢語句得到的 ResultSet 被對映成Student物件。resultMap 定義的“id”屬性值將賦予“SID”欄位值,而“name”屬性值將賦予“SNAME”欄位值。注意 resultMap 支援“select *”,並不要求定義 ResultSet所有返回欄位的對映。
cacheModel
cacheModel 的屬性值等於指定的 cacheModel 元素的 name 屬性值。屬性 cacheModel 定義查詢 mapped statement 的快取。每一個查詢 mapped statement 可以使用不同或相同的cacheModel。以下只給出個例子。
<cacheModelid="student-cache" imlementation="LRU">
<flushInterval hours="24"/>
<flushOnExecute statement="insertStudent"/>
<flushOnExecute statement="deleteStudentById"/>
<flushOnExecute statement="updateStudentById"/>
<property name=”size” value=”1000” />
</cacheModel>
<statementid=”selectAllStudent” parameterClass=”int” cacheModel=”product-cache”>
select sid,sname,major,birth,score from student;
</statement>
上面例子中,“selectAllStudent”的快取使用 WEAK 引用型別,每 24 小時重新整理一次,或當更新的操作發生時重新整理。
Cache的型別有以下幾種:
“MEMORY”(com.ibatis.db.sqlmap.cache.memory.MemoryCacheController)
“LRU”(com.ibatis.db.sqlmap.cache.lru.LruCacheController) --Least Recently Used
“FIFO”(com.ibatis.db.sqlmap.cache.fifo.FifoCacheController) --First In First Out
“OSCACHE”(com.ibatis.db.sqlmap.cache.oscache.OSCacheController)
1.MEMORY 編碼結構:
<cacheModel id="student-cache"type="MEMORY">
<flushInterval hours="24"/>
<flushOnExecute statement="insertStudent"/>
<flushOnExecute statement="deleteStudentById"/>
<flushOnExecute statement="updateStudentById"/>
<property name=”reference-type”value=”WEAK” />
</cacheModel>
取不到物件再利用的identifiable pattern或者應用程式的記憶體不足的時候選用。
reference-type的值可以是下面的3個:
WEAK (default) |
當別的物件要用記憶體的時候,可以毫無保留的釋放自己的記憶體。 |
SOFT |
當別的物件需要記憶體的時候,有可能不會釋放自己的記憶體。 |
STRONG |
cache時間到達以前,肯定不會釋放記憶體。小的靜態的經常被使用的區域可以使用這個選項。缺點是如果記憶體不足也不會釋放記憶體。 |
2.LRU 編碼結構:
<cacheModel id="student-cache"type="LRU">
<flushInterval hours="24"/>
<flushOnExecute statement="insertStudent"/>
<flushOnExecute statement="deleteStudentById"/>
<flushOnExecute statement="updateStudentById"/>
<property name=”size” value=”1000” />
</cacheModel>
應用程式的一部分內容經常被多人多次使用的時候選用。
3.FIFO 編碼結構:
<cacheModel id="student-cache"type="FIFO">
<flushInterval hours="24"/>
<flushOnExecute statement="insertStudent"/>
<flushOnExecute statement="deleteStudentById"/>
<flushOnExecute statement="updateStudentById"/>
<property name=”size” value=”1000” />
</cacheModel>
連續的短時間的參照,以後就再不參照的時候選用。
4.OSCACHE 編碼結構:
<cacheModel id="student-cache"type="OSCACHE">
<flushInterval hours="24"/>
<flushOnExecute statement="insertStudent"/>
<flushOnExecute statement="deleteStudentById"/>
<flushOnExecute statement="updateStudentById"/>
</cacheModel>
屬性名 |
說明 |
cache.memory |
cache放在記憶體中,false的話放在硬盤裡 |
cache.key |
ServletContext中存放cache的key名 |
cache.capacity |
存放的大小(這個一直不知道單位是什麼,配置檔案裡寫的是條數,我怎麼感覺設成50都能顯示1000個) |
cache.path |
cache儲存的路徑 |
cache.unlimited.disk |
無限cache,預設是false,這時候就會有限制,參照cache.capacity來分配硬碟空間 |
相關推薦
iBatis對映檔案詳解(一)
以下是iBatis對映檔案的一個簡單例子: <?xml version="1.0"encoding="UTF-8" ?> <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map
Hibernate 初相識(一)Hibernate API 詳解,配置檔案,對映檔案詳解。
導航{ } Hibernate 在三層框架中的位置。 一,第一個Hibernate 專案。 地址:https://github.com/gengzi/Hibernate 【1】匯入jar包 解
Mybatis學習(三)————— 對映檔案詳解
前面說了全域性配置檔案中內容的詳解,大家應該清楚了,現在來說說這對映檔案,這章就對輸入對映、輸出對映、動態sql這幾個知識點進行說明,其中高階對映(一對一,一對多,多對多對映)在下一章進行說明。 一、輸入對映 輸入對映:配置statement中輸入引數的型別。有四種
jni.h標頭檔案詳解(一)
1.jni.h標頭檔案路徑: /usr/lib/jvm/jdk_1.6.0_43/include/jni.h 2.jni.h標頭檔案組成分析圖: 3.下面通過上圖進行分析講解jni.h標頭檔案. 一. jni規範中定義的基本資料型別. #define JNI
mybatis全域性配置檔案與對映檔案詳解
一、全域性配置檔案 1、概述 (1)SqlMapConfig.xml的配置內容和順序如下(順序不能亂): Properties(屬性) Settings(全域性引數設定) typeAliases(類型別名) typeHandlers(型別處理器)
Mybatis學習筆記(二)-Mybatis配置檔案與對映檔案詳解
一、Mybatis配置檔案詳解 以下是mybatis.xml檔案,提倡放在src目錄下,檔名任意 <?xml version="1.0" encoding="UTF-8"?> <
hibernate與資料庫表的對映檔案詳解(Customer.hbm.xml)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" &nb
4.mapper.xml對映檔案詳解
1.parameterType(輸入型別) parameterMap已經被廢棄,這裡不做討論. 先了解:#{}與${}的使用 #{}實現的是向prepareStatement中的預處理語句中設定引數值,sql語句中#{}表示一個佔位符即?。 使用佔位符#
MyBatis XML對映檔案詳解
一 MyBatis XML配置 MyBatis真正的強大,在於其對映語句的魔力。 SQL 對映檔案有很少的幾個頂級元素(按照它們應該被定義的順序): 1)cache 給定名稱空間的配置快取。 2)cache-ref 其他名稱空間快取配置的引用。 3)result
SpringBoot第二篇:配置檔案詳解一
前言 SpringBoot 完全摒棄了xml配置的模式,幾乎做到了“零配置”。說是“幾乎”,是因為一般情況下預設的配置足夠滿足日常開發所需,但是在特殊的情況下,我們往往需要用到自定義屬性配置、自定義檔案配置、多環境配置、外部命令引導等一系列功能。 SpringBoot 使用的全域性配置檔案 appli
【Ibatis】(一)、sqlMapConfig.xml配置檔案詳解
1.sqlMapConfig.xml配置檔案詳解: Xml程式碼 <? xml version="1.0" encoding="UTF-8" ?> <! DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Co
三大框架(ssh)學習——配置檔案詳解(一)
配置檔案詳解 指定web應用預設字符集 <constant name="struts.i18n.encoding" value="gbk" /> 此配置相當於: request.setCharacterEncoding(“gbk”); r
Hibernate---實體配置(對映)檔案詳解 例如:User.hbm.xml檔案
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" &n
華為PAT埠地址對映配置詳解(一)
眾所周知,PAT,,Port Address Translation,即網路地址轉換。 PAT有以下作用:1.改變資料包的ip地址和埠號;2.能夠大量節約公網IP地址。PAT的型別有以下:1.動態PAT,包括NAPT和Easy IP;2.靜態PAT,包括NAT Server。 本文為大家介紹華為路由器
【SpringBoot學習之路】05.Springboot配置檔案詳解(一)
轉載宣告:商業轉載請聯絡作者獲得授權,非商業轉載請註明出處.原文來自 © 呆萌鍾【SpringBoot學習之路】05.Springboot配置檔案詳解(一) 配置檔案 Spring Boot使用一個全域性的配置檔案 applic
Hibernate---實體配置(對映)檔案詳解 例如:User.hbm.xml檔案
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "
AccessibilityService 服務配置檔案的內容詳解(一)
AccessibilityService_canRequestEnhancedWebAccessibility int AccessibilityService_canRequestEnhancedWebAccessibility Attribute whether the accessibility
NTFS檔案系統詳解(一)之硬碟基本資訊
本文參考自部落格 一般硬碟正面貼有產品標籤,主要包括廠家資訊和產品資訊,如商標、型號、序列號、生產日期、容量、引數和主從設定方法等。這些資訊是正確使用硬碟的基本依據,下面將逐步介紹它們的含義。 硬碟主要由盤體、控制電路板和介面部件等組成,如圖1-1所示。
Hibernate之對映檔案和主配置檔案詳解
一、對映配置檔案(xxx.hbm.xml) <hibernate-mapping> <!-- 配置表與實體對映關係 --> <class name="com.mark.domain.Customer" table="cst_customer"&
表空間資料檔案詳解(一)
一.表空間的建立 建立表空間: Create tablespace felix Datafile'/u01/app/oracle/oradata/felix/felixtbs.dbf' Size100m autoextendonnext10m maxsize10