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

一、具体步骤

对于映射器中的方法,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多参数传递之混合方式

【MyBatis学习笔记】系列之十六:Spring声明式事务管理示例

【MyBatis学习笔记】系列之十七:MyBatis多对多保存示例

【MyBatis学习笔记】系列之十八:MyBatis多对多关联查询示例

【MyBatis学习笔记】系列之十九:如何在MyBatis-3.2.7中使用Log4j2 rc2

MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(一)

MyBatis中如何通过继承SqlSessionDaoSupport来编写DAO(二)

转载于:https://blog.51cto.com/legend2011/1024869

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

  1. 逆向工程---Mybatis学习笔记(十二)

    使用官方网站的mapper自动生成工具mybatis-generator-core-1.3.2来生成po类和mapper映射文件. 第一步:mapper生成配置文件: 在generatorConfig ...

  2. MyBatis多参数传递之Map方式示例——MyBatis学习笔记之十三

    前面的文章介绍了MyBatis多参数传递的注解.参数默认命名等方式,今天介绍Map的方式.仍然以前面的分页查询教师信息的方法findTeacherByPage为例(示例源代码下载地址:http://d ...

  3. MyBatis多参数传递之混合方式——MyBatis学习笔记之十五

    在本系列文章的<MyBatis多参数传递之Map方式示例>一文中,网友mashiguang提问如下的方法如何传递参数:public List findStudents(Map condit ...

  4. Spring Security技术栈学习笔记(十四)使用Spring Social集成QQ登录验证方式

    上一篇文章<Spring Security技术栈开发企业级认证与授权(十三)Spring Social集成第三方登录验证开发流程介绍>主要是介绍了OAuth2协议的基本内容以及Spring ...

  5. QT学习笔记(十):通用算法示例

    QT学习笔记(十):通用算法示例 std是C++标准库统一使用的命名空间(namespace)的名称,C++标准库中的名字全部都在std这个命名空间中,std也就是英文"standard&q ...

  6. html表单中默认选中的值,前端学习笔记一一HTML表单标签(form)

    form表单细节 一.表单 1.表单 标签用于为用户输入创建 HTML 表单 2.表单能够包含 input 元素,比如文本字段.复选框.单选框.提交按钮等等. 3.表单还可以包含 menus.text ...

  7. python表单提交的两种方式_Flask框架学习笔记之表单基础介绍与表单提交方式

    本文实例讲述了Flask框架学习笔记之表单基础介绍与表单提交方式.分享给大家供大家参考,具体如下: 表单介绍 表单是HTML页面中负责数据采集功能的部件.由表单标签,表单域和表单按钮组成.通过表单,将 ...

  8. linux pipe 命名管道,linux 进程学习笔记-named pipe (FIFO)命名管道

    与"无名管道"不同的是,FIFO拥有一个名称来标志它,所谓的名称实际上就是一个路径,比如"/tmp/my_fifo",其对应到磁盘上的一个管道文件,如果我们用f ...

  9. MyBatis多对多关联查询示例——MyBatis学习笔记之十八

    MyBatis系列的上一篇博客发表时,笑笑还没有出生.转眼间八个月过去了,他已经是个大宝宝了.这么长时间未更新MyBatis系列的博客,想来真是罪过.不过有了宝宝之后,的确会分散自己很大一部分精力. ...

  10. 查询缓存---Mybatis学习笔记(十)

    mybatis缓存介绍 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. 如下图,是mybatis一级缓存和二级缓存的区别图解: Mybatis一级缓存的作用域是同一个SqlSessio ...

最新文章

  1. git放弃修改放弃增加文件
  2. 插入,冒泡,选择,快速排序,二分查找
  3. 045_Collapse折叠面板
  4. jQuery工作原理解析以及源代码示例
  5. cmd打开java文件夹_Java用CMD打开指定文件和文件夹
  6. el-select 多选取值_AR? ATOS?? DRA???这些都是英语阅读分级?聊一聊我知道的兰斯值(lexile measure))...
  7. haproxy透传用户ip-方法和原理
  8. Eight HDU - 1043(八数码+搜索)
  9. 大厂首发:338页网易Java面试真题解析火爆全网
  10. ASP.NET笔记(三)
  11. 得天独厚的生态优势_抚仙湖畔崛起一座生态城 全国党媒聚焦澄江生态文明建设...
  12. 基于MODIS的锡林郭勒植被变化监测(附练习数据下载)
  13. YARN学习总结-第九节-YARN-Web-App-Proxy
  14. 幼麟棋牌技术分享系列:H5棋牌游戏加载速度优化
  15. STM32MP157C-DK2->Develop on Arm® Cortex®-A7之 C语言开发LED例程
  16. 关于 Linux 中 firewalld 的一些笔记整理
  17. 丘成桐大学生数学竞赛2014年分析与方程个人赛试题第一题另解
  18. MBA案例分析(沟通)
  19. 如何去除win10此电脑(这台电脑)首页的六个文件夹?
  20. 【愚公系列】2022年04月 微信小程序-项目篇(公交查询)-06站点查询

热门文章

  1. 【转】Linux配置使用SSH Key登录并禁用root密码登录
  2. Redis:四、jedis连接redis服务器
  3. Linux启动tomcat带控制台
  4. 滴滴passport设计之道:帐号体系高可用的7条经验
  5. 字符串低位优先排序真的只能排序字符串相同的字符么?
  6. 最短路径算法之四——SPFA算法
  7. Silverlight 2初尝及我的例子:Fanfou.com客户端——EatSilverlight
  8. .NET 指南:构造器的设计
  9. Jquery自定义$的名称(自定义变量)
  10. [bzoj2115][Wc2011] Xor