Mybatis @Param注解的作用

来源:互联网 发布:画册设计软件 编辑:程序博客网 时间:2024/06/05 20:39

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

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

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

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

/** * 配置spring和junit整合,这样junit在启动时就会加载spring容器 */@RunWith(SpringJUnit4ClassRunner.class)//告诉junit spring的配置文件@ContextConfiguration({"classpath:spring/spring-dao.xml"})public class SeckillDaoTest {    //注入Dao实现类依赖    @Resource    private SeckillDao seckillDao;    @Test    public void queryById() throws Exception {        long seckillId=1000;        Seckill seckill=seckillDao.queryById(seckillId);        System.out.println(seckill.getName());        System.out.println(seckill);    }    @Test    public void queryAll() throws Exception {        List<Seckill> seckills=seckillDao.queryAll(0,100);        for (Seckill seckill : seckills) {            System.out.println(seckill);        }    }

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

Parameter ‘a’ not found

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

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

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

修改错误代码

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

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

原创粉丝点击