在刚使用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得到参数值了