Mybatis @Param注解的作用

我不是女神ヾ 2022-06-06 10:52 424阅读 0赞

在刚使用Mybatis的时候,我们经常会犯一个错误。如下

一个秒杀网站的Dao层中的方法

  1. public interface SeckillDao {
  2. /** * 根据id查询秒杀的商品信息 * @param seckillId * @return */
  3. @Select({
  4. "SELECT * FROM seckill WHERE seckill_id=#{seckillId}"})
  5. Seckill queryById(long seckillId);
  6. /** * 根据偏移量查询秒杀商品列表 * @param a * @param b * @return */
  7. @Select({
  8. "SELECT * FROM seckill ORDER BY create_time DESC limit #{a},#{b} "})
  9. List<Seckill> queryAll( int offset, int limit);
  10. }

这是一个常见的用注解进行开发的DAO层代码,现在我们用Junit来测试一下。

  1. /** * 配置spring和junit整合,这样junit在启动时就会加载spring容器 */
  2. @RunWith(SpringJUnit4ClassRunner.class)
  3. //告诉junit spring的配置文件
  4. @ContextConfiguration({
  5. "classpath:spring/spring-dao.xml"})
  6. public class SeckillDaoTest {
  7. //注入Dao实现类依赖
  8. @Resource
  9. private SeckillDao seckillDao;
  10. @Test
  11. public void queryById() throws Exception {
  12. long seckillId=1000;
  13. Seckill seckill=seckillDao.queryById(seckillId);
  14. System.out.println(seckill.getName());
  15. System.out.println(seckill);
  16. }
  17. @Test
  18. public void queryAll() throws Exception {
  19. List<Seckill> seckills=seckillDao.queryAll(0,100);
  20. for (Seckill seckill : seckills) {
  21. System.out.println(seckill);
  22. }
  23. }

当我们运行queryId()这个测试方法时,会显示通过测试。
但是我们运行第二个测试方法时,Junit会显示报错。

Parameter ‘a’ not found

参数a没有找到,为什么会报这种错误呢?

因为Java设计时,并没有保存形参的记录

  1. queryAll( int offset, int limit) 在运行期变成---> queryAll(arg0, arg1)

所以当你的方法只有一个参数的时候,你可以随意使用.但是如果你有多个参数的话,你就必须告诉mybatis你的参数分别叫什么名字。这样你传入参数的时候,mybatis才能通过参数名字将数据传入#{}中。

mybatis就提供了@Param这个注解来完成命名

SELECT * FROM seckill ORDER BY create_time DESC limit #{a},#{b} 表示sql语句要接受2个参数,一个参数名是a,一个参数名是b

修改错误代码

  1. /** * 根据偏移量查询秒杀商品列表 * @param a * @param b * @return */
  2. @Select({
  3. "SELECT * FROM seckill ORDER BY create_time DESC limit #{a},#{b} "})
  4. List<Seckill> queryAll(@Param("a") int offset, @Param("b") int limit);
  5. }

给入参int offset 命名为a , int limit命名为b,然后sql语句SELECT * FROM seckill ORDER BY create_time DESC limit #{a},#{b} 中就可以根据a和b得到参数值了

发表评论

表情:
评论列表 (有 0 条评论,424人围观)

还没有评论,来说两句吧...

相关阅读

    相关 @param注解作用

    1、 首先要声明的一点是,我们的普通Dao内的方法最多只能接受一个参数。即一个javabean或者传一个id、name、balance之类的,不能同时传name和bala