国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Mybatis學(xué)習(xí)二之Mapper XML 文件

2019-11-08 02:13:29
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

SQL映射文件

SQL 映射文件有很少的幾個(gè)頂級(jí)元素(按照它們應(yīng)該被定義的順序):

cache – 給定命名空間的緩存配置。 cache-ref – 其他命名空間緩存配置的引用。 resultMap – 是最復(fù)雜也是最強(qiáng)大的元素,用來(lái)描述如何從數(shù)據(jù)庫(kù)結(jié)果集中來(lái)加載對(duì)象。 parameterMap – 已廢棄!老式風(fēng)格的參數(shù)映射。內(nèi)聯(lián)參數(shù)是首選,這個(gè)元素可能在將來(lái)被移除,這里不會(huì)記錄。 sql – 可被其他語(yǔ)句引用的可重用語(yǔ)句塊。 insert – 映射插入語(yǔ)句 update – 映射更新語(yǔ)句 delete – 映射刪除語(yǔ)句 select – 映射查詢語(yǔ)句

select元素

select可以有很多的屬性配置。 下面列舉一些不常用的單比較重要的屬性。

屬性 描述
flushCache 將其設(shè)置為 true,任何時(shí)候只要語(yǔ)句被調(diào)用,都會(huì)導(dǎo)致本地緩存和二級(jí)緩存都會(huì)被清空,默認(rèn)值:false。
useCache 將其設(shè)置為 true,將會(huì)導(dǎo)致本條語(yǔ)句的結(jié)果被二級(jí)緩存,默認(rèn)值:對(duì) select 元素為 true。
timeout 這個(gè)設(shè)置是在拋出異常之前,驅(qū)動(dòng)程序等待數(shù)據(jù)庫(kù)返回請(qǐng)求結(jié)果的秒數(shù)。默認(rèn)值為 unset(依賴驅(qū)動(dòng))
fetchSize 嘗試影響驅(qū)動(dòng)程序每次批量返回的結(jié)果行數(shù)和這個(gè)設(shè)置值相等。默認(rèn)值為 unset(依賴驅(qū)動(dòng))。
statementType STATEMENT,PREPARED 或 CALLABLE 的一個(gè)。這會(huì)讓 MyBatis 分別使用 Statement,PreparedStatement 或 CallableStatement,默認(rèn)值:PREPARED。
resultSetType FORWARD_ONLY,SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE 中的一個(gè),默認(rèn)值為 unset (依賴驅(qū)動(dòng))。

DML語(yǔ)句

<insert id="insertAuthor" parameterType="domain.blog.Author" flushCache="true" statementType="PREPARED" keyProperty="" keyColumn="" useGeneratedKeys="" timeout="20"><update id="updateAuthor" parameterType="domain.blog.Author" flushCache="true" statementType="PREPARED" timeout="20"><delete id="deleteAuthor" parameterType="domain.blog.Author" flushCache="true" statementType="PREPARED" timeout="20">

下面解釋下幾個(gè)屬性:

屬性 描述
useGeneratedKeys (僅對(duì) insert 和 update 有用)這會(huì)令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來(lái)取出由數(shù)據(jù)庫(kù)內(nèi)部生成的主鍵(比如:像 MySQL 和 SQL Server 這樣的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)的自動(dòng)遞增字段),默認(rèn)值:false。
keyProperty (僅對(duì) insert 和 update 有用)唯一標(biāo)記一個(gè)屬性,MyBatis 會(huì)通過(guò) getGeneratedKeys 的返回值或者通過(guò) insert 語(yǔ)句的 selectKey 子元素設(shè)置它的鍵值,默認(rèn):unset。如果希望得到多個(gè)生成的列,也可以是逗號(hào)分隔的屬性名稱列表。

插入語(yǔ)句詳細(xì)解釋: 1. 如果你的數(shù)據(jù)庫(kù)支持自動(dòng)生成主鍵的字段(比如 MySQL 和 SQL Server),那么你可以設(shè)置 useGeneratedKeys=”true”,然后再把 keyProperty 設(shè)置到目標(biāo)屬性上就OK了。

<insert id="insertAuthor" **useGeneratedKeys="true" keyProperty="id"**> insert into Author (username,passWord,email,bio) values (#{username},#{password},#{email},#{bio})</insert>

如果你的數(shù)據(jù)庫(kù)還支持多行插入, 你也可以傳入一個(gè)Authors數(shù)組或集合,并返回自動(dòng)生成的主鍵。 使用foreach循環(huán)進(jìn)行批量插入。

<insert id="insertAuthor" useGeneratedKeys="true" keyProperty="id"> insert into Author (username, password, email, bio) values <foreach item="item" collection="list" separator=","> (#{item.username}, #{item.password}, #{item.email}, #{item.bio}) </foreach></insert>

如果數(shù)據(jù)庫(kù)不支持自動(dòng)生成主鍵,該如何操作呢? 下面給出了一個(gè)例子(最好不要這么做):

<insert id="insertAuthor"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1 </selectKey> insert into Author (id, username, password, email,bio, favourite_section) values (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})</insert>

selectKey 元素描述如下:

<selectKey keyProperty="id" resultType="int" order="BEFORE" statementType="PREPARED">
屬性 描述
order 這可以被設(shè)置為 BEFORE 或 AFTER。如果設(shè)置為 BEFORE,那么它會(huì)首先選擇主鍵,設(shè)置 keyProperty 然后執(zhí)行插入語(yǔ)句。如果設(shè)置為 AFTER,那么先執(zhí)行插入語(yǔ)句,然后是 selectKey 元素 - 這和像 Oracle 的數(shù)據(jù)庫(kù)相似,在插入語(yǔ)句內(nèi)部可能有嵌入索引調(diào)用。

SQL

這個(gè)元素可以被用來(lái)定義可重用的 SQL 代碼段,可以包含在其他語(yǔ)句中。它可以被靜態(tài)地(在加載參數(shù)) 參數(shù)化. 不同的屬性值通過(guò)包含的實(shí)例變化

Result Maps

resultMap 元素是 MyBatis 中最重要最強(qiáng)大的元素。它就是讓你遠(yuǎn)離 90%的需要從結(jié)果 集中取出數(shù)據(jù)的 JDBC 代碼的那個(gè)東西, 而且在一些情形下允許你做一些 JDBC 不支持的事 情。 事實(shí)上, 編寫相似于對(duì)復(fù)雜語(yǔ)句聯(lián)合映射這些等同的代碼, 也許可以跨過(guò)上千行的代碼。 ResultMap 的設(shè)計(jì)就是簡(jiǎn)單語(yǔ)句不需要明確的結(jié)果映射,而很多復(fù)雜語(yǔ)句確實(shí)需要描述它們 的關(guān)系。

constructor - 類在實(shí)例化時(shí),用來(lái)注入結(jié)果到構(gòu)造方法中 idArg - ID 參數(shù);標(biāo)記結(jié)果作為 ID 可以幫助提高整體效能arg - 注入到構(gòu)造方法的一個(gè)普通結(jié)果id – 一個(gè) ID 結(jié)果;標(biāo)記結(jié)果作為 ID 可以幫助提高整體效能result – 注入到字段或 javaBean 屬性的普通結(jié)果association – 一個(gè)復(fù)雜的類型關(guān)聯(lián);許多結(jié)果將包成這種類型 嵌入結(jié)果映射 – 結(jié)果映射自身的關(guān)聯(lián),或者參考一個(gè)collection – 復(fù)雜類型的集 嵌入結(jié)果映射 – 結(jié)果映射自身的集,或者參考一個(gè)discriminator – 使用結(jié)果值來(lái)決定使用哪個(gè)結(jié)果映射 case – 基于某些值的結(jié)果映射嵌入結(jié)果映射 – 這種情形結(jié)果也映射它本身,因此可以包含很多相 同的元素,或者它可以參照一個(gè)外部的結(jié)果映射。

構(gòu)造方法

構(gòu)造方法注入允許你在初始化時(shí) 為類設(shè)置屬性的值,而不用暴露出公有方法。MyBatis 也支持私有屬性和私有 JavaBeans 屬 性來(lái)達(dá)到這個(gè)目的,但是一些人更青睞構(gòu)造方法注入。構(gòu)造方法元素支持這個(gè)。

public class User { //... public User(int id, String username) { //... }//...}

對(duì)應(yīng)的mapper:

<constructor> <idArg column="id" javaType="int"/> <arg column="username" javaType="String"/></constructor>

關(guān)聯(lián)

<association property="author" column="blog_author_id" javaType="Author"> <id property="id" column="author_id"/> <result property="username" column="author_username"/></association>

關(guān)聯(lián)元素處理“有一個(gè)”類型的關(guān)系。比如,在我們的示例中,一個(gè)博客有一個(gè)用戶。 關(guān)聯(lián)映射就工作于這種結(jié)果之上。你指定了目標(biāo)屬性,來(lái)獲取值的列,屬性的 java 類型(很 多情況下 MyBatis 可以自己算出來(lái)) ,如果需要的話還有 jdbc 類型,如果你想覆蓋或獲取的 結(jié)果值還需要類型控制器。

關(guān)聯(lián)中不同的是你需要告訴 MyBatis 如何加載關(guān)聯(lián)。MyBatis 在這方面會(huì)有兩種不同的 方式: 1. 嵌套查詢:通過(guò)執(zhí)行另外一個(gè) SQL 映射語(yǔ)句來(lái)返回預(yù)期的復(fù)雜類型。 2. 嵌套結(jié)果:使用嵌套結(jié)果映射來(lái)處理重復(fù)的聯(lián)合結(jié)果的子集。首先,然讓我們來(lái)查看這個(gè)元素的屬性。所有的你都會(huì)看到,它和普通的只由 select 和 resultMap 屬性的結(jié)果映射不同。

緩存

MyBatis 包含一個(gè)非常強(qiáng)大的查詢緩存特性,它可以非常方便地配置和定制。MyBatis 3 中的緩存實(shí)現(xiàn)的很多改進(jìn)都已經(jīng)實(shí)現(xiàn)了,使得它更加強(qiáng)大而且易于配置。

默認(rèn)情況下是沒(méi)有開啟緩存的,除了局部的 session 緩存,可以增強(qiáng)變現(xiàn)而且處理循環(huán) 依賴也是必須的。要開啟二級(jí)緩存,你需要在你的 SQL 映射文件中添加一行:<cache/> - 映射語(yǔ)句文件中的所有 select 語(yǔ)句將會(huì)被緩存。 - 映射語(yǔ)句文件中的所有 insert,update 和 delete 語(yǔ)句會(huì)刷新緩存。 - 緩存會(huì)使用 Least Recently Used(LRU,最近最少使用的)算法來(lái)收回。 - 根據(jù)時(shí)間表(比如 no Flush Interval,沒(méi)有刷新間隔), 緩存不會(huì)以任何時(shí)間順序 來(lái)刷新。 - 緩存會(huì)存儲(chǔ)列表集合或?qū)ο?無(wú)論查詢方法返回什么)的 1024 個(gè)引用。 - 緩存會(huì)被視為是 read/write(可讀/可寫)的緩存,意味著對(duì)象檢索不是共享的,而 且可以安全地被調(diào)用者修改,而不干擾其他調(diào)用者或線程所做的潛在修改。

<cache eviction="FIFO" flushInterval="60000" //默認(rèn)情況是不設(shè)置,也就是沒(méi)有刷新間隔,緩存僅僅調(diào)用語(yǔ)句時(shí)刷新。 size="512" //緩存的對(duì)象數(shù)目和你運(yùn)行環(huán)境的 可用內(nèi)存資源數(shù)目,默認(rèn)1024 readOnly="true"/>

可用的收回策略有:

LRU – 最近最少使用的:移除最長(zhǎng)時(shí)間不被使用的對(duì)象。默認(rèn)策略。 FIFO – 先進(jìn)先出:按對(duì)象進(jìn)入緩存的順序來(lái)移除它們。 SOFT – 軟引用:移除基于垃圾回收器狀態(tài)和軟引用規(guī)則的對(duì)象。 WEAK – 弱引用:更積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對(duì)象。

使用自定義緩存

除了這些自定義緩存的方式, 你也可以通過(guò)實(shí)現(xiàn)你自己的緩存或?yàn)槠渌谌骄彺娣桨?創(chuàng)建適配器來(lái)完全覆蓋緩存行為。

<cache type="com.domain.something.MyCustomCache"/>

配置:

<cache type="com.domain.something.MyCustomCache"> <property name="cacheFile" value="/tmp/my-custom-cache.tmp"/></cache>

記得緩存配置和緩存實(shí)例是綁定在 SQL 映射文件的命名空間是很重要的。因此,所有 在相同命名空間的語(yǔ)句正如綁定的緩存一樣。 語(yǔ)句可以修改和緩存交互的方式, 或在語(yǔ)句的 語(yǔ)句的基礎(chǔ)上使用兩種簡(jiǎn)單的屬性來(lái)完全排除它們。默認(rèn)情況下,語(yǔ)句可以這樣來(lái)配置:

<select ... flushCache="false" useCache="true"/><insert ... flushCache="true"/><update ... flushCache="true"/><delete ... flushCache="true"/>

參照緩存

也許將來(lái)的某個(gè)時(shí)候,你會(huì)想在命名空間中共享相同的緩存配置和實(shí)例。在這樣的 情況下你可以使用 cache-ref 元素來(lái)引用另外一個(gè)緩存。

<cache-ref namespace="com.someone.application.data.SomeMapper"/>

參考文獻(xiàn):

mybatis


上一篇:GDKOI 2016劃水記

下一篇:圖的存儲(chǔ)二

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 石屏县| 阳泉市| 凯里市| 江油市| 泾源县| 蒙阴县| 星座| 盐边县| 抚州市| 张掖市| 辽宁省| 文水县| 吐鲁番市| 南岸区| 甘肃省| 杭州市| 万源市| 通江县| 赫章县| 化隆| 夏河县| 巴林右旗| 峨眉山市| 织金县| 乐平市| 枞阳县| 溧阳市| 五台县| 丘北县| 额济纳旗| 沙河市| 桐梓县| 古交市| 白城市| 连平县| 时尚| 越西县| 临沭县| 伊金霍洛旗| 武鸣县| 宜丰县|