原文:https://blog.csdn.net/mrqiang9001/article/details/79520436html
Mybatis 做爲一個輕量級的數據持久化框架,目前(2018)的應用很是普遍,基本能夠取代Hibernate。關於 @param 這個註解的使用,做者這裏整理了一些筆記。java
關於Mybatis @Param 註解,官方文檔: http://www.mybatis.org/mybatis-3/zh/java-api.html
其中關於 @param部分的說明是:git
@Param Parameter N/A 若是你的映射器的方法須要多個參數, 這個註解能夠被應用於映射器的方法 參數來給每一個參數一個名字。不然,多 參數將會以它們的順序位置來被命名 (不包括任何 RowBounds 參數) 好比。 #{param1} , #{param2} 等 , 這 是 默 認 的 。 使 用 @Param(「person」),參數應該被命名爲 #{person}。github
也就是說若是有多個參數的時候,可使用@Param 這個註解,可是不是必定須要用到 @Param 這個註解呢?做者在這裏列出如下幾種情景spring
代碼以下:
DAO 層 CommodityDao.java
api
package com.ljq.cs.dao; /** * @description: 商品信息 DAO 接口 * @author: lujunqiang * @email: flying9001@gmail.com * @date: 2017/12/17 */ @Repository public interface CommodityDao { // 查詢某一件商品 Commodity queryOne(Commodity commodity); // 省略其餘方法 }
Mapper 文件: commoditymapper.xml
mybatis
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ljq.cs.dao.CommodityDao" > <select id="queryOne" resultType="Commodity"> select * from t_commodity com where id = #{id} </select> </mapper>
這裏只有一個參數,java 接口不使用 @Param 註解,同時 mapper 文件也不須要使用 parameterType 這個參數,Mybatis會 根據實體類(entity)的類型自動識別並匹配javaBean(這一部分在 spring配置文件關於數據源那一部分)app
代碼以下:
DAO 層 CommodityDao.java
框架
package com.ljq.cs.dao; /** * @description: 商品信息 DAO 接口 * @author: lujunqiang * @email: flying9001@gmail.com * @date: 2017/12/17 */ @Repository public interface CommodityDao { // 查詢某一件商品 Commodity queryOne(@Param("commodity")Commodity commodity); // 省略其餘方法 }
Mapper 文件: commoditymapper.xml
spa
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ljq.cs.dao.CommodityDao" > <select id="queryOne" parameterType="com.ljq.cs.entity.Commodity" resultType="Commodity"> select * from t_commodity com where id = #{commodity.id} </select> </mapper>
當使用javaBean做爲對象的時候,在寫 SQL 語句的時候,必須指定參數類型 parameterType="com.ljq.cs.entity.Commodity"
,同時在 #{ }
取值的時候不能直接填入 javaBean
的屬性,必須這樣使用 commodity.id
;不然,會拋出參數類型不匹配異常
若是不是 javaBean
,則須要在寫 SQL 語句的時候, #{ }
中的屬性必須與 @Param中定義的一致,eg: @Param("username")
, #{username}
,這樣才能夠
爲了精簡代碼,做者這裏只寫關鍵部分
DAO 層, UserInfoDao.java
// 用戶登陸 UserInfo signin(@Param("account")String account,@Param("passcode")String passcode);
mapper文件userInfomapper.xml
<!-- 用戶登陸 --> <select id="signin" resultType="UserInfo"> select * from t_userinfo info where account=#{account} and passcode=#{passcode} </select>
這裏 @Param 中定義的變量名必須和 mapper 中保持一致才能夠
其實從第一種場景中已經能夠實現傳遞多個參數了,即把多個參數封裝到一個 javaBean
中就能夠實現了,可是若是是兩個或者多個 javaBean
的時候,能夠經過使用@Param註解的方式來實現,可是須要把每一個 javaBean
中的屬性所有拆分出來,這樣就增長了巨大的代碼量,所以不推薦這麼作
那麼有沒有能夠不使用@Param註解,一樣也能夠傳遞多個參數(尤爲是多個 javaBean
)呢?答案是有的,廢話很少說,直接上代碼
同上,這裏只貼出關鍵部分
DAO 層, UserInfoDao.java
// 搜索用戶,對結果進行分頁 List searchUser(Map<String,Object>);
使用DAO,UserService.java
UserInfo userInfo = new UserInfo(); Pagination page = new Pagination(); Map<String,Object> map = new HashMap<>; map.put("userInfo",userInfo); pam.put("page",page); userService.searchUser(map);
mapper文件userInfomapper.xml
<select id="searchUser" parameterType="java.util.Map" resultType="UserInfo"> select * from t_userinfo user where 1 =1 <if test="user.uname != null and ''!= user.uname "> and user.uname like '%${userInfo.uname}$%' </if> <if test="page.order != null and page.order == 10" > order by user.id asc </if> limit ${page.pagenum * page.limitnum}, #{page.limitnum} </select>
做者經過上邊的4種狀況,主要是爲了說明,Mybatis不管是傳單個參數,仍是傳遞多個參數,沒有必要使用@Param註解啊
使用@param 註解增添了很多代碼不說,還容易致使錯誤,尤爲是在 mapper 文件中(paraterType
屬性)
以上只是做者的列舉的部分代碼,源碼請看這裏: https://github.com/Flying9001/campustore