您好,登錄后才能下訂單哦!
起因
我們先來看一個報錯
報錯很簡單,參數 start 沒找到。
我是在實現一個 API 接口時發現了一個問題,當我不使用 @Param 標簽時,mybatis 是不認識哪個參數叫什么名字的,盡管我定義了 (long start,long end) 它仍然不認識。在這個接口上,我希望根據前端傳來的參數,查找指定范圍的數據,例如:我想搜索第二頁的數據,假設一頁20個,那么搜索的范圍就是21-40,于是就會調用接口中的 getTypeListByRange 來查找對應 mapper 的 SQL 語句。
public interface TypeDao { Type getTypeByid(long id); List<Type> getTypeListAll(); List<Type> getTypeListByRange(long start,long end); }
解釋 @Param
org.apache.ibatis.annotations.Param 當映射器方法需要多個參數時,這個注解可以被用于:給映射器方法中的每個參數來取一個名字。否則,多參數將會以它們的順序位置和SQL語句中的表達式進行映射,這是默認的。
語法要求:若使用@Param(“id”),則SQL中參數應該被命名為:#{id}。
使用
Dao 層
import org.apache.ibatis.annotations.Param; import com.caeser.upmovie.entity.Type; public interface TypeDao { Type getTypeByid(long id); List<Type> getTypeListAll(); List<Type> getTypeListByRange(@Param("start")long start,@Param("end")long end); }
Mapper
<select id="getTypeListByRange" resultType="com.caeser.upmovie.entity.Type"> SELECT ID, NAME, CREATE_TIME, UPDATE_TIME FROM upm_type LIMIT #{start},#{end}; </select>
單元測試
public class TypeTest extends BaseTest{ @Autowired private TypeDao typeDao; @Test public void testDao(){ List<Type> typeList1=typeDao.getTypeListByRange(1, 4); for(int i=0;i<typeList1.size();i++){ System.out.println(typeList1.get(i).getName()); } } }
結果
總結
當 Dao 層傳遞參數為多個參數時,為了規范,必須使用 @Param 給參數命名。這里需要注意,使用的是 mybatis 的 param 來命名。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。