【Java ee】MyBatis核心配置——Mapper元素

目录

概述

作用

Mapper文件的引入

1.使用类路径引入

 2.使用本地文件路径引入

3.使用接口类引入

4.使用包名引入

映射文件

主要元素

select标签

select标签常用属性

传递多个参数

1.使用Map传递参数

2. 使用注解传递参数

3.使用JavaBean传递参数

区别

编写mapper接口需要遵循的原则


概述

        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

映射文件的根节点,只有 namescape 一个属性

namescape 作用如下:

  • 用于区分不同的 mapper,全局唯一
  • 绑定DAO接口,即面向接口编程。
  • namescape 绑定某一接口后,可以不用写该接口的实现类,MyBatis 会通过接口的完整限定名查找到对应的 mapper 配置来执行 SQL 语句。因此 namescape 的命名必须要跟接口同名。

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

它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用

如果命名空间+id不唯一,那么 MyBatis 会抛出异常

parameterType

表示传入 SQL 语句传入参数类型的全限定名或别名。它是一个可选属性,MyBatis 能推断出具体传入语句的参数

支持基本数据类型和 JavaBean、Map 等复杂数据类型

resultType

SQL 语句执行后返回的类型(全限定名或者别名)。如果是集合类型,返回的是集合元素的类型,返回时可以使用 resultType resultMap 之一

-

resultMap

它是映射集的引用,与 <resultMap> 元素一起使用,返回时可以使用 resultType 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);

区别

  1. 使用Map传递参数会导致业务可读性的丧失,继而导致后续扩展和维护的困难
  2. 使用@Param注解传递参数会受到参数个数的影响。当n<=5时,它是最佳的传参方式,因为它更加直观,当n>5时,多个参数将给调用带来困难
  3. 当参数个数大于5个时,建议使用JavaBean方式

编写mapper接口需要遵循的原则

  1. mapper.xml文件中的namespace的名称要与mapper接口的地址相同
  2. mapper接口中的方法名称要与mapper/xml中的statement id的名称相同
  3. mapper接口中方法的输入参数的类型要与mapper.xml中statement的ParameterType指定的类型一致
  4. mapper接口中方法的返回值类型要与mapper.xml中statement的ResultType指定的类型一致

注意:

        由于应声文件中statement的parameterType配置只能有一个,所以Mapper接口中发方法的参数只能有一个。

        由于DAO层的代码是被业务层调用的,业务层的方法参数不可能只有一个(考虑到业务层逻辑的扩展),所以当业务层调用DAO层的时候,需要将参数适当包装成POJO对象,去调用DAO层的代码。

        所以,系统中需要定义适当的POJO类型对象,作为持久层方法的输入参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值