MyBatis关于Mapper配置文件知识集合

(1)MyBatis多参数传递之默认命名方式

对于映射器中的方法,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子句中使用#{参数名}的方式无效,读者可自行实验。所以,这里仍然使用${参数名}的方式。

(2)MyBatis多参数传递之Map方式

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

首先修改映射器接口TeacherMapper中的findTeacherByPage方法如下:


1

2

//分页查询教师信息

public List<Teacher> findTeacherByPage(Map<String, Object> map);

相应地,这里用到了Map接口,就应该引入此接口:import java.util.Map。

在执行类CollectionDemo中,调用findTeacherByPage方法的相关代码如下:


1

2

3

4

5

6

7

8

9

10

11

Map<String, Object> params = new HashMap<String, Object>();

//以name字段升序排序,

params.put("sort""name");

params.put("dir""asc");

//查询结果从第0条开始,查询2条记录

params.put("start"0);

params.put("limit"2);

//查询职称为教授或副教授的教师

params.put("title""%教授");

//分页查询教师信息

List<Teacher> teachers = mapper.findTeacherByPage(params);

可以看出,我们先把参数放在了一个Map中,这样我们就可以在相应的SQL语句中以#{…}的形式引用这些参数了。如下所示:


1

2

3

4

5

<select id="findTeacherByPage" resultMap="supervisorResultMap"

parameterType="java.util.Map">

select * from teacher where title like #{title}

order by ${sort} ${dir} limit #{start},#{limit}

</select>

与以前一样,在order by子句中应使用${…}的方式。实际上,这里的parameterType="java.util.Map"可以不要。

(3)MyBatis多参数传递之混合方式

网友mashiguang提问如下的方法如何传递参数:public List findStudents(Map conditions, int page, int pageSize)。这是一种混合形式,亦即既有Map类型的参数,也有类似int这种普通类型的参数。经过一番摸索,笔者还比较顺利地找到了这种情况的处理方法。

其实也很简单。在默认命名方式(MyBatis多参数传递之默认命名方式示例)一文中,介绍了MyBatis对参数的默认命名,这种命名在这种情况下依然有效。我们需要做的,就是如何根据这个命名读出Map中的参数值。这里就采用这种方式来实现教师分页查询。先修改映射器接口(TeacherMapper.java)中的教师分页查询方法的声明如下(完整源码下载:http://down.51cto.com/data/742758):


1

2

3

4

5

6

//分页查询教师信息

public List<Teacher> findTeacherByPage(

Map params, //查询条件

int start, //起始记录

int limit  //记录条数

);

(代码1)

那么MyBatis将会对此方法的三个参数依次命名为param1、param2和param3,其中第一个参数为Map类型,后两个参数为int类型。

执行类(CollectionDemo.java)中的查询代码片段如下:


1

2

3

4

5

6

7

8

9

10

11

12

Map<String, Object> params =

new HashMap<String, Object>();

//以name字段升序排序,

params.put("sort""name");

params.put("dir""asc");

//查询职称为教授或副教授的教师

params.put("title""%教授");

//查询教师分页信息

List<Teacher> teachers =

//以name字段升序排序,从第0条记录开始查询。

//查询2条记录

mapper.findTeacherByPage(params,02);

(代码2)

相应的映射配置(TeacherMapper.xml)文件片段如下:


1

2

3

4

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

select * from teacher where teacher.title like

#{param1.title} order by ${param1.sort} ${param1.dir} limit #{param2},#{param3}

</select>

(代码3)

在以上的映射文件中,使用#{param1.title}的形式就能访问Map中title属性的值。当然,在order by子句中应使用${param1.sort}的形式(可参见本系列博文中的“MyBatis多参数传递之注解方式示例”一文,第二部分“可能会遇到的错误”第一个就是关于order by的。不过经笔者验证,在本例中使用“#”也是可以的)。由此我们可以总结出,我们使用#{参数默认命名.属性名}的形式,就可以在映射文件访问Map参数的属性值。

时间: 2024-10-03 13:13:49

MyBatis关于Mapper配置文件知识集合的相关文章

mybatis实现mapper配置文件热部署

工作用到mybatis,同事说每次修改sql后,都要重启,因为mybatis的mapper文件默认只在启动时加载到缓存,改动后不会自动加载,于是研究了下mybatis文件的加载,分享如下: 实现思路:使用定时器定时扫描mapper文件的改动,如果有改动则调用mapper文件的加载方法XMLMapperBuilder.parse(). 一.写一个重新加载mapper文件的java类  首先需要构建一个sqlSessionFactory对象,并指定mybatis的Configuration.xml配

MyBatis的Mapper配置文件的parameterType用法

在MyBatis的select.insert.update.delete这些元素中都提到了parameterType这个属性.MyBatis现在可以使用的parameterType有基本数据类型和JAVA复杂数据类型 基本数据类型:包含int,String,Date等.基本数据类型作为传参,只能传入一个.通过#{参数名} 即可获取传入的值 复杂数据类型:包含JAVA实体类.Map.通过#{属性名}或 #{map的KeyName}即可获取传入的值 基本数据类型参数示例: 根据班级ID查询教师列表

mybatis 的mapper配置文件sql语句中, 有时用到 大于, 小于等等

一, 用<![CDATA[   ]]>标识,例如: <if test="create_timeStart != null and create_timeStart != ''"> <![CDATA[ AND create_time >= ${create_timeStart}]]> </if> 二,转义 < >  也可以>=

MyBatis之高级关联和集合映射(二、嵌套查询和嵌套结果小案例)

三张表,通过班级 clsId=3001 查找班级和学生的信息 1. 建表 表结构如下 create table student ( stuId number(4) primary key, stuName varchar2(20) not null, stuSex varchar2(4), stuBirthday date, classId number(4) ); create table classes ( clsId number(4) primary key, clsName varch

mybatis入门-mapper代理原理

原始dao层开发 在我们用mybatis开发了第一个小程序后,相信大家对于dao层的开发其实已经有了一个大概的思路了.其他的配置不用变,将原来的test方法,该为dao的方法,将原来的返回值,直接在dao层进行一下接收就可以了.依然是老一套,先是大框架,然后写配置文件及UserMapper.xml文件这一系列的操作.如果不明白的,请参考本人博客<入门第一个程序>. 我们需要做的就是,首先建立一个会话工厂(SqlSessionFactory),然后用会话工厂创建会话(SqlSession).然后

mybatis入门_配置文件的配置

一.全局配置文件配置 1.1 properties标签 Properties标签可以用来加载配置文件.例如,我们可以将数据库的连接信息放入到一个配置文件(db.properties中..) 下为db.properties db.driverClass=com.mysql.jdbc.Driver db.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8 db.username=root db.

Spring Boot MyBatis 通用Mapper插件集成

看本文之前,请确保你已经在SpringBoot中集成MyBatis,并能正常使用.如果没有,那么请先移步 http://blog.csdn.net/catoop/article/details/50553714 做了解后,再按本文步骤操作. 使用MyBatis在我们通过xml集中配置SQL,并通过创建接口Mapper文件来完成持久化DAO层(mybatis内部使用的是动态代理,所以我们不需要自己编写实现类). 然而在实际开发中,单表操作非常多,如果你也想像JPA.JDBC那样做一个所谓的Base

Mybatis通用Mapper

转:http://blog.csdn.net/isea533/article/details/41457529 极其方便的使用Mybatis单表的增删改查 项目地址:http://git.oschina.net/free/Mapper 优点? 不客气的说,使用这个通用Mapper甚至能改变你对Mybatis单表基础操作不方便的想法,使用它你能简单的使用单表的增删改查,包含动态的增删改查. 程序使用拦截器实现具体的执行Sql,完全使用原生的Mybatis进行操作. 你还在因为数据库表变动重新生成x

MyBatis之高级关联和集合映射(二、嵌套结果综合案例)

接上一篇,这一次,只讲嵌套结果,同样是上一次的三张表 上次忘了介绍 resultMap,补上: resultMap概念视图 constructor – 类在实例化时,用来注入结果到构造方法中 idArg – ID参数:标记结果作为ID可以帮助提高整体效能 arg – 注入到构造方法的一个普通结果 id – 一个ID结果:标记结果作为ID可以帮助提高整体效能 result – 注入到字段或JavaBean属性的普通结果 association – 一个复杂的类型关联:许多结果将包成这种类型 col