版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
11.1SqlMapConfig.xml配置文件11.2Mapper.xml映射文件11.1SqlMapConfig.xml配置文件MyBatis的全局配置文件SqlMapConfig.xml。SqlMapConfig.xml中配置的內(nèi)容和順序如下:properties(屬性)settings(全局配置參數(shù))typeAliases(類型別名)typeHandlers(類型處理器)objectFactory(對(duì)象工廠)plugins(插件)environments(環(huán)境集合屬性對(duì)象)environment(環(huán)境子屬性對(duì)象)transactionManager(事務(wù)管理)dataSource(數(shù)據(jù)源)mappers(映射器)1.properties(屬性)SqlMapConfig.xml可以引用Java屬性文件中的配置信息。在classpath下定義perties文件:jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatisjdbc.username=rootjdbc.password=mysqlSqlMapConfig.xml引用如下:<propertiesresource="perties"/><environmentsdefault="development"><environmentid="development"><transactionManagertype="JDBC"/><dataSourcetype="POOLED">
<propertyname="driver"value="${jdbc.driver}"/><propertyname="url"value="${jdbc.url}"/><propertyname="username"value="${jdbc.username}"/><propertyname="password"value="${jdbc.password}"/></dataSource></environment></environments>MyBatis將按照以下順序來加載屬性:首先在properties元素體內(nèi)定義的屬性被讀取。然后讀取properties元素中resource或URL加載的屬性,它會(huì)覆蓋已讀取的同名屬性。最后讀取parameterType傳遞的屬性,它會(huì)覆蓋已讀取的同名屬性。因此,通過parameterType傳遞的屬性具有最高優(yōu)先級(jí),resource或URL加載的屬性次之,最低優(yōu)先級(jí)的是properties元素體內(nèi)定義的屬性。2.settings(配置)MyBatis全局配置參數(shù),全局參數(shù)將會(huì)影響MyBatis的運(yùn)行行為。詳細(xì)內(nèi)容見“學(xué)習(xí)資料/mybatis-settings.xlsx”文件。3.typeAliases(類型別名)MyBatis支持別名如表11-1所示。MyBatis自定義別名:在SqlMapConfig.xml中配置:<typeAliases><!--單個(gè)別名定義--><typeAliasalias="user"type="cn.itcast.mybatis.po.User"/><!--批量別名定義,掃描整個(gè)包下的類,別名為類名(首字母大寫或小寫都可以)--><packagename="cn.itcast.mybatis.po"/><packagename="其他包"/></typeAliases>4.typeHandlers(類型處理器)類型處理器用于Java類型和jdbc類型映射,代碼如下:<selectid="findUserById"parameterType="int"resultType="user"> select*fromuserwhereid=#{id}</select>MyBatis自帶的類型處理器基本上滿足日常需求,不需要單獨(dú)定義。MyBatis支持類型處理器如表11-2所示。5.Mappers(映射器)Mapper配置的幾種方法:①<mapperresource=""/>。使用相對(duì)于類路徑的資源。②<mapperurl=""/>。使用完全限定路徑。③<mapperclass=""/>。使用Mapper接口類路徑。④<packagename=""/>。注冊(cè)指定包下的所有Mapper接口。11.2Mapper.xml映射文件11.2.1parameterType(輸入類型)1.#{}與${}#{}實(shí)現(xiàn)的是向prepareStatement中的預(yù)處理語句中設(shè)置參數(shù)值,sql語句中#{}表示一個(gè)占位符即?。<!--根據(jù)id查詢用戶信息--><selectid="findUserById"parameterType="int"resultType="user">select*fromuserwhereid=#{id}</select>使用占位符#{}可以有效防止sql注入,在使用時(shí)不需要關(guān)心參數(shù)值的類型,mybatis會(huì)自動(dòng)進(jìn)行java類型和jdbc類型的轉(zhuǎn)換。#{}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個(gè)簡單類型值,#{}括號(hào)中可以是value或其他名稱。${}和#{}不同,通過${}可以將parameterType傳入的內(nèi)容拼接在sql中,且不進(jìn)行jdbc類型轉(zhuǎn)換,${}可以接收簡單類型值或pojo屬性值,如果parameterType傳輸單個(gè)簡單類型值,${}括號(hào)中只能是value。使用${}不能防止sql注入,但是有時(shí)用${}會(huì)非常方便,如下的例子:<!--根據(jù)名稱模糊查詢用戶信息--><selectid="selectUserByName"parameterType="string"resultType="user">select*fromuserwhereusernamelike'%${value}%'</select>如果本例子使用#{},則傳入的字符串中必須有%號(hào),而%是人為拼接在參數(shù)中,顯然有點(diǎn)麻煩,如果采用${}在sql中拼接為%的方式則在調(diào)用mapper接口傳遞參數(shù)就方便很多。//如果使用占位符號(hào)則必須人為在傳參數(shù)中加%List<User>list=userMapper.selectUserByName("%管理員%");//如果使用${}原始符號(hào)則不用人為在參數(shù)中加%List<User>list=userMapper.selectUserByName("管理員");再比如orderby排序,如果將列名通過參數(shù)傳入sql,根據(jù)傳的列名進(jìn)行排序,應(yīng)寫為:ORDERBY${columnName}如果使用#{}將無法實(shí)現(xiàn)此功能。2.傳遞簡單類型參考上例。3.傳遞POJO對(duì)象MyBatis使用ognl表達(dá)式解析對(duì)象字段的值,例如:<!--傳遞POJO對(duì)象綜合查詢用戶信息--><selectid="findUserByUser"parameterType="user"resultType="user">select*fromuserwhereid=#{id}andusernamelike'%${username}%'</select>測試:PublicvoidtestFindUserByUser()throwsException{//獲取sessionSqlSessionsession=sqlSessionFactory.openSession();//獲取Mapper接口實(shí)例UserMapperuserMapper=session.getMapper(UserMapper.class);//構(gòu)造查詢條件user對(duì)象Useruser=newUser();user.setId(1);user.setUsername("管理員");//傳遞user對(duì)象查詢用戶列表List<User>list=userMapper.findUserByUser(user);//關(guān)閉sessionsession.close();}4.傳遞POJO包裝對(duì)象開發(fā)中通過POJO傳遞查詢條件,查詢條件是綜合的查詢條件,不僅包括用戶查詢條件,還包括其他的查詢條件(比如將用戶購買商品信息也作為查詢條件),這時(shí)可以使用包裝對(duì)象傳遞輸入?yún)?shù)。①定義包裝對(duì)象。定義包裝對(duì)象將查詢條件(POJO)以類組合的方式包裝起來。publicclassQueryVo{privateUseruser;//自定義用戶擴(kuò)展類privateUserCustomuserCustom;②Mapper.xml映射文件。<!--查詢用戶列表,根據(jù)用戶名稱和用戶性別查詢用戶列表--><selectid="findUserList"parameterType="queryVo"resultType="user">select*fromuserwhereusername=#{user.username}andsex=#{user.sex}</select>apper5.傳遞hashmapsql映射文件定義如下:<!--傳遞hashmap綜合查詢用戶信息--><selectid="findUserByHashmap"parameterType="hashmap"resultType="user">select*fromuserwhereid=#{id}andusernamelike'%${username}%'</select>測試:PublicvoidtestFindUserByHashmap()throwsException{//獲取sessionSqlSessionsession=sqlSessionFactory.openSession();//獲取Mapper接口實(shí)例UserMapperuserMapper=session.getMapper(UserMapper.class);//構(gòu)造查詢條件Hashmap對(duì)象HashMap<String,Object>map=newHashMap<String,Object>();map.put("id",1);map.put("username","管理員");
//傳遞hashmap對(duì)象查詢用戶列表List<User>list=userMapper.findUserByHashmap(map);//關(guān)閉sessionsession.close();}11.2.2resultType(輸出類型)1.輸出簡單類型參考getnow輸出日期類型,看下邊的例子輸出整型:Mapper.xml文件:<!--獲取用戶列表總數(shù)--><selectid="findUserCount"parameterType="user"resultType="int">selectcount(1)fromuser</select>Mapper接口:publicintfindUserCount(Useruser)throwsException;調(diào)用:PublicvoidtestFindUserCount()throwsException{//獲取sessionSqlSessionsession=sqlSessionFactory.openSession();//獲取Mapper接口實(shí)例UserMapperuserMapper=session.getMapper(UserMapper.class);
Useruser=newUser();user.setUsername("管理員");//傳遞hashmap對(duì)象查詢用戶列表intcount=userMapper.findUserCount(user);
//關(guān)閉sessionsession.close();}總結(jié):輸出簡單類型必須查詢出來的結(jié)果集有一條記錄,最終將第一個(gè)字段的值轉(zhuǎn)換為輸出類型。使用session的selectOne可查詢單條記錄。2.輸出POJO對(duì)象參考findUserById的定義:Mapper.xml:<!--根據(jù)id查詢用戶信息--><selectid="findUserById"parameterType="int"resultType="user"> select*fromuserwhereid=#{id}</select>Mapper接口:publicUserfindUserById(intid)throwsException;測試:PublicvoidtestFindUserById()throwsException{//獲取sessionSqlSessionsession=sqlSessionFactory.openSession();//獲取Mapper接口實(shí)例UserMapperuserMapper=session.getMapper(UserMapper.class);//通過Mapper接口調(diào)用statementUseruser=userMapper.findUserById(1);System.out.println(user);//關(guān)閉sessionsession.close();}使用session調(diào)用selectOne查詢單條記錄。3.輸出POJO列表參考selectUserByName的定義:Mapper.xml:<!--根據(jù)名稱模糊查詢用戶信息--><selectid="findUserByUsername"parameterType="string"resultType="user">select*fromuserwhereusernamelike'%${value}%'</select>Mapper接口:publicList<User>findUserByUsername(Stringusername)throwsException;測試:PublicvoidtestFindUserByUsername()throwsException{//獲取sessionSqlSessionsession=sqlSessionFactory.openSession();//獲取Mapper接口實(shí)例UserMapperuserMapper=session.getMapper(UserMapper.class);//如果使用占位符號(hào)則必須人為在參數(shù)中加%//List<User>list=userMapper.selectUserByName("%管理員%");//如果使用${}原始符號(hào)則不用人為在參數(shù)中加%List<User>list=userMapper.findUserByUsername("管理員");//關(guān)閉sessionsession.close();}使用session的selectList方法獲取POJO列表。4.resultType總結(jié)輸出POJO對(duì)象和輸出POJO列表在sql中定義的resultType是一樣的。返回單個(gè)POJO對(duì)象要保證sql查詢出來的結(jié)果集為單條,內(nèi)部使用session.selectOne方法調(diào)用,Mapper接口使用POJO對(duì)象作為方法返回值。返回POJO列表表示查詢出來的結(jié)果集可能為多條,內(nèi)部使用session.selectList方法,Mapper接口使用List<pojo>對(duì)象作為方法返回值。5.輸出hashmap輸出POJO對(duì)象可以改用hashmap輸出類型,將輸出的字段名稱作為map的key,value為字段值。11.2.3resultMapresultType可以指定POJO將查詢結(jié)果映射為POJO,但需要POJO的屬性名和sql查詢的列名一致方可映射成功。如果sql查詢字段名和POJO的屬性名不一致,可以通過resultMap將字段名和屬性名作一個(gè)對(duì)應(yīng)關(guān)系,resultMap實(shí)質(zhì)上還需要將查詢結(jié)果映射到POJO對(duì)象中。resultMap可以實(shí)現(xiàn)將查詢結(jié)果映射為復(fù)雜類型的POJO,比如在查詢結(jié)果映射對(duì)象中包括POJO和list實(shí)現(xiàn)一對(duì)一查詢和一對(duì)多查詢。1.Mapper.xml定義配置resultMap標(biāo)簽,映射不同的字段和屬性名。<selectid="findUserListResultMap"parameterType="queryVo"resultMap="userListResultMap">selectidid_,usernameusername_,birthdaybirthday_fromuser<where><includerefid="query_user_where"></include></where></select>2.定義resultMap由于Mapper.xml中sql查詢列和Users.java類屬性不一致,需要定義resultMap:userListResultMap,將sql查詢列和Users.java類屬性對(duì)應(yīng)起來。定義的resultMap標(biāo)簽userListResultMap如下:<resultMaptype="user"id="userListResultMap"><idcolumn="id_"property="id"/><resultcolumn="username_"property="username"/><resultcolumn="birthday_"property="birthday"/></resultMap>其中,<id/>:此屬性表示查詢結(jié)果集的唯一標(biāo)識(shí),非常重要。如果是多個(gè)字段為復(fù)合唯一約束則定義多個(gè)<id/>。Property:表示person類的屬性。Column:表示sql查詢出來的字段名。Column和property放在一塊兒表示將sql查詢出來的字段映射到指定的POJO類屬性上。<result/>:普通結(jié)果,即POJO的屬性。3.Mapper接口定義publicList<User>findUserListResultMap()throwsException; 11.2.4動(dòng)態(tài)sql通過MyBatis提供的各種標(biāo)簽方法實(shí)現(xiàn)動(dòng)態(tài)拼接sql,具體方式如下:1.If<!--傳遞POJO綜合查詢用戶信息--><selectid="findUserList"parameterType="user"resultType="user"> select*fromuser where1=1 <iftest="id!=nullandid!=''"> andid=#{id} </if> <iftest="username!=nullandusername!=''"> andusernamelike'%${username}%' </if></select>注意要做不等于空字符串校驗(yàn)。2.Where上邊的sql也可以改為:<selectid="findUserList"parameterType="user"resultType="user"> select*fromuser <where> <iftest="id!=nullandid!=''"> andid=#{id} </if> <iftest="username!=nullandusername!=''"> andusernamelike'%${username}%' </if> </where></select><where/>可以自動(dòng)處理第一個(gè)and。3.foreach向sql傳遞數(shù)組或list,MyBatis使用foreach解析,方法如下:①通過POJO傳遞list。傳入多個(gè)id查詢用戶信息,用下邊兩個(gè)sql實(shí)現(xiàn):SELECT*FROMUSERSWHEREusernameLIKE'%張%'AND(id=10ORid=89ORid=16)SELECT*FROMUSERSWHEREusernameLIKE'%張%'idIN(10,89,16)在POJO中定義list屬性ids存儲(chǔ)多個(gè)用戶id,并添加getter/setter方法。publicclassQueryVo{privateUseruser;privateUserCustomuserCustom;//傳遞多個(gè)用戶idprivateList<Integer>ids;}mapper.xml<iftest="ids!=nullandids.size>0"><foreachcollection="ids"open="andidin("close=")"item="id"separator=","> #{id}</foreach></if>測試代碼:List<Integer>ids=newArrayList<Integer>(); ids.add(1);//查詢id為1的用戶 ids.add(10);//查詢id為10的用戶 queryVo.setIds(ids); List<User>list=userMapper.findUserList(queryVo);②傳遞單個(gè)list。傳遞list類型在編寫Mapper.xml時(shí)沒有區(qū)別,唯一不同的是只有一個(gè)list參數(shù)時(shí)它的參數(shù)名為list。代碼如下:Mapper.xml:<selectid="selectUserByList"parameterType="java.util.List"resultType="user">select*fromuser<where><!--傳遞list,list中是POJO--><iftest="list!=null"><foreachcollection="list"item="item"open="andidin("separator=","close=")">#{item.id}</foreach></if></where></select>Mapper接口:publicList<User>selectUserByList(Listuserlist)throwsException;測試:PublicvoidtestselectUserByList()throwsException{//獲取sessionSqlSessionsession=sqlSessionFactory.openSession();//獲取Mapper接口實(shí)例UserMapperuserMapper=session.getMapper(UserMapper.class);//構(gòu)造查詢條件listList<User>userlist=newArrayList<User>();Useruser=newUser();user.setId(1);userlist.add(user);user=newUser();user.setId(2);userlist.add(user);//傳遞userlist列表查詢用戶列表List<User>list=userMapper.selectUserByList(userlist);//關(guān)閉sessionsession.close();}③傳遞單個(gè)數(shù)組(數(shù)組中是POJO):Mapper.xml:<!--傳遞數(shù)組綜合查詢用戶信息--><selectid="selectUserByArray"parameterType="Object[]"resultType="user">select*fromuser<where><!--傳遞數(shù)組--><iftest="array!=null"><foreachcollection="array"index="index"item="item"open="andidin("separator=","close=")">#{item.id}</foreach>
</if></where></select>sql只接收一個(gè)數(shù)組參數(shù),這時(shí)sql解析參數(shù)的名稱MyBatis固定為array,如果數(shù)組是通過一個(gè)POJO傳遞到sql,則參數(shù)的名稱為POJO中的屬性名。index:數(shù)組的下標(biāo)。item:數(shù)組每個(gè)元素的名稱,名稱隨意定義。open:循環(huán)開始。close:循環(huán)結(jié)束。separator:中間分隔輸出。Mapper接口:publicList<User>selectUserByArray(Object[]userlist)throwsException;測試:PublicvoidtestselectUserByArray()throwsException{//獲取sessionSqlSessionsession=sqlSessionFactory.openSession();//獲取Mapper接口實(shí)例UserMapperuserMapper=session.getMapper(UserMapper.class);//構(gòu)造查詢條件listObject[]userlist=newObject[2];Useruser=newUser();user.setId(1);userlist[0]=user;user=newUser();user.setId(2);userlist[1]=user;
//傳遞user對(duì)象查詢用戶列表List<User>list=userMapper.selectUserByArray(userlist);//關(guān)閉sessionsession.close();}④傳遞單個(gè)數(shù)組(數(shù)組中是字符串類型):Mapper.xml:<!--傳遞數(shù)組綜合查詢用戶信息--><selectid="selectUserByArray"parameterType="Object[]"resultType="user">select*fromuser<where><!--傳遞數(shù)組--><iftest="array!=null">
<foreachcollection="array"index="index"item="item"open="andidin("separator=","close=")">#{item}</foreach></if></where></select>如果數(shù)組中是簡單
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中秋節(jié)給員工慰問信(14篇)
- 學(xué)校食堂臨時(shí)用工協(xié)議書美篇
- 交通安全承諾書模板錦集七篇
- 中秋晚會(huì)主持詞范文(6篇)
- 學(xué)生做飯課件教學(xué)課件
- 中班熊貓課件教學(xué)課件
- 影響企業(yè)軟實(shí)力形成的因素分析
- 日期和時(shí)間 詞匯 編制說明
- 八年級(jí)上學(xué)期語文第一次月考試卷-2
- 四年級(jí)數(shù)學(xué)(上)計(jì)算題專項(xiàng)練習(xí)及答案匯編
- 中醫(yī)養(yǎng)生講座中醫(yī)體質(zhì)辨識(shí)
- 重慶英文介紹課件
- 《我和伙伴共成長》-完整版PPT
- 平凡鑄就偉大 英雄來自人民 課件-高中愛國主題教育班會(huì)
- 中國教師培訓(xùn)白皮書
- 四年級(jí)上冊(cè)數(shù)學(xué)課件 平行與垂直 人教版 16張
- GB∕T 25341.1-2019 鐵路旅客運(yùn)輸服務(wù)質(zhì)量 第1部分:總則
- 畢業(yè)設(shè)計(jì)(論文)-人形機(jī)器人設(shè)計(jì)
- 八年級(jí)語文 課外現(xiàn)代文閱讀專項(xiàng)訓(xùn)練(50篇含答案)
- 不同種類氨基酸和糖的美拉德反應(yīng)
- 《動(dòng)物疾病防治》課程整體教學(xué)設(shè)計(jì)方案-禽病防治
評(píng)論
0/150
提交評(píng)論