zoukankan      html  css  js  c++  java
  • nested exception is org.apache.ibatis.binding.BindingException: Parameter 'username' not found. Available parameters are [arg1, arg0, param1, param2]

    转载自:https://blog.csdn.net/ITBigGod/article/details/82970621

    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中映射的值.

    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);
    }
    
    <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);
    
    public interface StudentDao {
     
    	int update(Page page);
    	
    }
    
    <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>
    

    例子:

    需要传入page,rows整型参数和map对象。

    在dao层方法里面,要加入注解@Param:

    mapper.xml里面直接使用map参数:

  • 相关阅读:
    【ceph | 运维】部署osd
    【osd | 运维】osd数据均衡
    leveldb——leveldb入门篇之Linux下编译配置和使用
    【Linux系统编程】预分配磁盘空间
    【filestore】源码剖析
    【Linux】Linux Page Cache的理解
    ceph internal 之 底层对象
    【Linux】磁盘基础知识
    Spring Cloud Alibaba学习08Seata基本使用
    Spring Cloud Alibaba学习05Sentinel基本使用
  • 原文地址:https://www.cnblogs.com/mjn1/p/13168427.html
Copyright © 2011-2022 走看看