mybatis中映射文件(mapper)中的使用規(guī)則
一、增刪改
1、增加
<!-- 添加用戶(hù)-->
<insert id="saveUser" parameterType="com.tfjybj.domain.User">
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
</insert>
說(shuō)明:
- id屬性:
映射文件中方法的唯一標(biāo)識(shí),與對(duì)應(yīng)dao層中執(zhí)行此功能的方法名相同。
- parameterType 屬性:
代表參數(shù)的類(lèi)型,因?yàn)槲覀円獋魅氲氖且粋€(gè)類(lèi)的對(duì)象,所以類(lèi)型就寫(xiě)類(lèi)的全名稱(chēng)。
- sql 語(yǔ)句中使用#{}字符:
它代表占位符,相當(dāng)于原來(lái) jdbc 部分所學(xué)的?,都是用于執(zhí)行語(yǔ)句時(shí)替換實(shí)際的數(shù)據(jù)。具體的數(shù)據(jù)是由#{}里面的內(nèi)容決定的。
- #{}中內(nèi)容的寫(xiě)法:
由于參數(shù)是 一個(gè) User 對(duì)象,此處要寫(xiě) User 對(duì)象中的屬性名稱(chēng)。這里應(yīng)用了 ognl 表達(dá)式。
- ognl 表達(dá)式:
它是 apache 提供的一種表達(dá)式語(yǔ)言,全稱(chēng)是:Object Graphic Navigation Language 對(duì)象圖導(dǎo)航語(yǔ)言。它是按照 #{對(duì)象.對(duì)象}的語(yǔ)法格式來(lái)獲取數(shù)據(jù)的,#{user.username}它會(huì)先去找 user 對(duì)象,然后在 user 對(duì)象中找到 username 屬性,并調(diào)用getUsername()方法把值取出來(lái)。但是我們?cè)?parameterType 屬性上指定了實(shí)體類(lèi)名稱(chēng),所以可以省略 user,而直接寫(xiě) username。
如何獲得新增數(shù)據(jù)id的返回值
方式一:
mysql支持自增主鍵,自增主鍵的獲取,mybatis利用了statement.getGenreatedKeys();
在< insert> 標(biāo)簽中添加
userGeneratedKeys=“true” :標(biāo)明使用自增主鍵獲取主鍵值策略。
keyProperty:指定對(duì)應(yīng)的主鍵屬性,也就是mybatis獲取到主鍵值之后,將這個(gè)值封裝給JavaScriptBean的哪個(gè)屬性。
<insert id="saveUser" parameterType="com.tfjybj.domain.User"
useGeneratedKeys="true" keyProperty="id">
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
</insert>
方式二:
新增用戶(hù)后,要求在新增數(shù)據(jù)后,將自動(dòng)增長(zhǎng)的auto_increment的值返回,mysql主鍵自增的返回,配置如下:
<insert id="saveUser" parameterType="com.tfjybj.domain.User">
<!-- keyColumn:要獲得哪個(gè)列的值
keyProperty:查詢(xún)出來(lái)的主鍵值封裝給就AV額Bean的哪個(gè)屬性
order:取值為before,當(dāng)前SQL在插入SQL之前運(yùn)行。取值為fater,當(dāng)前SQL在插入SQL之后運(yùn)行
resultType:查出的數(shù)據(jù)的返回值類(lèi)型 -->
<selectKey keyColumn="id" keyProperty="id" resultType="int" order="after">
select last_insert_id();
</selectKey>
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
</insert>
2、刪除
<!-- 刪除用戶(hù) -->
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id = #{uid}
</delete>
3、更新
<!-- 更新用戶(hù) -->
<update id="updateUser" parameterType="com.tfjybj.domain.User">
update user set username=#{username},birthday=#{birthday},sex=#{sex},
address=#{address} where id=#{id}
</update>
注:對(duì)于增刪改,我們需要手動(dòng)提交數(shù)據(jù)
sqlSessionFactory.openSession(false)——默認(rèn)為false即代表手動(dòng)提交
二、傳入?yún)?shù)處理
1、單個(gè)參數(shù)
mybatis不會(huì)做特殊處理,#{參數(shù)名},取出參數(shù)值。
2、多個(gè)參數(shù)
mybatis會(huì)被特殊處理,多個(gè)參數(shù)會(huì)被封裝成一個(gè)map。
key :param1,param2,…paramN, 或者參數(shù)的索引也可以
value:傳入的參數(shù)值
#{key} 就是從map中獲取指定的key的值。

取值時(shí),寫(xiě)成 #{param1},#{param2}就會(huì)不報(bào)錯(cuò)。
注解 @Param
而mybatis中還為我們提供了一個(gè)注解 @Param,用來(lái)將傳入的參數(shù),做一個(gè)別名處理,取值是直接使別名就能取到值:#{別名}

3、參數(shù)中有Collection(List、Set) 類(lèi)型或者是數(shù)組
如果傳入的參數(shù)中有Collection(List、Set) 類(lèi)型或者是數(shù)組,也會(huì)特殊處理,也會(huì)吧傳入的list或者數(shù)組封裝到map中。
key:Collection(collection)。
如果是List還可以使用key(list)、如果是數(shù)組可以使用key(array)

4、參數(shù)封裝成數(shù)據(jù)模型
如果多個(gè)參數(shù)正好是我們業(yè)務(wù)邏輯的數(shù)據(jù)模型,我們可以直接傳入pojo;
#{屬性名}:取出傳入的pojo的屬性值。
//dao層方法參數(shù)為一個(gè)pojo
public Employee getEmpById(Employee employee);
<!-- mapper中可直接取出屬性名 -->
<select id="getEmpById" resultType="com.zhyheima.mybatis.bean.Employee">
select * from tb1_employee where id=#{id}
</select>
如果多個(gè)參數(shù)不是業(yè)務(wù)模型中的數(shù)據(jù),沒(méi)有對(duì)應(yīng)的pojo,不經(jīng)常使用,為了方便,我們可以傳入map
#{key}:取出map中對(duì)應(yīng)的值。

5、parameterType 配置 參數(shù)
基本類(lèi)型和 String 我 們可以直接寫(xiě)類(lèi)型名稱(chēng) ,也可以使用包 名 . 類(lèi)名的方式 ,例如 :java.lang.String。
實(shí)體類(lèi)類(lèi)型,目前我們只能使用全限定類(lèi)名(前提是沒(méi)有在mybatis的全局配置文件中起別名)。
mybaits 在加載時(shí)已經(jīng)把常用的數(shù)據(jù)類(lèi)型注冊(cè)了別名,從而我們?cè)谑褂脮r(shí)可以不寫(xiě)包名,而我們的是實(shí)體類(lèi)并沒(méi)有注冊(cè)別名,所以必須寫(xiě)全限定類(lèi)名。

三、查詢(xún)
1、模糊查詢(xún)
方式一:
<!-- 根據(jù)名稱(chēng)模糊查詢(xún) -->
<select id="findByName" resultType="com.tfjybj.domain.User" parameterType="String">
select * from user where username like #{username}
</select>
以上寫(xiě)法中沒(méi)有加入%來(lái)作為模糊查詢(xún)的條件,所以在程序代碼中傳入字符串實(shí)參時(shí),就需要給定模糊查詢(xún)的標(biāo)識(shí)%。配置文件中的#{username}也只是一個(gè)占位符,所以 SQL 語(yǔ)句顯示為“?”。
方式二:
<!-- 根據(jù)名稱(chēng)模糊查詢(xún) -->
<select id="findByName" parameterType="string" resultType="com.tfjybj.domain.User">
select * from user where username like '%${value}%'
</select>
將原來(lái)的#{}占位符,改成了$ {value}。注意如果用模糊查詢(xún)的這種寫(xiě)法,那么$ {value}的寫(xiě)法就是固定的,不能寫(xiě)成其它名字。這樣在程序代碼中就不需要加入模糊查詢(xún)的匹配符%了。
2、#{}與${}的區(qū)別
#{} 表示一個(gè)占位符號(hào)
通過(guò)#{}可以實(shí)現(xiàn) preparedStatement 向占位符中設(shè)置值,自動(dòng)進(jìn)行 java 類(lèi)型和 jdbc 類(lèi)型轉(zhuǎn)換,#{}可以有效防止 sql 注入。 #{}可以接收簡(jiǎn)單類(lèi)型值或 pojo 屬性值。 如果 parameterType 傳輸單個(gè)簡(jiǎn)單類(lèi)型值,#{}括號(hào)中可以是 value 或其它名稱(chēng)。
$ {} 表示拼接 sql 串
通過(guò)$ {}可以將 parameterType 傳入的內(nèi)容拼接在 sql中且不進(jìn)行 jdbc 類(lèi)型轉(zhuǎn)換, $ {}可以接收簡(jiǎn)單類(lèi)型值或 pojo 屬性值,如果 parameterType 傳輸單個(gè)簡(jiǎn)單類(lèi)型值,$ {}括號(hào)中只能是 value。
大多數(shù)情況下,我們?nèi)?shù)的值都應(yīng)該去使用#{};
3、返回屬性為resultType
resultType 屬性可以指定結(jié)果集的類(lèi)型,它支持基本類(lèi)型和實(shí)體類(lèi)類(lèi)型。
- 若返回的是一個(gè)List集合,則resultType中寫(xiě)這個(gè)集合中的類(lèi)型即可。
- 若返回的是一個(gè)Map集合(查詢(xún)一條數(shù)據(jù)),則mybatis中的resultType中可以直接寫(xiě)小map。
- 若返回的是一個(gè)Map集合(查詢(xún)多條數(shù)據(jù),每條數(shù)據(jù)的model作為value),則mybatis中用這個(gè)model作為返回類(lèi)型,并且在dao層返回的Map聲明上加上注解@MapKey(“要作為key的字段名”)

對(duì)于實(shí)體類(lèi)型,它和 parameterType 一樣,如果注冊(cè)過(guò)類(lèi)型別名的,可以直接使用別名。沒(méi)有注冊(cè)過(guò)的必須使用全限定類(lèi)名。
同時(shí),當(dāng)是實(shí)體類(lèi)名稱(chēng)時(shí),還有一個(gè)要求,實(shí)體類(lèi)中的屬性名稱(chēng)必須和查詢(xún)語(yǔ)句中的列名保持一致,否則無(wú)法實(shí)現(xiàn)封裝。
4、返回屬性為resultMap
若mybatis中查詢(xún)出的數(shù)據(jù)列與bean中的屬性無(wú)法對(duì)應(yīng)上(名稱(chēng)不對(duì)應(yīng)),解決辦法:
- sql查詢(xún)的時(shí)候,查詢(xún)出的字段用as 后面加一個(gè)別名。
- 在全局配置文件中,使用settings設(shè)置,支持駝峰命名法。(mybatis在window系統(tǒng)下不區(qū)分字母大小寫(xiě),若數(shù)據(jù)庫(kù)中字段名為lastname,javabean中的屬性名稱(chēng)為lastName,則可以查詢(xún)成功)。
- mybatis中使用resultMap作為返回,resultMap可以自定義結(jié)果映射規(guī)則。
resultMap 標(biāo)簽可以建立查詢(xún)的列名和實(shí)體類(lèi)的屬性名稱(chēng)不一致時(shí)建立對(duì)應(yīng)關(guān)系。從而實(shí)現(xiàn)封裝。
在 select 標(biāo)簽中使用 resultMap 屬性指定引用即可。同時(shí) resultMap 可以實(shí)現(xiàn)將查詢(xún)結(jié)果映射為復(fù)雜類(lèi)型的 pojo,比如在查詢(xún)結(jié)果映射對(duì)象中包括 pojo 和 list 實(shí)現(xiàn)一對(duì)一查詢(xún)和一對(duì)多查詢(xún)。
自定義某個(gè)javaBean的封裝規(guī)則
resultMap屬性:
- type 屬性:指定實(shí)體類(lèi)的全限定類(lèi)名
- id 屬性:給定一個(gè)唯一標(biāo)識(shí),是給查詢(xún) select 標(biāo)簽引用用的。
內(nèi)部標(biāo)簽:
- id 標(biāo)簽:用于指定主鍵字段
- result 標(biāo)簽:用于指定非主鍵字段
- column 屬性:用于指定數(shù)據(jù)庫(kù)列名
- property 屬性:用于指定實(shí)體類(lèi)屬性名稱(chēng)
<!-- 建立 User 實(shí)體和數(shù)據(jù)庫(kù)表的對(duì)應(yīng)關(guān)系 type 屬性:指定實(shí)體類(lèi)的全限定類(lèi)名 id 屬性:給定一個(gè)唯一標(biāo)識(shí),是給查詢(xún) select 標(biāo)簽引用用的。 --> <resultMap type="com.zhyheima.domain.User" id="userMap"> <id column="id" property="userId"/> <result column="username" property="userName"/> <result column="sex" property="userSex"/> <result column="address" property="userAddress"/> <result column="birthday" property="userBirthday"/> </resultMap> <!-- 配置查詢(xún)所有操作 --> <select id="findAll" resultMap="userMap"> select * from user </select>
聯(lián)合查詢(xún),實(shí)體級(jí)聯(lián)屬性封裝結(jié)果集(一對(duì)一或多對(duì)一)
一對(duì)一:對(duì)于查詢(xún)結(jié)果中,是兩個(gè)model的集合,即一個(gè)model嵌套了一個(gè)model,比如查詢(xún)被雇傭者的信息,并根據(jù)該信息查詢(xún)出雇主的信息,返回被雇傭者和雇主兩個(gè)model的信息。
多對(duì)一:雇傭者可能有多個(gè),但只有一個(gè)雇主。

使用asscociation聯(lián)合查詢(xún),定義實(shí)體級(jí)聯(lián)屬性封裝規(guī)則(一對(duì)一或多對(duì)一)
resultMap中還可以使用association標(biāo)簽,進(jìn)行一對(duì)一查詢(xún)。

進(jìn)行分步查詢(xún),使用asscociation聯(lián)合查詢(xún),定義實(shí)體級(jí)聯(lián)屬性封裝規(guī)則(一對(duì)一或多對(duì)一)
分步查詢(xún),先查詢(xún)被雇傭者的信息,在根據(jù)被雇傭者查詢(xún)雇傭者信息。被分為了兩個(gè)sql語(yǔ)句。

使用collection嵌套結(jié)果集(一對(duì)多或多對(duì)多)
例如:
查詢(xún)所有用戶(hù)信息及用戶(hù)關(guān)聯(lián)的賬戶(hù)信息。
用戶(hù)信息和他的賬戶(hù)信息為一對(duì)多關(guān)系。
<resultMap type="com.zhyheima.bean.user" id="userMap"> <id column="id" property="id"></id> <result column="username" property="username"/> <result column="address" property="address"/> <result column="sex" property="sex"/> <result column="birthday" property="birthday"/> <!-- collection 是用于建立一對(duì)多中集合屬性的對(duì)應(yīng)關(guān)系 ofType 用于指定集合元素的數(shù)據(jù)類(lèi)型 --> <collection property="accounts" ofType="com.zhyheima.bean.account"> <id column="aid" property="id"/> <result column="uid" property="uid"/> <result column="money" property="money"/> </collection> </resultMap> <!-- 配置查詢(xún)所有操作 --> <select id="findAll" resultMap="userMap"> select u.*,a.id as aid ,a.uid,a.money from user u left outer join account a on u.id =a.uid </select>
collection
部分定義了用戶(hù)關(guān)聯(lián)的賬戶(hù)信息。表示關(guān)聯(lián)查詢(xún)結(jié)果集。
property=“accounts” :
關(guān)聯(lián)查詢(xún)的結(jié)果集存儲(chǔ)在 User 對(duì)象的上哪個(gè)屬性。
ofType=“com.zhyheima.bean.account” :
指定關(guān)聯(lián)查詢(xún)的結(jié)果集中的對(duì)象類(lèi)型即List中的對(duì)象類(lèi)型。
同樣collection也支持分布查詢(xún),具體查詢(xún)方式和association的方式一樣。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Mybatis映射文件詳解之mapper.xml文件
- Java?Mybatis的初始化之Mapper.xml映射文件的詳解
- 解決Mybatis映射文件mapper.xml中的注釋問(wèn)題
- mybatis整合spring實(shí)現(xiàn)開(kāi)啟mapper.xml映射文件掃描
- myBatis的mapper映射文件之批量處理方式
- mybatis映射文件mapper.xml的具體寫(xiě)法
- 解決Mybatis在IDEA中找不到mapper映射文件的問(wèn)題
- Mybatis中Mapper映射文件使用詳解
- 詳解mybatis通過(guò)mapper接口加載映射文件
- MyBatis Mapper映射文件配置的實(shí)現(xiàn)
相關(guān)文章
簡(jiǎn)單了解Mybatis如何實(shí)現(xiàn)SQL防注入
這篇文章主要介紹了簡(jiǎn)單了解Mybatis如何實(shí)現(xiàn)SQL防注入,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Spring Bean實(shí)例的創(chuàng)建及構(gòu)造器的挑選
這篇文章主要介紹了Spring Bean實(shí)例的創(chuàng)建及構(gòu)造器的挑選,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04
Spring Boot整合Mybatis Plus和Swagger2的教程詳解
這篇文章主要介紹了Spring Boot整合Mybatis Plus和Swagger2的教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
spring?NamedContextFactory在Fegin配置及使用詳解
在我們?nèi)粘m?xiàng)目中,使用FeignClient實(shí)現(xiàn)各系統(tǒng)接口調(diào)用變得更加簡(jiǎn)單,?在各個(gè)系統(tǒng)集成過(guò)程中,難免會(huì)遇到某些系統(tǒng)的Client需要特殊的配置、返回讀取等需求。Feign使用NamedContextFactory來(lái)為每個(gè)Client模塊構(gòu)造單獨(dú)的上下文(ApplicationContext)2023-11-11
詳解Spring AOP 攔截器的基本實(shí)現(xiàn)
本篇文章主要介紹了詳解Spring AOP 攔截器的基本實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
Java中instanceof關(guān)鍵字實(shí)例講解
大家好,本篇文章主要講的是Java中instanceof關(guān)鍵字實(shí)例講解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下2022-01-01
Java生成獨(dú)一無(wú)二的工單號(hào)實(shí)例
這篇文章主要介紹了Java生成獨(dú)一無(wú)二的工單號(hào)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-09-09

