【学习笔记】MyBatis中接口中方法传递多个参数问题展示与解决

问题展示

编写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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值