Mybatis的parameterType以及foreach标签的详解

众所周知,mybatis的传入参数可以是各种Java基本数据类型:包含int,String,Date等。基本数据类型作为传参,只能传入一个。通过#{参数名} 即可获取传入的值 ,复杂数据类型:包含JAVA实体类、Map。通过#{属性名}或#{map的KeyName}即可获取传入的值,但是如果想传入一个collection怎么办呢?

经查找后发现可以使用mapper配置文件中的foreach语句,借用别人写的文章:

3.7 foreach

对于动态SQL 非常必须的,主是要迭代一个集合,通常是用于IN 条件。List 实例将使用“list”做为键,数组实例以“array” 做为键。

foreach元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内。它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符。这个元素是很智能的,它不会偶然地附加多余的分隔符。

注意:你可以传递一个List实例或者数组作为参数对象传给MyBatis。当你这么做的时候,MyBatis会自动将它包装在一个Map中,用名称在作为键。List实例将会以“list”作为键,而数组实例将会以“array”作为键。

这个部分是对关于XML配置文件和XML映射文件的而讨论的。下一部分将详细讨论JavaAPI,所以你可以得到你已经创建的最有效的映射。

3.7.1参数为array示例的写法略3.7.2参数为list示例的写法

接口的方法声明:

Java代码  mybatis中关于传入参数parameterType - 韦成真 - 韦成真——个人博客 
public List<StudentEntity> getStudentListByClassIds_foreach_list(List<String> classIdList);  

 

动态SQL语句:

Xml代码  mybatis中关于传入参数parameterType - 韦成真 - 韦成真——个人博客 
<!-- 7.2 foreach(循环List<String>参数) - 作为where中in的条件 -->  
<select id="getStudentListByClassIds_foreach_list" resultMap="resultMap_studentEntity">  
    SELECT ST.STUDENT_ID,  
           ST.STUDENT_NAME,  
           ST.STUDENT_SEX,  
           ST.STUDENT_BIRTHDAY,  
           ST.STUDENT_PHOTO,  
           ST.CLASS_ID,  
           ST.PLACE_ID  
      FROM STUDENT_TBL ST  
      WHERE ST.CLASS_ID IN   
     <foreach collection="list" item="classIdList"  open="(" separator="," close=")">  
        #{classIdList}  
     </foreach>  
</select>  
  

测试代码,查询学生中,在20000001、20000002这两个班级的学生:

Java代码  mybatis中关于传入参数parameterType - 韦成真 - 韦成真——个人博客 
@Test  
public void test7_2_foreach() {  
    ArrayList<String> classIdList = new ArrayList<String>();  
    classIdList.add("20000001");  
    classIdList.add("20000002");  
    List<StudentEntity> list = this.dynamicSqlMapper.getStudentListByClassIds_foreach_list(classIdList);  
    for (StudentEntity e : list) {  
        System.out.println(e.toString());  
    }  
}  

 

这个是ItEye上的一篇文章,其中配置文件中的parameterType是可以不配置的,mybatis会自动传入的。当您想传入collection时,并不能直接传入collection对象,要将其先转换为list,然后才能传入。因为mybatis生成SQL语句遍历list时是需要用到get()方法的,而这个方法只在List中才有,Collection里是没有的。以上的配置在Mybitis官方文档中的“动态SQL”也可以找到。

 

  • 参数示例:

根据班级ID查询教师列表

xml文件


[html]  view plain copy

<select id="selectTeacher" parameterType="int" resultType="com.myapp.domain.Teacher">  
    select * from Teacher where c_id=#{id}  
</select>  


java代码


[java]  view plain copy

List<Teacher> tList = teacherMapper.selectTeacher(2);    
for (Teacher entityTemp : tList) {    
    System.out.println(entityTemp.toString());    
}    
JAVA实体类型参数示例:
[html]  view plain copy

<select id="selectTeacher" parameterType="com.myapp.domain.Teacher" resultType="com.myapp.domain.Teacher">  
    select * from Teacher where c_id=#{id}  
</select>  
[java]  view plain copy

java代码  
  
Teacher queryTeacher=new Teacher();  
queryTeacher.setId(2);  
List<Teacher> tList = teacherMapper.selectTeacher(queryTeacher);    
for (Teacher entityTemp : tList) {    
    System.out.println(entityTemp.toString()); }  
Map参数示例:
[html]  view plain copy

<select id="selectTeacher" parameterType="Map" resultType="com.myapp.domain.Teacher">  
    select * from Teacher where c_id=#{id} and sex=#{sex}  
</select>  
[java]  view plain copy

java代码  
  
Map<String,String> map=new HasMap<String,String>();  
map.put("id","2");  
map.put("sex","男");  
List<Teacher> tList = teacherMapper.selectTeacher(map);    
for (Teacher entityTemp : tList) {    
    System.out.println(entityTemp.toString()); }  
 另外MyBatis还提供了一个使用注解来参入多个参数的方式。这种方式需要在接口的参数上添加@Param注解

示例:

接口方法


[java]  view plain copy

public List<Teacher> selectTeacher(@Param(value="id") String id,@Param(value="sex") String sex);  


XML文件


[html]  view plain copy

<select id="selectTeacher"  resultType="com.myapp.domain.Teacher">  
    select * from Teacher where c_id=#{id} and sex=#{sex}  
</select>  


测试代码


[java]  view plain copy

List<Teacher> tList = teacherMapper.selectTeacher("2","男");    
for (Teacher entityTemp : tList) {    
    System.out.println(entityTemp.toString()); 

这里推荐一下这个博主关于Mybitis的文章,写得很不错。


总结:

  1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
  2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
  3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key

parameterType为对应的参数实体类,这些类中的字段将会替换sql语句中的类似#{}的语句,使之成为完整的sql 语句。同样的,resultType同样对应的是返回值的实体类。这里可以细说一下,其实在mybatis中,无论你指定还是不指定返回类型,mybatis都会默认的先将查询回的值放入一个hashMap中(如果返回的值不止一条就是一个包含hashMap的list)。这其中的区别在于,如果你指定了返回类型,mybatis将会根据返回类型的实体类来从hashMap中获取值并set到这个实体类中。如果不指定就默认返回一个HashMap<String,Object>(List<HashMap<String,Object>>)



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值