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

简介:

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

一、具体步骤

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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行所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<? 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子句中使用#{参数名}的方式无效,读者可自行实验。所以,这里仍然使用${参数名}的方式。

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

003505524.png

       红框内是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关键字),是不能使用#{…}方式的,而只能使用字符串替换的${…}方式。










本文转自 NashMaster2011 51CTO博客,原文链接:http://blog.51cto.com/legend2011/1024869,如需转载请自行联系原作者
目录
相关文章
|
SQL Java 数据库连接
Mybatis实战练习六【批量删除&Mybatis参数传递】(下)
Mybatis实战练习六【批量删除&Mybatis参数传递】
|
SQL 存储 Java
Mybatis实战练习六【批量删除&Mybatis参数传递】(上)
Mybatis实战练习六【批量删除&Mybatis参数传递】
|
Java 数据库连接 mybatis
MyBatis参数传递
MyBatis参数传递
207 0
|
SQL Java 关系型数据库
MyBatisPlus学习笔记(SpringBoot版)
MyBatisPlus学习笔记(SpringBoot版)
854 0
|
SQL Java 关系型数据库
|
SQL Java 关系型数据库
|
11月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1609 1
Spring boot 使用mybatis generator 自动生成代码插件
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
1123 0