起因
我們先來看一個報錯

報錯很簡單,參數 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 來命名。

題外話的小字:這幾天在準備軟考,我發現大學裏還真的沒考什麼證書來,最近在看看教師資格證的考試,想試試當老師,然後剛剛又在查看公務員考試,在想去事業單位或者去當公務員,人生的岔路口真的太多了,真擔心自己一不小心就走丟了。