org.apache.ibatis.binding.BindingException: Parameter 'XXXX' not found.的问题解决办法

前言:出现这个问题的原因有好几个,所以我们逐步的来解释并解决问题;

1、首先,要明确一点的是,Dao层的抽象方法中的参数一般情况下默认的是一个参数或者一个对象;
例如:

 public interface StudentDao {
     
        int selectById(int id);
        
        int insert(Student stu);
        
    }

这两种是正常的方式,不会出现什么问题,mappper中的对应取值都是用#{}这种方式;
例如:

<select id="selectById" resultMap="BaseResultMap">
            select
            <include refid="Base_Column_List" />
            from student
            where 1=1 and id = #{id}
        </select>
    <insert id="insert" parameterType="com.yoho.crm.dal.model.student"><!--注意参数的类型要与对象类对应,也就是这个类的路径-->
            insert into inbox_template (name,age)
            values (#{name},#{age})
        </insert>


上面如果是student对象作为参数,那么mapper中不能少了parameterType,否则会找不对应的属性


2、当传多个参数时,就容易出现问题了,问题重现,如果像下面那样写就会出现标题中的错误,找不到参数;

 public interface StudentDao {
        int selectBySelective(int id,String name);
        
    }

解决办法就是在每个参数前加上@param注解,括号中注解的名称就是mapper中映射的值,如下:

  

  import org.apache.ibatis.annotations.Param;
     
    public interface StudentDao {     
        
        int selectBySelective(@Param("id")int id,@Param("name")String name);
        
    }

mapper中还是那样写,可以使用${}或者#{}任意一种方式:

<select id="selectBySelective" resultMap="BaseResultMap">
            select
            <include refid="Base_Column_List" />
            from student
            where name = #{pname} and id = #{pid}
        </select>

3、既有参数又有对象时,对象也需要注解,一般参数的直接取,对象的需要对象.属性,如下:
   

 public interface StudentDao {
        
        int selectBySelective(@Param("page")int page,@Param("stu")Student stu);
        
    }

mapper:

    <select id="selectBySelective" resultMap="BaseResultMap">
            select
            <include refid="Base_Column_List" />
            from student
            where name = #{stu.name} and id = #{stu.id} limit 0 ,#{page}
        </select>

4、像这种有公共的属性,例如分页都要传开始的index和pagesize,然后还要在传对象,就是3中的案例,可以为了方便管理,自己再新建一个类,里面封装了page的属性,同时又有对象,如下:


建一个page类:

   

public class Page {
        
        private int pageNo;
        
        private int pageSize;
        
        private Object obj;
        
        public Page(int page,int pageSize,Object obj){
            this.pageNo=page;
            this.pageSize=pageSize;
            this.obj=obj;
        }
     
        public int getPageNo() {
            return pageNo;
        }
     
        public void setPageNo(int pageNo) {
            this.pageNo = pageNo;
        }
     
        
        public int getPageSize() {
            return pageSize;
        }
     
        public void setPageSize(int pageSize) {
            this.pageSize = pageSize;
        }
     
        public Object getObj() {
            return obj;
        }
     
        public void setObj(Object obj) {
            this.obj = obj;
        }
        
        
    }


在处理时直接new page对象中自己定义好的构造函数,然后直接把page作为参数传到dao:
  

  Student stu = new Student();
            stu.setName("aa");
            stu.setId(1);
            stu.setAge(12);
            Page page = new Page(1, 10,stu);


dao:

    public interface StudentDao {
     
        int update(Page page);
        
    }


mapper:

    <update id="update" parameterType="com.yoho.crm.dal.model.student"><!--此时obj则是对应page中的属性了-->
            update inbox_template
            set
            name = #{obj.name},
            age = #{obj.age}
            where id = #{obj.id}
        </update>


转自:https://blog.csdn.net/qq_33142257/article/details/53202443
 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值