MyBatis多参数传递之默认命名方式示例——MyBatis学习笔记之十二 推荐
2012-10-14 00:51
761 查看
上文讲到了MyBatis多参数传递的注解方式,今天看另外一种方式,也就是参数默认命名的方式。还是以上文的分页查询教师信息的方法findTeacherByPage为例。
一、具体步骤
对于映射器中的方法,MyBatis默认从左到右给方法的参数命名为param1、param2…,依次类推。我们可以无需借助注解,直接在SQL语句中使用这些默认名称。
首先去掉@Param注解的TeacherMapper.java如下所示(完整源码下载地址:http://down.51cto.com/data/539217):
按照上述的默认命名方式,MyBatis对findTeacherByPage方法的参数从左到右的默认命名依次是:sort为param1,dir为param2,start为param3,limit为param4。然后,就可以在映射文件TeacherMapper.xml里的、与此方法相对应的SQL语句中以#{参数名}的方式来使用这些名称了。如下第25行所示:
和利用注解的方式一样,在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关键字),是不能使用#{…}方式的,而只能使用字符串替换的${…}方式。
猛戳这里全面系统地学习MyBatis 3
MyBatis技术交流群:188972810,或扫描二维码:
【MyBatis学习笔记】系列之预备篇一:ant的下载与安装
【MyBatis学习笔记】系列之预备篇二:ant入门示例
【MyBatis学习笔记】系列之一:MyBatis入门示例
【MyBatis学习笔记】系列之二:MyBatis增删改示例
【MyBatis学习笔记】系列之三:MyBatis的association示例
【MyBatis学习笔记】系列之四:MyBatis association的两种形式
【MyBatis学习笔记】系列之五:MyBatis与Spring集成示例
【MyBatis学习笔记】系列之六:MyBatis与Spring集成示例续
【MyBatis学习笔记】系列之七:MyBatis一对多双向关联
【MyBatis学习笔记】系列之八:MyBatis MapperScannerConfigurer配置
【MyBatis学习笔记】系列之九:MyBatis collection的两种形式
【MyBatis学习笔记】系列之十:MyBatis日志之Log4j示例
【MyBatis学习笔记】系列之十一:MyBatis多参数传递之注解方式示例
【MyBatis学习笔记】系列之十二:MyBatis多参数传递之默认命名方式示例
【MyBatis学习笔记】系列之十三:MyBatis多参数传递之Map方式示例
【MyBatis学习笔记】系列之十四:MyBatis中的N+1问题
【MyBatis学习笔记】系列之十五:MyBatis多参数传递之混合方式
[b]【MyBatis学习笔记】系列之十六:Spring声明式事务管理示例[/b]
【MyBatis学习笔记】系列之十七:MyBatis多对多保存示例
【MyBatis学习笔记】系列之十八:MyBatis多对多关联查询示例
【MyBatis学习笔记】系列之十九:如何在MyBatis-3.2.7中使用Log4j2 rc2
MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(一)
MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(二)
一、具体步骤
对于映射器中的方法,MyBatis默认从左到右给方法的参数命名为param1、param2…,依次类推。我们可以无需借助注解,直接在SQL语句中使用这些默认名称。
首先去掉@Param注解的TeacherMapper.java如下所示(完整源码下载地址:http://down.51cto.com/data/539217):
package com.abc.mapper; import com.abc.domain.Teacher; import org.springframework.stereotype.Component; import java.util.List; //@Component指定映射器名称为myTeacherMapper //相关内容,可参考笔者博客: //http://legend2011.blog.51cto.com/3018495/980150 @Component("myTeacherMapper") public interface TeacherMapper { public Teacher getById(int id); //分页查询教师信息 public List<Teacher> findTeacherByPage( String sort,//排序字段 String dir, //排序方向 int start, //起始记录 int limit //记录条数 ); }
按照上述的默认命名方式,MyBatis对findTeacherByPage方法的参数从左到右的默认命名依次是:sort为param1,dir为param2,start为param3,limit为param4。然后,就可以在映射文件TeacherMapper.xml里的、与此方法相对应的SQL语句中以#{参数名}的方式来使用这些名称了。如下第25行所示:
<?xml version="1.0" encoding="utf8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--与以前一样,namespace的值是对应的映射器接口的完整名称--> <mapper namespace="com.abc.mapper.TeacherMapper"> <!--教师实体映射--> <resultMap id="supervisorResultMap" type="Teacher"> <id property="id"/> <result property="name"/> <result property="gender"/> <result property="researchArea"column="research_area"/> <result property="title"/> <!--collection元素映射教师的指导学生集合的属性。这里采用了 “命名空间名.select语句id”的形式来引用StudentMapper.xml中的 select语句getStudents。关于这种collection元素使用嵌套的 select语句的详情,请参考笔者博客: http://legend2011.blog.51cto.com/3018495/985907 --> <collection property="supStudents" column="id" ofType="Student" select="com.abc.mapper.StudentMapper.getStudents"/> </resultMap> <!--param1、param2等是MyBatis对映射器方法参数的默认命名--> <select id="findTeacherByPage" resultMap="supervisorResultMap"> select * from teacher order by ${param1} ${param2} limit #{param3},#{param4} </select> </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关键字),是不能使用#{…}方式的,而只能使用字符串替换的${…}方式。
猛戳这里全面系统地学习MyBatis 3
MyBatis技术交流群:188972810,或扫描二维码:
【MyBatis学习笔记】系列之预备篇一:ant的下载与安装
【MyBatis学习笔记】系列之预备篇二:ant入门示例
【MyBatis学习笔记】系列之一:MyBatis入门示例
【MyBatis学习笔记】系列之二:MyBatis增删改示例
【MyBatis学习笔记】系列之三:MyBatis的association示例
【MyBatis学习笔记】系列之四:MyBatis association的两种形式
【MyBatis学习笔记】系列之五:MyBatis与Spring集成示例
【MyBatis学习笔记】系列之六:MyBatis与Spring集成示例续
【MyBatis学习笔记】系列之七:MyBatis一对多双向关联
【MyBatis学习笔记】系列之八:MyBatis MapperScannerConfigurer配置
【MyBatis学习笔记】系列之九:MyBatis collection的两种形式
【MyBatis学习笔记】系列之十:MyBatis日志之Log4j示例
【MyBatis学习笔记】系列之十一:MyBatis多参数传递之注解方式示例
【MyBatis学习笔记】系列之十二:MyBatis多参数传递之默认命名方式示例
【MyBatis学习笔记】系列之十三:MyBatis多参数传递之Map方式示例
【MyBatis学习笔记】系列之十四:MyBatis中的N+1问题
【MyBatis学习笔记】系列之十五:MyBatis多参数传递之混合方式
[b]【MyBatis学习笔记】系列之十六:Spring声明式事务管理示例[/b]
【MyBatis学习笔记】系列之十七:MyBatis多对多保存示例
【MyBatis学习笔记】系列之十八:MyBatis多对多关联查询示例
【MyBatis学习笔记】系列之十九:如何在MyBatis-3.2.7中使用Log4j2 rc2
MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(一)
MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(二)
相关文章推荐
- MyBatis多参数传递之Map方式示例——MyBatis学习笔记之十三 推荐
- C#.NET学习笔记---C#中方法参数的传递方式: 值类型(默认),ref类型,out类型和params类型
- MyBatis多参数传递之默认命名方式示例——MyBatis学习笔记之十二
- mybatis 参数传递之默认命名
- MyBatis多参数传递之Map方式示例——MyBatis学习笔记之十三
- MyBatis多参数传递之Map方式示例
- MyBatis入门示例——MyBatis学习笔记之一 推荐
- C++函数的参数及其传递方式学习笔记
- MyBatis多参数传递之注解方式示例--转
- SQL学习笔记[5] - 通过分隔符解析方式实现向SQL存储过程传递数组参数
- MyBatis多参数传递之注解方式示例——MyBatis学习笔记之十一 推荐
- mybatis学习之参数传递方式
- MyBatis多参数传递之Map方式示例
- [学习笔记]C#中out与ref参数传递方式
- java学习笔记3--参数的传递方式
- 学习笔记--静态方法调用,多肽,操作符重载,3中参数传递方式,二维数组与交错数组
- ant入门示例——mybatis学习笔记之预备篇(二) 推荐
- MyBatis多参数传递之注解方式示例
- Mybatis学习笔记二:以接口方式编程
- Java学习笔记(十)——方法的参数传递机制