目录

概述

映射器是MyBatis中最核心的组件之一,在MyBatis 3之前,只支持xml映射器,即:所有的SQL语句都必须在xml文件中配置。而从MyBatis 3开始,还支持接口映射器,这种映射器方式允许以Java代码的方式注解定义SQL语句,非常简洁。

XML映射器

xml映射器是MyBatis原生支持的方式,功能非常强大。

定义xml映射器

xml映射器支持将SQL语句编写在xml格式的文件中。

<?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="org.chench.test.mybatis.mapper">
<select id="selectOneTest" resultType="org.chench.test.mybatis.model.Test">
select * from test where id = #{id}
</select>
</mapper>

配置xml映射器

对于MyBatis是独立使用还是与Spring框架集成这2种不同的场景,可以使用2种可选的方式注册xml映射器。

  • 独立使用MyBatis

独立使用时注册xml映射器只能在MyBatis配置文件中(如:mybatis-config.xml)通过mapper节点实现。

<configuration>
<mappers>
<!-- 注册xml映射器: 2种方式 -->
<!-- 方式一: 使用相对于类路径的资源引用 -->
<mapper resource="org/chench/test/mybatis/mapper/xml/TestMapper.xml"/> <!-- 方式二: 使用完全限定资源定位符(URL) -->
<!--<mapper url="file:///var/config/TestMapper.xml" />-->
</mappers>
</configuration>
  • 在Spring框架中集成MyBatis

在Spring框架中集成MyBatis时,注册xml映射器有2种可选的方式:既可以在MyBatis配置文件中(如:mybatis-config.xml)配置,也可以直接在SqlSessionFactoryBean中通过属性mapperLocations进行注册。

(1)将xml映射器注册放在MyBatis配置文件中(如:mybatis-config.xml),但是此时必须在SqlSessionFactoryBean中通过属性configLocation指定MyBatis配置文件的位置。

<!-- 配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 指定MyBatis配置文件(只支持类路径,典型的值为"WEB-INF/mybatis-configuration.xml") -->
<property name="configLocation" value="mybatis-config.xml"/>
</bean>

(2)在SqlSessionFactoryBean中通过属性mapperLocations进行注册xml映射器。

<!-- 配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 注册xml映射器 -->
<property name="mapperLocations" value="classpath*:org/chench/test/mybatis/mapper/xml/**/*.xml"/>
</bean>

使用xml映射器

对于xml映射器的使用方式,如果使用SqlSession进行调用,独立使用或者在Spring框架中集成基本上是一致的。需要注意的是:当MyBatis在Spring框架中集成使用时,不需要直接从sqlSessionFactory中获取sqlSession对象,而是可以使用spring管理的sqlSession对象。另外当在Spring框架中集成MyBatis时,还可以直接通过接口使用xml映射器。

  • 独立使用MyBatis

独立使用MyBatis时,对于xml映射器只能使用SqlSession进行调用。

// 从类路径下的xml配置中构建SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 从sqlSessionFactory中获取sqlSession
// SqlSession的作用域最好是请求或方法域,且在使用完毕之后及时释放资源,而且一定要确保资源得到释放
SqlSession sqlSession = sqlSessionFactory.openSession();
// 从xml映射配置中查询
Test test = sqlSession.selectOne("org.chench.test.mybatis.mapper.selectOneTest", 1);
sqlSession.close();
  • 在Spring框架中集成MyBatis

(1)使用SqlSession调用xml映射器,方式与独立使用MyBatis时基本一致,只是获取SqlSession实例的方式不同。

// 启动spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("mybatis-spring.xml");
// 使用xml映射器
// 不需要直接从sqlSessionFactory中获取sqlSession对象,而是可以使用spring管理的sqlSession对象
// SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) context.getBean("sqlSessionFactory");
// SqlSession sqlSession = sqlSessionFactory.openSession();
// Test test = sqlSession.selectOne("org.chench.test.mybatis.mapper.selectOneTest", 1); // 直接使用spring提供的sqlSession
SqlSession sqlSession = (SqlSession) context.getBean("sqlSession");
Test test = sqlSession.selectOne("org.chench.test.mybatis.mapper.selectOneTest", 1);

此时,需要在Spring框架中注入SqlSession实例。

<!-- 在Spring框架中注入SqlSession实例-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>

(2)使用接口调用xml映射器

当在Spring框架中集成MyBatis时,对于xml映射器的使用除了可以通过SqlSession实例进行调用,还可以直接通过接口进行调用。注意:此时在定义Java接口和注册xml映射器时需要遵循一定的约定。

首先,定义的Java接口必须在org.mybatis.spring.mapper.MapperScannerConfigurer的属性basePackage指定的包或者子包下,如下所示:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.chench.test.mybatis.mapper.impl"/>
</bean>

org.mybatis.spring.mapper.MapperScannerConfigurer由Spring框架注册,并设置basePackage属性值为org.chench.test.mybatis.mapper.impl,那么对应的Java接口就只能定义在Java包org.chench.test.mybatis.mapper.impl下,并通过Spring框架注册Bean,如下所示:

// Jav接口所在包位置
package org.chench.test.mybatis.mapper.impl;
// 接口通过Spring框架注册Bean
@Repository
public interface DemoMapper {
public Demo selectOne(long id);
}

其次,注册xml映射器时需要将namespace属性设置为上述Java接口的完整类名称,同时设置操作语句元素的id属性为接口内的指定方法名称。

<?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">
<!-- 将xml映射器的namespace属性设置为完整的接口类名称 -->
<mapper namespace="org.chench.test.mybatis.mapper.impl.DemoMapper">
<!-- 将操作语句元素的id属性设置为接口方法名称 -->
<select id="selectOne" resultType="org.chench.test.mybatis.model.Demo">
SELECT * FROM demo WHERE id=#{id}
</select>
</mapper>

在遵守上述约定注册对应的xml映射器之后,就可以直接通过对应的Java接口调用xml映射器了。

// 启动spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("mybatis-spring.xml");
// 使用接口调用xml映射器
DemoMapper demoMapper = context.getBean(DemoMapper.class);
Demo demo = demoMapper.selectOne(1);
  • xml映射器使用方法的比较

xml映射器的使用方式根据MyBatis的使用场景而不同,总结如下:

(1)独立使用MyBatis时,只能通过SqlSession使用xml映射器,调用时必须指定xml映射器中的操作语句id,比较繁琐。

Test test =	sqlSession.selectOne("org.chench.test.mybatis.mapper.selectOneTest", 1);

(2)在Spring框架中集成MyBatis时,使用xml映射器比较灵活。除了可以通过SqlSession使用,还可以通过Java接口直接调用。对于开发者来说,直接调用接口方法会更加简洁;同时还能使用xml映射器的灵活与强大功能,可谓一举多得。

接口映射器

接口映射器是从MyBatis 3才开始支持的,其实就是支持在Java接口方法上通过注解方式编写SQL语句,而不再需要xml文件格式的配置。但请注意:使用注解编写SQL语句这种方式在某些场景下存在一定的限制,特别是处理复杂SQL的时候。虽然其有一定的简洁性,但同时也带来了局限性。通常都是将xml映射器和接口映射器联合使用。

定义接口映射器

定义接口映射器就是通过注解在Java接口方法上编写SQL语句,如下所示:

// 定义接口映射器
public interface TestMapper {
// 通过MyBatis的注解在Java接口方法上编写SQL语句
@Select("select * from test where id = #{id}")
Test selectOneTest(long id);
}

配置接口映射器

对于MyBatis是独立使用还是与Spring框架集成这2种不同的场景,注册接口映射器的方式各不相同,必须注意这一点。

  • 独立使用MyBatis

在独立使用MyBatis时,接口映射器只能在MyBatis的配置文件中(如:mybatis-config.xml)通过mapper节点指定,如:

<mappers>
<!-- 注册接口映射器: 2种方式 -->
<!-- 方式一: 明确注册每一个接口 -->
<!--
<mapper class="org.chench.test.mybatis.mapper.impl.TestMapper" />
<mapper class="org.chench.test.mybatis.mapper.impl.StudentMapper" />
-->
<!-- 方式二: 指定映射器接口所在Java包名称,则该包下的所有映射器接口都会被注册 -->
<package name="org.chench.test.mybatis.mapper.impl"/>
</mappers>
  • 在Spring框架中集成MyBatis

在Spring框架中集成MyBatis时,接口映射器只能通过org.mybatis.spring.mapper.MapperScannerConfigurer注册,指定其basePackage属性值为需要注册映射器接口所在的包,可以在该包及其子包下定义接口映射器。

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 定义接口映射器所在的Java包 -->
<property name="basePackage" value="org.chench.test.mybatis.mapper.impl"/>
</bean>

使用接口映射器

根据MyBatis的使用场景不同,使用接口映射器的方式也不同。

  • 独立使用MyBatis

独立使用MyBatis时,只能通过SqlSession使用接口映射器,此时也需要开发者自己释放SqlSession资源。

// 从类路径下的xml配置中构建SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
// 从sqlSessionFactory中获取sqlSession
// SqlSession的作用域最好是请求或方法域,且在使用完毕之后及时释放资源,而且一定要确保资源得到释放
SqlSession sqlSession = sqlSessionFactory.openSession();
// 从映射器接口中查询
Test test = sqlSession.getMapper(TestMapper.class).selectOneTest(1);
sqlSession.close();
  • 在Spring框架中集成MyBatis

在Spring框架中集成MyBatis时,接口映射器的Bean由Spring框架来管理,此时只需要直接获取对应的接口映射器Bean并调用方法即可。

// 启动spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("mybatis-spring.xml");
// 从Spring容器中获取接口映射器Bean
TestMapper testMapper = context.getBean(TestMapper.class);
Test test = testMapper.selectOneTest(1);

总结与对比

  1. 从MyBatis 3开始,同时支持2种类型的映射器:xml映射器和接口映射器。
  2. xml映射器是MyBatis原生支持的映射器方式,优点是功能强大,缺点是配置显得臃肿和复杂;接口映射器支持通过注解的方式在Java接口方法上编写SQL语句,优点是简洁,不再依赖外部xml配置,缺点是功能没有xml映射器强大。需要特别注意的是,在接口映射器中使用@SelectProvider注解动态拼装SQL时存在SQL注入攻击的风险。因此,通常都是将二者联合使用,即可以使用接口映射器带来的简洁性,也能使用xml映射器的强大功能。
  3. 2种映射器都可以分为独立使用和在Spring框架中集成使用2种不同的方式,独立使用时需要开发者自己处理事务管理和资源释放;在Spring框架中集成时事务管理和资源释放交给Spring框架处理,对开发者是透明的,更加高效和友好。
  4. 对于批量添加记录需要返回主键字段值的需求,只能在xml映射器中实现,接口映射器无能为力。

深入浅出mybatis之映射器的更多相关文章

  1. MyBatis中映射器Mapper概述

    MyBatis真正强大之处在于它的映射器.因为它异常强大并且编写相对简单,不仅比传统编写SQL语句做的更好并且能节省将近95%的代码量 XML中顶级元素汇总 cache: 给定命名空间的缓存配置 ca ...

  2. Mybatis中映射器实现方式总结

    一种是通过XML文件方式(由一个java接口和一个XML文件构成) RoleMapper rm = session.getMapper(RoleMapper.class); List<Role& ...

  3. 第六章 mybatis注入映射器

    为了代替手工使用 SqlSessionDaoSupport 或 SqlSessionTemplate 编写数据访问对象 (DAO)的代码,MyBatis-Spring 提供了一个动态代理的实现:Map ...

  4. (十一)mybatis之映射器(select)

    映射器 映射器的主要元素有八种: 元素名称 描述 select 查询语句,可自定义参数 insert 插入语句,执行后返回插入的条数 update 更新语句,执行后返回更新的条数 delete 删除语 ...

  5. (八)mybatis之映射器

    映射器 映射器是由Java接口和XML文件(或注解)共同组成的,作用如下: ①   定义参数类型. ②   描述缓存. ③   描述SQL语句. ④   定义查询结果和POJO的映射关系. 以下用两种 ...

  6. mybatis学习——映射器(mappers)

    在定义 SQL 映射语句之前,我们需要告诉 MyBatis 到哪里去找到这些语句. 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射 ...

  7. Mybatis结果映射器resultMap的基本用法

    <mapper namespace="全局唯一的名称空间"> <resultMap id="本namespace下唯一" type=" ...

  8. mybatis映射器配置细则

    前面三篇博客我们已经多次涉及到映射器的使用了,增删查基本上都用过一遍了,但是之前我们只是介绍了基本用法,实际上mybatis中映射器可以配置的地方还是非常多,今天我们就先来看看映射器还有哪些需要配置的 ...

  9. 【长文】Spring学习笔记(七):Mybatis映射器+动态SQL

    1 概述 本文主要讲述了如何使用MyBatis中的映射器以及动态SQL的配置. 2 MyBatis配置文件概览 MyBatis配置文件主要属性如下: <settings>:相关设置,键值对 ...

随机推荐

  1. centos7下git版本升级及gitlab安装

    centos系统自带的git版本过低,当使用git拉取.推送.克隆的时候可能会报错,常见的错误: error: The requested URL returned error: 401 Unauth ...

  2. .net 调用java service 代理类方法

        通过Svcutil.exe 工具生成代理类调用 1.找到如下地址“C:\Windows\System32\cmd.exe”  命令行工具,右键以管理员身份运行(视系统是否为win7 而定) 2 ...

  3. HBase实践案例:知乎 AI 用户模型服务性能优化实践

    用户模型简介 知乎 AI 用户模型服务于知乎两亿多用户,主要为首页.推荐.广告.知识服务.想法.关注页等业务场景提供数据和服务, 例如首页个性化 Feed 的召回和排序.相关回答等用到的用户长期兴趣特 ...

  4. ubuntu创建idea桌面快捷方式

    This method can be used to create a launcher for any application, not just IntelliJ IDEA. For any la ...

  5. HTML5 canvas clearRect() 方法

    浏览器支持 Internet Explorer 9.Firefox.Opera.Chrome 以及 Safari 支持 clearRect() 方法. 注释:Internet Explorer 8 或 ...

  6. 在Windows下使用Git+TortoiseGit+码云管理项目代码

    1.      安装Git 下载地址:点击打开链接 安装指南:默认选项即可 2.      安装TortoiseGit 下载地址:点击打开链接 安装指南:点击打开链接 3.      在码云创建账号, ...

  7. 网络流问题 P2763 试题库问题

    题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法. ...

  8. vim美化基本配置

    在home目录中创建一个 .vimrc文件 vim ~/.vimrc 文件基本配置 " 设置当文件被改动时自动载入 set autoread " quickfix模式 autocm ...

  9. [转]C#通过委托更新UI(异步加载)

    我们在使用 windowform 编程的时候,我们或许可能会越到,各种在窗体加载的时候,会进行其他的操作: 1.如果是在加载之前进行其它操作,则整个界面出来的很慢,而且若是时间长的话,页面很久才能出来 ...

  10. JS深度判断两个对象字段相同

    代码: /** * 判断此对象是否是Object类型 * @param {Object} obj */ function isObject(obj){ return Object.prototype. ...