前言:出现这个问题的原因有好几个,所以我们逐步的来解释并解决问题;
1、首先,要明确一点的是,Dao层的抽象方法中的参数一般情况下默认的是一个参数或者一个对象;
例如:
-
public
interface StudentDao {
-
-
int selectById(int id);
-
-
int insert(Student stu);
-
-
}
例如:
-
<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中映射的值,如下:
- <code class="language-java">import org.apache.ibatis.annotations.Param;
- public interface StudentDao {
- int selectBySelective(@Param("id")int id,@Param("name")String name);
- }</code>
-
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>