目录
概述
Mapper映射器是MyBatis中最重要的文件,文件中包含乙组SQL语句(例如查询、添加、删除、修改),这些语句称为映射语句或者SQL映射语句。
作用
一个完整的映射器有Java接口和XML文件(或注解)共同组成,它的作用包括:
- 定义参数类型
- 配置缓存
- 提供SQL语句和动态SQL
- 定义查询结果和POJO的映射关系
Mapper文件的引入
在配置文件中,<Mapper>元素用于指定MyBatis映射文件的位置,一般可以使用以下4种方法引入映射器文件:
1.使用类路径引入
<mapper>
<mapper resourse = "com/itheima/mapper/UserMapper.xml"/>
</mapper>
2.使用本地文件路径引入
<mapper>
<mapper url = "file:///D:/com/itheima/mapper/UserMapper.xml"/>
<mapper/>
3.使用接口类引入
<mapper>
<mapper class = "com.itheima.mapper.UserMapper"/>
<mapper/>
4.使用包名引入
<mapper>
<package name = "com.itheima.mapper"/>
<mapper/>
映射文件
主要元素
元素名称 | 描述 | 备注 |
mapper | 映射文件的根节点,只有 |
|
select | 查询语句,最常用、最复杂的元素之一 | 可以自定义参数,返回结果集等 |
insert | 插入语句 | 执行后返回一个整数,代表插入的条数 |
update | 更新语句 | 执行后返回一个整数,代表更新的条数 |
delete | 删除语句 | 执行后返回一个整数,代表删除的条数 |
parameterMap | 定义参数映射关系 | 即将被删除的元素,不建议使用 |
sql | 允许定义一部分的 SQL,然后在各个地方引用它 | 例如,一张表列名,我们可以一次定义,在多个 SQL 语句中使用 |
resultMap | 用来描述数据库结果集与对象的对应关系,它是最复杂、最强大的元素 | 提供映射规则 |
cache | 配置给定命名空间的缓存 | - |
cache-ref | 其它命名空间缓存配置的引用 | - |
select标签
在MyBatis中,select标签用于映射查询操作。
<select id="selectWebsiteListLikeName"
resultType="com.apesource.entity.Website"
parameterType="string">
SELECT id,NAME,url FROM website WHERE NAME LIKE CONCAT ('%',#{name},'%')
</select>
以上是一个id为selectWebsiteListLikeName的映射语句,参数类型为String,返回结果类型为Website。执行SQL语句时可以定义参数,参数可以是一个简单地参数类型,例如int、float、String;也可以是一个复杂的参数类型,例如JavaBean、Map等。MyBatis提供了强大的映射规则,执行SQL后,MyBatis会将结果集自动映射到指定的JavaBean中。
结果集自动映射规则
为了使数据库的查询结果和返回值类型中的属性能够自动匹配,通常会对
MySQL
数据库表字段名和JavaBean
采用同一套命名规则,即 Java 命名驼峰规则,这样就不需要再做映射了(数据库表字段名和属性名不一致时需要手动映射)。
select标签常用属性
属性名称 | 描 述 | 备注 |
id | 它和 | 如果命名空间+id不唯一,那么 MyBatis 会抛出异常 |
parameterType | 表示传入 | 支持基本数据类型和 JavaBean、Map 等复杂数据类型 |
resultType |
| - |
resultMap | 它是映射集的引用,与 <resultMap> 元素一起使用,返回时可以使用 | 是 MyBatis 最复杂的元素,可以配置映射规则、级联、typeHandler 等 |
传递多个参数
现在需要根据url和name来模糊查询网站信息,显然这涉及到了两个参数。给映射器传递多个参数分为以下三种方法。
1.使用Map传递参数
使用MyBatis提供的Map接口作为参数。
在WebsiteMapper.xml中定义<select>节点
<!-- 根据name和url模糊查询网站信息 -->
<select id="selectWebsiteByMap"
resultType="com.apesource.entity.Website"
parameterType="map">
SELECT id,NAME,url FROM website
WHERE name LIKE CONCAT ('%',#{name},'%')
AND url LIKE CONCAT ('%',#{url},'%')
</select>
在WebsiteMapper接口中定义方法selectWebsiteByMap
public List<Website> selectWebsiteByMap(Map<String, String> params);
2. 使用注解传递参数
使用MyBatis的注解@Param()传递参数
<!-- 根据name和url模糊查询网站信息 -->
<select id="selectWebsiteByAn" resultType="com.apesource.entity.Website">
SELECT id,NAME,url FROM website
WHERE name LIKE CONCAT ('%',#{name},'%')
AND url LIKE CONCAT ('%',#{url},'%')
</select>
在WebsiteMapper接口中定义方法selectWebsiteByAn()
public List<Website> selectWebsiteByAn(@Param("name") String name, @Param("url") String url);
3.使用JavaBean传递参数
在参数过多的情况下,MyBatis允许组织一个JavaBean,通过简单地setter和getter方法设置参数,提高可读性。
<!-- 根据name和url模糊查询网站信息 -->
<select id="selectWebsiteByAn" resultType="com.apesource.entity.Website">
SELECT id,NAME,url FROM website
WHERE name LIKE CONCAT ('%',#{name},'%')
AND url LIKE CONCAT ('%',#{url},'%')
</select>
public List<Website> selectWebsiteByAn(Website website);
区别
- 使用Map传递参数会导致业务可读性的丧失,继而导致后续扩展和维护的困难
- 使用@Param注解传递参数会受到参数个数的影响。当n<=5时,它是最佳的传参方式,因为它更加直观,当n>5时,多个参数将给调用带来困难
- 当参数个数大于5个时,建议使用JavaBean方式
编写mapper接口需要遵循的原则
- mapper.xml文件中的namespace的名称要与mapper接口的地址相同
- mapper接口中的方法名称要与mapper/xml中的statement id的名称相同
- mapper接口中方法的输入参数的类型要与mapper.xml中statement的ParameterType指定的类型一致
- mapper接口中方法的返回值类型要与mapper.xml中statement的ResultType指定的类型一致
注意:
由于应声文件中statement的parameterType配置只能有一个,所以Mapper接口中发方法的参数只能有一个。
由于DAO层的代码是被业务层调用的,业务层的方法参数不可能只有一个(考虑到业务层逻辑的扩展),所以当业务层调用DAO层的时候,需要将参数适当包装成POJO对象,去调用DAO层的代码。
所以,系统中需要定义适当的POJO类型对象,作为持久层方法的输入参数。