MyBatis在Mapper中傳遞多個(gè)參數(shù)的四種方法詳解
1、若Dao層函數(shù)有多個(gè)參數(shù),那么其對應(yīng)的xml中,#{0}代表接收的是Dao層中的第一個(gè)參數(shù),#{1}代表Dao中的第二個(gè)參數(shù),以此類推。
假設(shè)Dao層函數(shù)有兩個(gè)參數(shù),分別是int類型的id和String類型的name:
// Dao層函數(shù)
public User getUserByIdAndName(int id, String name);
<!--對應(yīng)的Mapper中-->
<select id="getUserByIdAndName" resultType="User">
SELECT * FROM user WHERE id = #{0} AND name = #{1}
</select>2、使用@Param注解,在Dao層函數(shù)的參數(shù)前面添加@Param注解來顯式指定每個(gè)參數(shù)的名稱,例如:
// Dao層函數(shù)
public User getUserByIdAndName(@Param("id") int id, @Param("name") String name);
<!-- 對應(yīng)的Mapper中 -->
<select id="getUserByIdAndName" resultType="User">
SELECT * FROM user WHERE id = #{id} AND name = #{name}
</select>3、將多個(gè)參數(shù)封裝成Map并傳遞到Mapper中,例如:
// Dao層函數(shù)
public User getUser(Map<String, Object> map);
<!-- 對應(yīng)的Mapper中 -->
<select id="getUser" resultType="User">
SELECT * FROM user WHERE id = #{id} AND name = #{name}
</select>調(diào)用該函數(shù)時(shí)需要將參數(shù)封裝成Map并設(shè)置key值為"id"和"name",例如:
Map<String, Object> map = new HashMap<>();
map.put("id", 1);
map.put("name", "張三");
User user = userDao.getUser(map);4、如果Dao層函數(shù)傳遞的是一個(gè)對象,該對象包含多個(gè)參數(shù),MyBatis會(huì)將該對象看做是一個(gè)參數(shù),并且會(huì)自動(dòng)地將對象中的屬性值映射到Mapper中的SQL語句中。
以查詢用戶信息為例,假設(shè)我們有一個(gè)User類,包含id、name和age三個(gè)屬性:
public class User {
private int id;
private String name;
private int age;
// 省略getter和setter方法
}在Dao層函數(shù)中,我們可以直接傳入一個(gè)User對象作為參數(shù):
public User getUser(User user);
在Mapper.xml文件中,可以使用類似以下的SQL語句:
<select id="getUser" resultType="com.example.User">
SELECT * FROM user WHERE id = #{id} AND name = #{name} AND age = #{age}
</select>在執(zhí)行Dao層函數(shù)時(shí),MyBatis會(huì)自動(dòng)地根據(jù)user對象中的屬性值,將#{id}、#{name}和#{age}替換為對應(yīng)的屬性值。例如:
User user = new User();
user.setId(1);
user.setName("張三");
user.setAge(20);
User result = userDao.getUser(user);在執(zhí)行上述代碼時(shí),MyBatis會(huì)將Mapper.xml中的SQL語句解析成如下形式:
SELECT * FROM user WHERE id = 1 AND name = '張三' AND age = 20
然后執(zhí)行該SQL語句,并將結(jié)果映射成User對象返回。
具體實(shí)現(xiàn)原理是通過MyBatis的OGNL表達(dá)式(Object-Graph Navigation Language,即對象圖導(dǎo)航語言)實(shí)現(xiàn)的。當(dāng)我們在Mapper.xml文件中使用#{propertyName}時(shí),MyBatis會(huì)使用OGNL表達(dá)式解析該表達(dá)式,找到對應(yīng)的屬性值,并將其替換到SQL語句中。
例如,在上述例子中,當(dāng)我們使用#{id}、#{name}和#{age}時(shí),MyBatis會(huì)使用OGNL表達(dá)式從Map中獲取key分別為"id"、"name"和"age"的value,也就是user對象中的id、name和age屬性值。
到此這篇關(guān)于MyBatis在Mapper中傳遞多個(gè)參數(shù)的四種方法詳解的文章就介紹到這了,更多相關(guān)MyBatis Mapper傳遞多個(gè)參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Mybatis之mapper接口多參數(shù)方式
- Mybatis往Mapper.xml文件中傳遞多個(gè)參數(shù)問題
- 一文搞懂Mybatis中Mapper配置文件獲取參數(shù)的五種方式
- MyBatis在mapper中傳遞參數(shù)的四種方式
- Mybatis中關(guān)于自定義mapper.xml時(shí),參數(shù)傳遞的方式及寫法
- Mybatis?Mapper中多參數(shù)方法不使用@param注解報(bào)錯(cuò)的解決
- mybatis?mapper.xml?注釋帶參數(shù)的坑及解決
- MyBatis Mapper接受參數(shù)的四種方式代碼解析
- 解決Mybatis?mappe同時(shí)傳遞?List?和其他參數(shù)報(bào)錯(cuò)的問題
相關(guān)文章
AsyncHttpClient的TimeoutTimerTask連接池異步超時(shí)
這篇文章主要為大家介紹了AsyncHttpClient的TimeoutTimerTask連接池異步超時(shí)源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Java Web項(xiàng)目部署在Tomcat運(yùn)行出錯(cuò)與解決方法示例
這篇文章主要介紹了Java Web項(xiàng)目部署在Tomcat運(yùn)行出錯(cuò)與解決方法,結(jié)合具體實(shí)例形式分析了Java Web項(xiàng)目部署在Tomcat過程中由于xml配置文件導(dǎo)致的錯(cuò)誤問題常見提示與解決方法,需要的朋友可以參考下2017-03-03
詳解SpringBoot配置devtools實(shí)現(xiàn)熱部署
本篇文章主要介紹了詳解SpringBoot配置devtools實(shí)現(xiàn)熱部署 ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
mybatis-plus配置攔截器實(shí)現(xiàn)sql完整打印的代碼設(shè)計(jì)
在使用mybatis-plus(mybatis)的時(shí)候,往往需要打印完整的sql語句,然而輸出的日志不是很理想,因?yàn)閟ql語句中的關(guān)鍵字段信息都是用?來代替的,所以本文分享了一下自己寫了一個(gè)攔截器實(shí)現(xiàn)了sql完整的打印,需要的朋友可以參考下2024-06-06
springboot2啟動(dòng)時(shí)執(zhí)行,初始化(或定時(shí)任務(wù))servletContext問題
這篇文章主要介紹了springboot2啟動(dòng)時(shí)執(zhí)行,初始化(或定時(shí)任務(wù))servletContext問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01

