Mybatis映射原理

MyBatis 的真正强大之处在于它的映射语句,这也是它的魔力所在。由于它的映射语句异常强大,映射器的 XML 文件就显得相对简单。
MyBatis 3.0 相比 2.0 版本的一个最大变化,就是支持使用接口来调用方法。
以前使用 SqlSession 通过命名空间调用 MyBatis 方法时,首先需要用到命名空间和方法id 组成的字符串来调用相应的方法 。 当参数多于 1 个的时候,需要将所有参数放到一个 Map对象中 。 通过 Map 传递多个参数,使用起来很不方便,而且还无法避免很多重复的代码。使用接口调用方式就会方便很多, MyBatis 使用 Java 的动态代理可以直接通过接口来调用 相应 的方法,不需要提供接口的实现类,更不需要在实现类中使用 SqlSess 工∞以通过命名空 间间接调用 。 另外,当有多个参数的时候,通过参数注解@ Par am 设置参数的名字省去了 手动构造 Map 参数的过程,尤其在 Spring 中使用的时候,可以配置为自动扫描所有的接口类 ,直接将接口注入需要用到的地方。

mapper文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cnpiec.ireader.dao.GetBookDataDao">
    <insert id="batchInsertBook" parameterType="Book">
        INSERT INTO BOOK (BOOKID,NAME,PARTNERNAME) VALUES
        <foreach collection="list" item="book" separator=",">
            (#{book.bookId}, #{book.name}, #{book.partnerName})
        </foreach>
    </insert>
</mapper>

需要注意的是<mapper>根标签的 name space 属性。当 Mapper 接口和 XML 文件关联的时候,命名空间口amespace 的值就需要配置成接口的全限定名称,例如 UserMapper 接口对应的 tk. mybatis . simple .mapper . UserMapper, MyBatis 内部就是通过这个值将接口和XML 关联起来的。

mybati s-config.xml 配置文件中的 mappers 元素中配置所有的 mapper ,部分配置代码如下 。

<mappers>
    <mapper resource=” tk/mybatis/simple/mapper/CountryMapper.xml ” / >
    <mapper resource=” tk/mybatis/simple/mapper/UserMapper . xml ” / >
    <mapper resource=” tk/mybatis/simple/mapper/RoleMapper.xml ” />
    <mapper resource=” tk/mybatis/simple/mapper/PrivilegeMapper . xml ” />
    <mapper resource=” tk/mybatis/simple/mapper/UserRoleMapper . xml ” />
    <mapper resource=” tk/mybatis/simple/mapper / RolePrivilegeMapper.xml ” />
</mappers>

更简单的配置方式,代码如下

<mappers>
    <package name= ” tk.mybatis . simple . mapper ” />
</mappers>

这种配置方式会先查找 tk.mybatis.simple . mapper 包下所有的接口,循环对接口进行如下操作。这种配置方式会先查找 tk.mybatis.simple . mapper 包下所有的接口,循环对接口进行判断接口对应的命名 空 间是否己经存在,如果不存在就抛出异常,存在就继续进行接下来的操作。加载接口对应的却也映射文件 , 将接口全限定名转换为路径.
为什么 Mapper 接口没有实现类却能被正常调用呢?
这是因为MyBaits 在 Mapper 接口上使用了动态代理的一种非常规的用法,熟悉这动态代理的用法不仅有利于理解 MyBatis 接口和 XML 的关系,还能开阔思路 。

从代理类中可以看到,当调用 一个接口的方法时,会先通过接口的全限定名称和当前调用的方法名的组合得到一个方法 id,这个 id 的值就是映射 XML 中口arnespa ce 和具体方法 id的组合。所以可以在代理方法中使用 sqlSession 以命名空间的方式调用方法。通过这种方式可以将接口和 XML 文件中的方法关联起来。这种代理方式和常规代理的不同之处在于,这里没有对某个具体类进行代理,而是通过代理转化成了对其他代码的调用。

由于方法参数和返回值存在很多种情况,因此 MyBatis 的内部实现会比上面的逻辑复杂得多,正是因为 MyBatis 对接口动态代理的实现,我们在使用接口方式的时候才会如此容易。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值