问题展示
编写Mapper接口
public interface ProductsDao {
public Products findById(int i);
public void deleteById(int i);
public void insertProducts(Products products);
//通过pid更新price,需要传递两个参数
public void updateById( int price, int pid);
}
编写映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.glc.dao.ProductsDao">
<update id="updateById" parameterType="int" >
update Products set price = #{price} where pid = #{pid};
</update>
</mapper>
编写测试类
public void TestProducts4(){
SqlSession sqlSession = SessionUtils.getSession();
ProductsDao mapper = sqlSession.getMapper(ProductsDao.class);
mapper.updateById(10000,100);
sqlSession.commit();
sqlSession.close();
测试结果
测试结果分析
从报错原因上来看,是一个BindingException绑定异常:参数price没有找到,可用的参数有[arg1、arg0、param1,param2]。
结论:对于映射文件中的#{price}、#{pid}等中{}内的的参数与Mapper接口中方法的参数没有任何关系。
解决方法
解决方案一:
最简单的方式,就按照错误提示给出的解决方案。即直接修改映射文件,将接收过来的参数以【arg0、arg1】或【param1、param2】来接收
<update id="updateById" parameterType="int" >
update Products set price = #{arg0} where pid = #{arg1};
</update>
<update id="updateById" parameterType="int" >
update Products set price = #{param1} where pid = #{param2};
</update>
解决方案二:
使用@Param注解,通过此注解给Mapper接口中方法的参数指定名称,那么也就意味着该注解是定义在方法参数的声明上。这时候#{}中的值就需要写的是param中的值了
public interface ProductsDao {
public Products findById(int i);
public void deleteById(int i);
public void insertProducts(Products products);
public void updateById(@Param("price") int price, @Param("pid") int pid);
}