7、mybatis中的sql映射文件详解(2)
對于初學(xué)者,如何進行mybatis的學(xué)習(xí)呢?我總結(jié)了幾點,會慢慢的更新出來。首先大家需要了解mybatis是什么、用mybatis來做什么、為什么要用mybatis、有什么優(yōu)缺點;當(dāng)知道了為什么的時候就開始了解如何用的問題,如何使用mybatis、有幾種使用方式、各種方式的優(yōu)缺點,在這個階段也會學(xué)習(xí)mybatis涉及到的一些標(biāo)簽的用法;當(dāng)知道了基礎(chǔ)用法之后,就開始接觸一些高級的用法,例如動態(tài)sql的使用、mybatis的緩存使用等;至此,在實戰(zhàn)項目中使用mybatis進行開發(fā)已經(jīng)沒有問題了。
接下來就開始深入的研究一下mybatis這個持久層的框架,在純技術(shù)的方面進行研究,提高自己的能力。首先,大家需要了解一下mybatis的整體技術(shù)架構(gòu)和工作原理;接下來,就開始了解一下mybatis各大核心組件的具體功能及其工作原理。至此,算是對mybatis的原理簡單的了解一下了,由于博主的能力有限,因此對于mybatis的框架技術(shù)研究也就到這里算結(jié)束了。
最后會了解一些其他的東西,例如:mybatis的逆向工程使用、如何開發(fā)一個mybatis插件,在這里會介紹一下mybatis的分頁實現(xiàn)等。
至此,mybatis也算是入門了,出去就可以和別人說,你稍微了解mybatis框架,對其也多少有一點自己的理解和看法了。
目錄
1、輸入映射
1、1 傳入?yún)?shù)的方式
1)傳入單個參數(shù)
2)傳入多個參數(shù)
3)傳入實體bean
4)傳入集合
1、2 參數(shù)的獲取
1)#{}
2)${}
2、輸出映射
2、1 自動映射結(jié)果集 resultType
1)結(jié)果映射到Integer
2)結(jié)果映射到實體
3)結(jié)果映射到集合
4)結(jié)果映射到map
2、2 自定義結(jié)果集映射?resultMap
上一篇?留的兩個問題如何傳入?yún)?shù)、如何將查詢結(jié)果映射到j(luò)ava對象中,這一篇做一下介紹。
大體上可分為兩部分:輸入映射、輸出映射
1、輸入映射
輸入映射這里指的是將java中的參數(shù)傳入到mybatis映射文件中,繼而進行數(shù)據(jù)查詢。
1、1 傳入?yún)?shù)的方式
需要往sql中傳入?yún)?shù)時,在sql 映射文件中需要指定類型,一般通過 parameterType 屬性進行設(shè)置?,但是mybatis是強大的,即使在sql映射文件中不用 parameterType 指明傳入?yún)?shù)的類型,mybatis依然可以自動識別類型,但是建議在開發(fā)時寫明,維護時可以直接明確傳入?yún)?shù)的類型。
雖然上邊這句話可能有人覺得會自相矛盾,但是還是有必要理解的,可以看一個例子:
sql 文件中寫兩個sql,他們區(qū)別在于,一個指定了傳入?yún)?shù)的類型
<insert id="insertUser">insert into oa_user (id, loginName, name) value (#{id}, #{loginName}, #{name}) </insert><insert id="insertUser2" parameterType="com.app.mapper.User">insert into oa_user (id, loginName, name) value (#{id}, #{loginName}, #{name}) </insert>在接口中定義兩個方法,調(diào)用時效果是一樣的,都會添加數(shù)據(jù)到數(shù)據(jù)庫
Integer insertUser(User user);Integer insertUser2(User user);?好了,知道了上邊的這些,就可以繼續(xù)下邊的介紹了,接下來一次介紹傳入單個參數(shù)、多個參數(shù)、傳入實體、傳入map、傳入list時如何開發(fā)sql映射文件
1)傳入單個參數(shù)
直接看例子吧,沒什么可說的
<delete id="delUser">delete from oa_user where id = #{id} </delete> Integer delUser(Long id);或者// 可以使用 @Param 來設(shè)置傳入的參數(shù)名 Integer delUser(@Param("id") Long id);2)傳入多個參數(shù)
有的時候可能需要傳入多個參數(shù),mybatis會自動將多個參數(shù)封裝到一個map中,sql映射文件中獲取參數(shù)時也是通過獲取map中參數(shù)方式。例如:需要根據(jù)性別和狀態(tài)獲取用戶列表數(shù)據(jù),則可以這樣開發(fā)
<select id="selectUsersBySexAndStatus" resultType="com.app.mapper.User">select * from oa_user where sex = #{sex} and status = #{status} </select>?接口中方法:
List<User> selectUsersBySexAndStatus(String sex, String status);3)傳入實體bean
<insert id="insertUser">insert into oa_user (id, loginName, name) value (#{id}, #{loginName}, #{name}) </insert>?接口中的方法
Integer insertUser(User user);4)傳入集合
<insert id="insertUserList" useGeneratedKeys="true" keyProperty="id">insert into oa_user (id, loginName, name) values<foreach collection="list" item="user" separator=",">(#{user.id}, #{user.loginName}, #{user.name})</foreach> </insert> Integer insertUserList(List<User> list);1、2 參數(shù)的獲取
在sql映射文件中有兩種獲取參數(shù)的方式,一種是使用 #{},第二種是使用 ${},接下來,說一下這兩者的用法和區(qū)別。
1)#{}
以預(yù)編譯的形式將參數(shù)設(shè)置到sql語句中,相當(dāng)于?JDBC?中的PreparedStatement,可以有效防止參數(shù)注入,一般可適用于大部分增、刪、改、查語句中。
另外,可以通過jdbcType 屬性進行類型的設(shè)置,用到的時候查詢mybatis官方文檔即可,我基本沒有碰到過。
使用時,直接通過#{param} 參數(shù)名獲取對應(yīng)的參數(shù)值。
2)${}
將對應(yīng)值直接拼接到sql語句中,相當(dāng)于 Statement,一般用于模糊查詢、排序語句中。
使用時,直接通過#{param} 參數(shù)名獲取對應(yīng)的參數(shù)值。
使用范例在這里就不寫了,之前所有的例子中基本都用到了參數(shù)。
2、輸出映射
2、1 自動映射結(jié)果集 resultType
對于一些簡單的查詢,mybatis可以自動映射結(jié)果集到類、實體、集合中,需要通過resultType 屬性進行標(biāo)識。具體使用如下:
1)結(jié)果映射到Integer
對于增、刪、改的處理,如果沒有使用resultType顯示聲明返回的結(jié)果集映射類型,則自動映射到Integer類型,為處理成功的記錄數(shù)。
<!-- 返回結(jié)果集映射到Integer,為添加結(jié)果記錄數(shù) --> <insert id="insertUser">insert into oa_user (id, loginName, name) value (#{id}, #{loginName}, #{name}) </insert>2)結(jié)果映射到實體
一般是用于數(shù)據(jù)查詢,返回單條記錄,會將數(shù)據(jù)自動封裝到對應(yīng)的實體類中:
<!-- 會將添加的結(jié)果映射到User實體類中,返回添加成功的User --> <insert id="insertUser2" parameterType="com.app.mapper.User">insert into oa_user (id, loginName, name) value (#{id}, #{loginName}, #{name}) </insert>3)結(jié)果映射到集合
一般用于數(shù)據(jù)查詢,返回多條記錄,會將數(shù)據(jù)自動映射到對應(yīng)的實體類中集合中,但是在sql 映射文件中使用resultType聲明返回的結(jié)果類型為實體類型,而非集合類型,這個需要注意:
<select id="selectUserList" resultType="com.app.mapper.User">select * from oa_user </select>4)結(jié)果映射到map
?通過 resultType 顯式設(shè)置返回結(jié)果集映射到 map 即可,resultType = 'map'
2、2 自定義結(jié)果集映射?resultMap
可以使用 resultMap標(biāo)簽 來進行結(jié)果集的自定義映射。在實際開發(fā)中,其實使用自動映射一般就可以滿足需求了。
其大體思路就是,先使用 resultMap 標(biāo)簽定義映射關(guān)系,之后使用resultMap 屬性來標(biāo)識返回的結(jié)果集通過自定義的映射關(guān)系進行映射。?簡單使用如下:
<resultMap id="user" type="com.app.mapper.User"><!-- 映射主鍵列,column是數(shù)據(jù)表對應(yīng)的字段,property是實體User對應(yīng)的字段 --><id column="id" property="id"/><!--映射非主鍵列時,使用result標(biāo)簽即可這里我自定義映射關(guān)系,將loginname字段信息映射到實體類的email屬性上--><result column="loginName" property="email"/> </resultMap><!-- 在這里使用resultMap 聲明結(jié)果集映射的類型 --> <select id="selectUser3" resultMap="user">select * from oa_user where id = #{id} </select>?好了,這一篇就到此位置,針對于resultMap還可以實現(xiàn)更復(fù)雜的映射,由于篇幅原因在這里先不詳細介紹,在?下一篇 繼續(xù)描述。
總結(jié)
以上是生活随笔為你收集整理的7、mybatis中的sql映射文件详解(2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机写作与电脑写作的区别手机写作与电脑写
- 下一篇: 交换机怎么连接无线路由器怎么设置无线路由