Mybatis參數(shù)(Parameters)傳遞方式
1.單個普通類型(基本類型、包裝類型、String)的參數(shù)
封裝規(guī)則:Mybatis不會做特殊的處理
取值 #{隨便寫,建議與實(shí)際的參數(shù)名保持一致}
例如:
操作:public Employee getEmployeeById(Integer id );
取值:#{id}
<!-- 關(guān)于select 的查詢語句 resulType:查詢結(jié)果對應(yīng)的類型 id 當(dāng)前sql語句的唯一標(biāo)識 #{id}:獲取傳遞的參數(shù) resultType用于指定結(jié)果集的封裝類型 parameter:確定傳遞參數(shù)的類型,也可以省略,mybatis會自動識別當(dāng)前參數(shù)類型是什么 --> <select id="getEmployeeById" resultType="employee" parameterType="java.lang.Integer" databaseId="mysql"> select id,last_name lastName,email,gender from tbl_employee where id=#{id} </select>
2.多個參數(shù)
封裝規(guī)則:Mybatis會把多個參數(shù)封裝成一個Map,封裝時使用的key是:0 1 2 ....N-1/param1param2....paramN.
取值:#{0 1 2 ....N-1/param1param2....paramN}
例如:
操作:public Employee getEmpsByLastNameAndId(String lastName, Integer id );
取值:#{lastName}、#{id}錯誤
異常:Cause: org.apache.ibatis.binding.BindingException: Parameter 'lastName' not found. Available parameters are[0, 1, param1, param2]
取值:#{0}、#{1} 或者#{param1}、#{param2}正確
不方便:參數(shù)一旦多了,不知道參數(shù)具體在第幾個位置
<!--${param1} and id=${param2} 參數(shù)一旦多了 不知道參數(shù)具體在第幾個位置 --> <select id="getEmpsLastNameAndId" resultType="employee"> select * from tbl_employee where last_name=#{param1} and id=#{param2} </select>
3.命名參數(shù)
使 用@Param()來指定多個參數(shù)封裝Map時所使用的key
封裝規(guī)則:Mybatis會把多個參數(shù)封裝成一個Map,封裝時使用的key是:通過@Param指定的key、param1param2....paramN
取值:#{@Param指定的key/param1param2....paramN}
例如:
操作:public Employee getEmpsLastNameAndIdNamedParameter(@Param("lastName") String lastName, @Param("Id") Integer id);
取值:#{lastName/param1}#{id/param2}
<select id="getEmpsLastNameAndIdNamedParameter" resultType="employee"> select * from tbl_employee where last_name=#{param1} and id=#{param2} </select> <select id="getEmpsLastNameAndIdNamedParameter" resultType="employee"> select * from tbl_employee where last_name=#{lastName} and id=#{id} </select>
4.Map 如果參數(shù)很多
但是不屬于某個對象的屬性,也是很常用,可以直接封裝成map進(jìn)行傳遞。
封裝規(guī)則:Mybatis不做特殊處理,直接使用傳遞的Map
取值 :#{map中的key}
例如:public List<Employee> getEmpsByLastNameLikeAnsEmailLike(Map<String,Object> map);
<select id="getEmpsByLastNameLikeAnsEmailLike" resultType="employee"> select * from tbl_employee where last_name like '${ln}' and email like '${email}' </select>
/* * 5.如果參數(shù)很多,但不屬于某個對象的屬性,也不是很常用,可以直接封裝成map進(jìn)行傳遞 封裝規(guī)則 Mybatis不做特殊處理 直接使用傳遞的map * 取值 #{map中的key} */ @Test public void testMap() throws IOException { SqlSessionFactory ssf = getSqlSessionFactory(); SqlSession sqlSession = ssf.openSession(); Map<String, Object> map = new HashMap<String, Object>(); map.put("ln", "%bq%"); map.put("email", "%qq%"); EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class); List<Employee> emps = mapper.getEmpsByLastNameLikeAnsEmailLike(map); System.out.println("使用map參數(shù)封裝時的結(jié)果對象 " + emps); }
5.POJO ---> 傳遞單個對象
封裝規(guī)則:Mybatis不做特殊處理
取值: #{POJO的屬性名}
例如:
操作:public Integer addEmployee(Employee employee);
取值:#{employee的屬性名idlastNameemailgender}
<!--1. 字段名和屬性名一一對應(yīng) 2.parameter:確定傳遞參數(shù)的類型,也可以省略,mybatis會自動識別當(dāng)前參數(shù)類型是什么 useGeneratedKeys:true使用自增主鍵的方式 keyProperty="id" 確定當(dāng)前對象的哪個屬性保存主鍵信息 保存自增主鍵值 --> <insert id="addEmployee" parameterType="com.hbsi.bean.Employee" useGeneratedKeys="true" keyProperty="id"> insert into tbl_employee(last_name,email,gender) values(#{lastName},#{email},#{gender}) </insert>
6.TO: Transfer Object數(shù)據(jù)傳輸對象
如果參數(shù)很多,但不屬于某個對象的屬性,卻很常用,推薦寫成java類,封裝成對象進(jìn)行傳遞
例如:在分頁功能用的較多:封裝成Page類{ int pageNo, int pageSize, int pages , boolean isHasPrevpage,boolean isHasNextPge......}
7.集合-------使用mybatis迭代
封裝規(guī)則: MyBatis對 CollectionArray 會進(jìn)行特殊處理, 也會封裝Map。
封裝的key:
Collection(List/Set)
:使用的key: collectionList
:使用的key: collection/ listArray
:使用的key:array
例如:
操作:
public void deleteByExample(List<Integer> ids);
取值:(此時的key必須為list或collection)
<delete id="deleteByExample"> delete from tbl_employee where id in <if test="_parameter!=null"> <foreach close=")" collection="list" item="id" open="(" separator=","> #{id} </foreach> </if> </delete>
集合-------使用mybatis迭代也可使 用@Param()來指定參數(shù)封裝Map時所使用的key,多個參數(shù)也可以
操作
public void deleteByExample(@Param("listId")List<Integer> ids);
取值:此時的可以使用@Param("listId")指定的別名,listId
<delete id="deleteByExample"> delete from tbl_employee where id in <if test="_parameter!=null"> <foreach close=")" collection="listId" item="id" open="(" separator=","> #{id} </foreach> </if> </delete>
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot集成極光推送完整實(shí)現(xiàn)代碼
本文主要介紹了SpringBoot集成極光推送完整實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12springboot內(nèi)置tomcat調(diào)優(yōu)并發(fā)線程數(shù)解析
這篇文章主要介紹了springboot內(nèi)置tomcat調(diào)優(yōu)并發(fā)線程數(shù)解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12Java多例Bean的應(yīng)用場景-easyExcel導(dǎo)入
EasyExcel 是一個基于 Java 的簡單、省內(nèi)存的讀寫 Excel 的開源項(xiàng)目。這篇文章主要介紹了用easyExcel導(dǎo)入Java Bean的應(yīng)用場景,感興趣的朋友可以參考閱讀2023-04-04cmd中javac命令無法運(yùn)行(java指令能運(yùn)行)解決步驟
這篇文章主要介紹了在安裝JDK后,執(zhí)行javac命令沒有返回值的問題,可能是由于命令提示符窗口緩存問題、系統(tǒng)路徑優(yōu)先級問題、文件權(quán)限問題或命令行輸入問題,文中通過代碼將解決的步驟介紹的非常詳細(xì),需要的朋友可以參考下2025-02-02SpringBoot基礎(chǔ)教程之集成郵件服務(wù)
這篇文章主要給大家介紹了關(guān)于SpringBoot基礎(chǔ)教程之集成郵件服務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07SpringCloud集成Eureka并實(shí)現(xiàn)負(fù)載均衡的過程詳解
這篇文章主要給大家詳細(xì)介紹了SpringCloud集成Eureka并實(shí)現(xiàn)負(fù)載均衡的過程,文章通過代碼示例和圖文講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的參考價值,需要的朋友可以參考下2023-11-11Java?事務(wù)注解@Transactional回滾(try?catch、嵌套)問題
這篇文章主要介紹了Java?@Transactional回滾(try?catch、嵌套)問題,Spring?事務(wù)注解?@Transactional?本來可以保證原子性,如果事務(wù)內(nèi)有報(bào)錯的話,整個事務(wù)可以保證回滾,但是加上try?catch或者事務(wù)嵌套,可能會導(dǎo)致事務(wù)回滾失敗2022-08-08