信控學院課件第7章映射器_第1頁
信控學院課件第7章映射器_第2頁
信控學院課件第7章映射器_第3頁
信控學院課件第7章映射器_第4頁
信控學院課件第7章映射器_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第7章映射器主要內(nèi)容

核心配置文件SQL映射文件

級聯(lián)查詢7.1MyBatis配置文件概述MyBatis的核心配置文件配置了很多影響MyBatis行為的信息,這些信息通常只會配置在一個文件中,并且不會輕易改動。另外,與Spring框架整合后,MyBatis的核心配置文件信息將配置到Spring的配置文件中。因此,在實際開發(fā)中需要編寫或修改MyBatis的核心配置文件的情況不多。7.2映射器概述元素名稱描

述備

注select查詢語句,最常用、最復雜的元素之一可以自定義參數(shù),返回結(jié)果集等insert插入語句執(zhí)行后返回一個整數(shù),代表插入的行數(shù)update更新語句執(zhí)行后返回一個整數(shù),代表更新的行數(shù)delete刪除語句執(zhí)行后返回一個整數(shù),代表刪除的行數(shù)sql定義一部分SQL,在多個位置被引用例如,一張表列名,一次定義,可以在多個SQL語句中使用resultMap用來描述從數(shù)據(jù)庫結(jié)果集中來加載對象,是最復雜、最強大的元素提供映射規(guī)則7.3<select>元素

在SQL映射文件中<select>元素用于映射SQL的select語句,其示例代碼如下: <!--根據(jù)uid查詢一個用戶信息-->

<selectid="selectUserById"parameterType="Integer" resultType="com.po.MyUser"> select*fromuserwhereuid=#{uid} </select>

上述示例代碼中,id的值是唯一標識符,它接收一個Integer類型的參數(shù),返回一個MyUser類型的對象,結(jié)果集自動映射到MyUser屬性。屬性名稱描

述id它和Mapper的命名空間組合起來使用,是唯一標識符,供MyBatis調(diào)用parameterType表示傳入SQL語句的參數(shù)類型的全限定名或別名。是個可選屬性,MyBatis能推斷出具體傳入語句的參數(shù)。resultTypeSQL語句執(zhí)行后返回的類型(全限定名或者別名)。如果是集合類型,返回的是集合元素的類型。返回時可以使用resultType或resultMap之一resultMap它是映射集的引用,與<resultMap>元素一起使用。返回時可以使用resultType或resultMap之一flushCache它的作用是在調(diào)用SQL語句后,是否要求MyBatis清空之前查詢本地緩存和二級緩存。默認值為false。如果設(shè)置為true,則任何時候只要SQL語句被調(diào)用,都將清空本地緩存和二級緩存useCache啟動二級緩存的開關(guān)。默認值為true,表示將查詢結(jié)果存入二級緩存中timeout用于設(shè)置超時參數(shù),單位是秒。超時將拋出異常。fetchSize獲取記錄的總條數(shù)設(shè)定statementType告訴MyBatis使用哪個JDBC的Statement工作,取值為STATEMENT(Statement)、PREPARED(PreparedStatement)、CALLABLE(CallableStatement)resultSetType這是針對JDBC的ResultSet接口而言,其值可設(shè)置為FORWARD_ONLY(只允許向前訪問)、SCROLL_SENSITIVE(雙向滾動,但不及時更新)、SCROLL_INSENSITIVE(雙向滾動,及時更新)7.3.1使用Map接口傳遞多個參數(shù)

在實際開發(fā)中,查詢SQL語句經(jīng)常需要多個參數(shù),比如多條件查詢。多個參數(shù)傳遞時,<select>元素的parameterType屬性值的類型是什么呢?在MyBatis中允許Map接口通過鍵值對傳遞多個參數(shù)。

假設(shè)數(shù)據(jù)操作接口中有個實現(xiàn)查詢陳姓男性用戶信息功能的方法:

publicList<MyUser>selectAllUser(Map<String,Object>param);

此時,傳遞給映射器的是一個Map對象,使用它在SQL中設(shè)置對應的參數(shù),對應SQL文件代碼如下:<!--查詢陳姓男性用戶信息-->

<selectid="selectAllUser"resultType="com.po.MyUser"parameterType="map"> select*fromuser whereunamelikeconcat('%',#{u_name},'%') andusex=#{u_sex} </select>

上述SQL文件中參數(shù)名u_name和u_sex是Map的key。7.3.2使用JavaBean傳遞多個參數(shù)

首先,在ch7應用的src目錄下,創(chuàng)建一個名為com.pojo的包,在包中創(chuàng)建一個POJO類SeletUserParam

其次,將Dao接口中的selectAllUser方法修改為:publicList<MyUser>selectAllUser(SeletUserParamparam);

再次,將com.mybatis包中的SQL映射文件UserMapper.xml中的“查詢陳姓男性用戶信息”代碼修改為:<selectid="selectAllUser"resultType="com.po.MyUser"parameterType="com.pojo.SeletUserParam"> select*fromuser whereunamelikeconcat('%',#{u_name},'%') andusex=#{u_sex}</select>

最后,將com.controller包中UserController的“查詢多個用戶”代碼片段修改。7.4<insert>元素<insert>元素用于映射插入語句,MyBatis執(zhí)行完一條插入語句后,將返回一個整數(shù)表示其影響的行數(shù)。它的屬性與<select>元素的屬性大部分相同,在本節(jié)講解它的幾個特有屬性。具體如下:

keyProperty:該屬性的作用是將插入或更新操作時的返回值賦值給PO類的某個屬性,通常會設(shè)置為主鍵對應的屬性。如果是聯(lián)合主鍵,可以在多個值之間用逗號隔開。

keyColumn:該屬性用于設(shè)置第幾列是主鍵,當主鍵列不是表中的第一列時需要設(shè)置。如果是聯(lián)合主鍵時,可以在多個值之間用逗號隔開。

useGeneratedKeys:該屬性將使MyBatis使用JDBC的getGeneratedKeys()方法獲取由數(shù)據(jù)庫內(nèi)部生產(chǎn)的主鍵,如MySQL、SQLServer等自動遞增的字段,其默認值為false。7.4.1主鍵(自動遞增)回填MySQL、SQLServer等數(shù)據(jù)庫的表格可以采用自動遞增的字段作為主鍵。有時可能需要使用這個剛剛產(chǎn)生的主鍵,用以關(guān)聯(lián)其他業(yè)務(wù)。<!--添加一個用戶,成功后將主鍵值回填給uid(po類的屬性)--> <insertid="addUser"parameterType="com.po.MyUser" keyProperty="uid"useGeneratedKeys="true"> insertintouser(uname,usex)values(#{uname},#{usex}) </insert>7.4.2自定義主鍵

如果實際工程中使用的數(shù)據(jù)庫不支持主鍵自動遞增(如Oracle),或者取消了主鍵自動遞增的規(guī)則時,可以使用MyBatis的<selectKey>元素來自定義生成主鍵。<insertid="insertUser"parameterType="com.po.MyUser"> <!--先使用selectKey元素定義主鍵,然后再定義SQL語句--> <selectKeykeyProperty="uid"resultType="Integer"order="BEFORE"> selectif(max(uid)isnull,1,max(uid)+1)asnewUidfromuser </selectKey> insertintouser(uid,uname,usex)values(#{uid},#{uname},#{usex})</insert>7.5<update>與<delete>元素<update>和<delete>元素比較簡單,它們的屬性和<insert>元素、<select>元素的屬性差不多,執(zhí)行后也返回一個整數(shù),表示影響了數(shù)據(jù)庫的記錄行數(shù)。

<!--修改一個用戶--><updateid="updateUser"parameterType="com.po.MyUser"> updateusersetuname=#{uname},usex=#{usex}whereuid=#{uid}</update>

<!--刪除一個用戶--><deleteid="deleteUser"parameterType="Integer"> deletefromuserwhereuid=#{uid}</delete>7.6<sql>元素<sql>元素的作用在于可以定義SQL語句的一部分(代碼片段),方便后面的SQL語句引用它,比如反復使用的列名。<sqlid="comColumns">uid,uname,usex</sql><selectid="selectUser"resultType="com.po.MyUser"> select<includerefid="comColumns"/>fromuser</select>7.7<resultMap>元素<resultMap>元素表示結(jié)果映射集,是MyBatis中最重要也是最強大的元素。主要用來定義映射規(guī)則、級聯(lián)的更新以及定義類型轉(zhuǎn)化器等。7.7.1<resultMap>元素結(jié)構(gòu)<resultMaptype=""id=""><constructor><!--類在實例化時,用來注入結(jié)果到構(gòu)造方法--> <idArg/><!--ID參數(shù),結(jié)果為ID--> <arg/><!--注入到構(gòu)造方法的一個普通結(jié)果--></constructor><id/><!--用于表示哪個列是主鍵--><result/><!--注入到字段或JavaBean屬性的普通結(jié)果--><associationproperty=""/><!--用于一對一關(guān)聯(lián)--><collectionproperty=""/><!--用于一對多、多對多關(guān)聯(lián)--><discriminatorjavaType=""><!--使用結(jié)果值來決定使用哪個結(jié)果映射--><casevalue=""/> <!--基于某些值的結(jié)果映射--></discriminator></resultMap><resultMap>元素的type屬性表示需要的POJO,id屬性是resultMap的唯一標識。子元素<constructor>用于配置構(gòu)造方法(當POJO未定義無參數(shù)的構(gòu)造方法時使用)。子元素<id>用于表示哪個列是主鍵。子元素<result>用于表示POJO和數(shù)據(jù)表普通列的映射關(guān)系。子元素<association>、<collection>和<discriminator>是用在級聯(lián)的情況下。關(guān)于級聯(lián)的問題比較復雜,將在7.8節(jié)級聯(lián)那里學習。7.7.2使用Map存儲結(jié)果集

任何select語句可以使用Map存儲結(jié)果,示例代碼如下: <!--查詢所有用戶信息存到Map中--> <selectid="selectAllUserMap"resultType="map"> select*fromuser </select>7.7.3使用POJO存儲結(jié)果集

<!--使用自定義結(jié)果集類型--> <resultMaptype="com.pojo.MapUser"id="myResult"> <!--property是com.pojo.MapUser類中的屬性--> <!--column是查詢結(jié)果的列名,可以來自不同的表--> <idproperty="m_uid"column="uid"/> <resultproperty="m_uname"column="uname"/> <resultproperty="m_usex"column="usex"/> </resultMap>

<!--使用自定義結(jié)果集類型查詢所有用戶--> <selectid="selectResultMap"resultMap="myResult"> select*fromuser </select>7.8級聯(lián)關(guān)系

如果表A中有一個外鍵引用了表B的主鍵,A表就是子表,B表就是父表。當查詢表A的數(shù)據(jù)時,通過表A的外鍵,也將表B的相關(guān)記錄返回,這就是級聯(lián)查詢。例如,查詢一個人的信息時,同時根據(jù)外鍵(身份證號)也將他的身份證信息返回。7.8.1一對一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論