mybatis传入多个参数的方法
使用mybatis在CRUD的时候经常会需要传入参数,在语法上,mybatis只允许传入一个参数,但是通过一些技巧,我们就可以传入多个参数。
采用在接口中加入@Param()注释为参数设置别名的方式
public interface StudentMapper {
public Integer addStudent(@Param("sId") Integer studentId, @Param("sName")String studentName, @Param("sAge")Integer studentAge);
} <insert id="addStudent">
insert into student(studentId,studentName,studentAge) values (#{sId},#{sName},#{sAge})
</insert>当你需要传入的参数不仅有基本类型数据,还有对象时,可以使用下面的方式
public interface StudentMapper {
/**
这里Course是一个类,封装了Course这个对象,有courseId,courseName两个属性
*/
public Integer addStudent(@Param("sCourse") Course course,@Param("sId") Integer studentId, @Param("sName")String studentName, @Param("sAge")Integer studentAge);
} <insert id="addStudent">
insert into student(studentId,studentName,studentAge,studentCourseId,studentCourseName) values (#{sId},#{sName},#{sAge},#{sCourse.courseId},#{sCourse.courseName})
</insert>向sql传递数组或List,mybatis使用foreach解析
foreach元素的属性主要有item,index,collection,open,separator,close。
item:集合中元素迭代时的别名,该参数为必选。
index:在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选
open:foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选
separator:元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。
close: foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。
collection:
foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:
1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3. 如果使用Map封装了,collection的属性值为对应的Key
List<User> selectByUserIdList(@Param("userIds")String[] userIds);因为要查看userId在userIds这个范围内,因此需要使用in关键字。那么数组是怎么在mybatis文件中使用的呢?
<select id="selectByRoleIdList" resultMap="user" >
SELECT * FROM user
<if test="userIds!= null">
where user_id in(
<foreach collection="userIds" item="userId" index="index" separator="," >
#{userId,jdbcType=INTEGER}
</foreach>
)
</if>在mybatis的mapper配置文件中,可以利用<foreach>标签实现sql条件的循环,可完成类似批量的sql
mybatis接受的参数分为:(1)基本类型(2)对象(3)List(4)数组(5)Map
无论传哪种参数给mybatis,他都会将参数放在一个Map中:
如果传入基本类型:变量名作为key,变量值作为value 此时生成的map只有一个元素。
如果传入对象: 对象的属性名作为key,属性值作为value
如果传入List: “list”作为key,这个List是value (这类参数可以迭代,利用<foreach>标签实现循环)
如果传入数组: “array”作为key,数组作为value(同上)
如果传入Map: 键值不变。
评论 (0)