MyBatis多参数传递之默认命名方式示例——MyBatis学习笔记之十二

上文讲到了MyBatis多参数传递的注解方式,今天看另外一种方式,也就是参数默认命名的方式。还是以上文的分页查询教师信息的方法findTeacherByPage为例。

一、具体步骤

      对于映射器中的方法,MyBatis默认从左到右给方法的参数命名为param1、param2…,依次类推。我们可以无需借助注解,直接在SQL语句中使用这些默认名称。

      首先去掉@Param注解的TeacherMapper.java如下所示(完整源码下载地址: http://down.51cto.com/data/539217):
 
 
  1. package com.abc.mapper;  

  2. import com.abc.domain.Teacher;  

  3. import org.springframework.stereotype.Component;  

  4. import java.util.List;  

  5. //@Component指定映射器名称为myTeacherMapper 

  6. //相关内容,可参考笔者博客: 

  7. //http://legend2011.blog.51cto.com/3018495/980150 

  8. @Component("myTeacherMapper")  

  9. publicinterface TeacherMapper {  

  10. public Teacher getById(int id);  

  11. //分页查询教师信息 

  12. public List<Teacher> findTeacherByPage(  

  13.                 String sort,//排序字段 

  14.                 String dir,  //排序方向 

  15. int start, //起始记录 

  16. int limit  //记录条数 

  17.         );  

  18. }  

       按照上述的默认命名方式,MyBatis对findTeacherByPage方法的参数从左到右的默认命名依次是:sort为param1,dir为param2,start为param3,limit为param4。然后,就可以在映射文件TeacherMapper.xml里的、与此方法相对应的SQL语句中以#{参数名}的方式来使用这些名称了。如下27行所示:

 
 
  1. <?xmlversion="1.0"encoding="utf8"?>

  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  

  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  4. <!--与以前一样,namespace的值是对应的映射器接口的完整名称-->

  5. <mappernamespace="com.abc.mapper.TeacherMapper">

  6. <!--教师实体映射-->

  7. <resultMapid="supervisorResultMap"type="Teacher">

  8. <idproperty="id"/>

  9. <resultproperty="name"/>

  10. <resultproperty="gender"/>

  11. <resultproperty="researchArea"column="research_area"/>

  12. <resultproperty="title"/>

  13.             <!--collection元素映射教师的指导学生集合的属性。这里采用了  

  14.             “命名空间名.select语句id”的形式来引用StudentMapper.xml中的  

  15.             select语句getStudents。关于这种collection元素使用嵌套的  

  16.             select语句的详情,请参考笔者博客:  

  17.             http://legend2011.blog.51cto.com/3018495/985907  

  18.             -->

  19. <collectionproperty="supStudents"column="id"ofType="Student"

  20. select="com.abc.mapper.StudentMapper.getStudents"/>

  21. </resultMap>

  22. <!--param1、param2等是MyBatis对映射器方法参数的默认命名-->

  23. <selectid="findTeacherByPage"resultMap="supervisorResultMap">

  24.               select * from teacher             

  25.               order by ${param1} ${param2} limit #{param3},#{param4}  

  26. </select>

  27. </mapper>

 

      和利用注解的方式一样,在order by子句中使用#{参数名}的方式无效,读者可自行实验。所以,这里仍然使用${参数名}的方式。

      除上述改动外,程序的其他部分与上篇博文一致。运行结果如下:

       红框内是MyBatis生成的SQL语句及相关的参数start和limit的值(分别为0和2)。可以看出,order by子句引用的参数值(name,asc)已被直接放置到了SQL语句内;而应该放置参数start和limit的值的地方,却用了两个“?”占位符来代替。

      还有一种编号的方式,即把方法的参数从左到右从0开始编号,然后在SQL语句中以#{编号}的方式引用。但同样地,在order by子句中,也不能使用${编号}的方式引用相关值。在本例中,可以使用#{2}、#{3}的方式来引用方法findTeacherByPage的start和limit的值,读者可自行实验。

二、#{…}与${…}差异小议

      MyBatis官方文档(http://code.google.com/p/mybatis/wiki/faq)对两者的描述是:#{…}是一个参数标记,而${…}只是简单的字符串替换。一般而言,为避免SQL注入攻击,传递参数应使用#{…}方式,因为这样MyBatis会处理好特殊字符转义的问题;但在SQL语句的某些地方,又不能使用#{…}方式。上述文档举出的例子是不能用这种方式指定表名,而根据我们的经验,在order by子句中也不能用这种方式。从中我们可以总结出:对于诸如表名、字段名(如order by子句后的排序字段)这些表本身或其字段的名字,和SQL关键字(如order by子句后的asc关键字),是不能使用#{…}方式的,而只能使用字符串替换的${…}方式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值