1. 程式人生 > >iBatis對映檔案詳解(一)

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