<div class="post-content" itemprop="articleBody">
<h2>什么是MyBatis映射器?</h2><p>MyBatis框架包括两种类型的XML文件,一类是配置文件,即mybatis-config.xml,另外一类是映射文件,例如XXXMapper.xml等。在<a href="http://www.mybatis.cn/680.html" target="_blank">MyBatis的配置文件mybatis-config.xml</a>包含了&lt;mappers&gt;&lt;/mappers&gt;节点,这里就是MyBatis映射器。</p><h2>1、MyBatis映射器发展历史简介</h2><p>映射器是MyBatis中最核心的组件之一,在MyBatis 3之前,只支持XML映射器,所有的SQL语句都必须在XML文件中配置。而从MyBatis 3开始,开始支持接口映射器,其底层利用的是接口绑定技术(注:面试中经常会问到的一个知识点,见下文5.1项介绍)。另外,接口映射器允许通过注解定义SQL语句,用以替代XML文件配置SQL。</p><h2>2、MyBatis映射器分类</h2><h3>MyBatis映射器分为三类,如下所示:</h3><p>(1)纯xml映射器,利用SqlSession的各种方法实现增删改查。例如:</p><pre><code class="lang-java hljs"><ul><li>Person p = session.selectOne(<span class="hljs-string">"cn.mybatis.mydemo.mapper.PersonMapper.selectPersonById"</span>, <span class="hljs-number">1</span>);

(2)xml映射器+接口映射器的混合类型

先定义接口映射器,然后再定义xml映射器,其中xml映射器的namespace应该对应接口映射器的类名。其用法如下:


  • PersonMapper pm = session.getMapper(PersonMapper.class);
  • // 直接调用接口的方法,查询id为1的Peson数据
  • Person p2 = pm.selectPersonById(1);

(3)注解+接口映射器的混合形式

此类形式,将原先xml里面的sql配置信息,变成Java注解的形式写到接口映射器,用法与上面的例子雷同。

3、引入映射器的三种方式

3.1、通过文件类路径引入XML映射器


  • <mappers>
  • <mapper resource="cn/mybatis/mydemo/mapper/StudentMapper.xml"/>
  • </mappers>

3.2、通过包名引入映射器接口


  • <mappers>
  • <package name="cn.mybatis.mydemo.mapper" />
  • </mappers>

3.3、用类注册引入映射器接口


  • <mappers>
  • <mapper class="cn.mybatis.mydemo.mapper.StudentMapper"/>
  • </mappers>

3.4、更多介绍请查看官网文档

mybatis 映射器(mappers)的引入方式

官网文档提到了四种引入方式,其实最常用的就是本文所列的以上三种形式。

4、准备工作

先用以下SQL语句创建student表。


  • CREATE TABLE `student` (
  • `id` bigint(20) NOT NULL,
  • `name` varchar(20) DEFAULT NULL,
  • `address` varchar(20) DEFAULT NULL,
  • PRIMARY KEY (`id`)
  • ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后,定义一个 POJO,如下所示。


  • public class Student {
  • private Long id;
  • private String name;
  • private String address;
  • /**setter and getter**/
  • }

5、XML映射器+接口映射器

用XML定义映射器分为两个部分:接口定义和XML配置。先定义一个映射器接口,如下所示。


  • public interface StudentMapper {
  • public Student getStudent(Long id);
  • }

注意:映射器只是一个接口,而不是一个实现类。初学者可能会产生一个很大的疑问:接口不是不能运行吗?的确,接口不能直接运行,但是MyBatis内部运用了动态代理技术,生成接口的实现类,从而完成接口的相关功能。只要明白 MyBatis 会为这个接口生成一个代理对象,代理对象会去处理映射器接口相关的逻辑即可。

然后,用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="cn.mybatis.mydemo.mapper.StudentMapper">
  • <select id="getStudent" parameterType="long" resultType="student">
  • SELECT id,name,address FROM Student WHERE id =#{id}
  • </select>
  • </mapper>

有了这两个文件,就完成了一个映射器的定义。关于XML文件内容介绍,如下所示:

(1)<mapper> 元素中的属性 namespace 所对应的是一个接口的全限定名,于是 MyBatis 上下文就可以通过它找到对应的接口。

(2)<select> 元素表明这是一条查询语句,而属性 id 标识了这条 SQL,属性 parameterType="long" 说明传递给 SQL 的是一个 long 型的参数,而 resultType="student" 表示返回的是一个 Student 类型的返回值。而 student是配置文件 mybatis-config.xml 配置的别名,指代的是 com.mybatis.domain.Student。这条 SQL 中的 #{id} 表示传递进去的参数。

注意:我们并没有配置 SQL 执行后和 Student 的对应关系,它是如何映射的呢?其实,这里采用的是一种被称为自动映射的功能,MyBatis在默认情况下提供自动映射,只要SQL返回的列名能和POJO的属性对应起来即可。

最后,在MyBatis的配置文件里面引入这个XML映射器文件:


  • <mapper resource="cn/mybatis/mydemo/mapper/StudentMapper.xml" />

5.1、接口绑定

接口绑定,就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法,可以有更加灵活的选择和设置。

接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上 @Select、@Update等注解,里面包含Sql语句来绑定;另外一种就是通过xml里面写SQL来绑定,在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名。

当Sql语句比较简单时候,用注解绑定,当SQL语句比较复杂时候,用xml绑定。一般情况下,用xml绑定的比较多。

使用MyBatis的mapper接口调用时要注意的事项有:

(1)Mapper接口方法名和mapper.xml中定义的每个sql的id相同;

(2)Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同;

(3)Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同;

(4)Mapper.xml文件中的namespace即是mapper接口的类路径。

5.2、参考

MyBatis常见面试题9:什么是MyBatis的接口绑定?有哪些实现方式?

6、注解+接口映射器

除 XML方式定义映射器外,还可以采用注解方式定义映射器,它只需要一个接口就可以通过 MyBatis 的注解来注入 SQL,如下所示。


  • public interface StudentMapper2 {
  • @Select("select id,name,address from student where id=#{id}")
  • public Student getStudent(Long id);
  • }

注解方式完全等同于XML方式创建映射器,但是使用注解的方式比XML方式要简单得多。如果注解方式和XML方式同时定义时,XML 方式将覆盖掉注解方式,一般情况下,MyBatis官方推荐使用的是XML方式,因为XML映射器能完成更复杂的SQL功能。

这个接口可以在 XML 中定义,如下所示:


  • <mappers>
  • <mapper class="cn.mybatis.mydemo.mapper.StudentMapper"/>
  • </mappers>

7、映射器的使用方法

映射器的使用有两种方式,一种方式是直接利用SqlSession进行数据库操作,另外一种方式是SqlSession返回映射器Mapper,利用映射器来执行数据库操作。如下所示:


  • public class App
  • {
  • public static void main(String[] args) throws Exception
  • {
  • // 读取mybatis-config.xml文件
  • InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
  • // 初始化mybatis,创建SqlSessionFactory类的实例
  • SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  • // 创建Session实例
  • SqlSession session = sqlSessionFactory.openSession();
  • // 操作数据库方法一:获得xml映射文件中定义的操作语句
  • Student s = session.selectOne("cn.mybatis.mydemo.mapper.StudentMapper.getStudent", 1);
  • // 打印Student对象
  • System.out.println(s);
  • // 操作数据库方法二:获得mapper接口的代理对象
  • StudentMapper sm = session.getMapper(StudentMapper.class);
  • // 直接调用接口的方法,查询id为1的Student数据
  • Student s2 = sm.getStudent(1);
  • // 打印Peson对象
  • System.out.println(s2);
  • // 提交事务
  • session.commit();
  • // 关闭Session
  • session.close();
  • }
  • }

MyBatis映射器(转载)的更多相关文章

  1. MyBatis映射器(一)--多参数传递方式

    在mybatis映射器的接口中,一般在查询时需要传递一些参数作为查询条件,有时候是一个,有时候是多个.当只有一个参数时,我们只要在sql中使用接口中的参数名称即可,但是如果是多个呢,就不能直接用参数名 ...

  2. MyBatis映射器元素

     映射器是MyBatis最强大的工具,也是我们使用MyBatis时用的最多的工具,映射器中主要有增删改查四大元素,来满足不同场景的需要: 下面是主要元素的介绍:         select:查询语句 ...

  3. mybatis映射器配置细则

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

  4. mybatis 映射器(mappers) 配置说明 加载映射文件方式

    映射器(mappers) 既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了.但是首先我们需要告诉 MyBatis 到哪里去找到这些语句. Java 在自动查找这 ...

  5. mybatis 映射器

    1 映射器 Mapper 是由java接口和 XML 文件共同组成.它的作用如下 1)定义参数类型 2)描述缓存 3)描述 SQL 语句 4)定义查询结果和POJO的映射关系 2 SqlSession ...

  6. Mybatis映射器接口代理对象的方式 运行过程

    查询一张表的所有数据. 环境: 使用工具IntelliJ IDEA 2018.2版本. 创建Maven工程不用骨架 1.pom.xml <?xml version="1.0" ...

  7. Mybatis 映射器接口实现类的方式 运行过程debug分析

    查询一张表的所有数据. 环境: 使用工具IntelliJ IDEA 2018.2版本. 创建Maven工程不用骨架 <?xml version="1.0" encoding= ...

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

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

  9. Mybatis映射器(一)

    XML查询参数: parameterType:可以给出类别名,全名等. resultType:查询结果,可以为 int,float,map等不可以与resultMap同时使用. resultMap: ...

随机推荐

  1. IntelliJ IDEA 2017.3尚硅谷-----设置超过指定 import 个数,改为*

    (可忽略)

  2. 喵星之旅-狂奔的兔子-基于docker的rabbitmq安装

    docker安装参考:喵星之旅-狂奔的兔子-docker安装和基本使用 一.查询镜像名称 由于我们要安装的是有web管理页面的,不能直接拉取,需要指定版本. 登录docker仓库查询:https:// ...

  3. sqli-libs(42-45(post型)关)

    Less_42 查看源代码,可以看到password没有经过mysqli_real_escape_string()函数进行处理,所以这个时候我们在这个位置进行构造 使用admin 111111进行登录 ...

  4. Nuxt 环境搭建已经编写第一个Nuxt应用

    在学习Nuxt 之前 首先我们要有node ,然后因为Nuxt 是一个基于 Vue.js 的轻量级应用框架,所以在开发之前需要安装(后面纯属作者猜想并且猜想就是这个原因...) npm install ...

  5. 洛谷P1130红牌(简单DP)

    题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括NNN个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都 ...

  6. 动手实现CapsNet系列——2 实现(未完待续)

    执行后返回如下信息: Loading complete. Training started! [epoch 0][iter 0] loss: 0.8082, acc: 14.0000% (14/100 ...

  7. 【PAT甲级】1111 Online Map (30分)(dijkstra+路径记录)

    题意: 输入两个正整数N和M(N<=500,M<=N^2),分别代表点数和边数.接着输入M行每行包括一条边的两个结点(0~N-1),这条路的长度和通过这条路所需要的时间.接着输入两个整数表 ...

  8. 【Python】 运算符

    什么是运算符? 本章节主要说明Python的运算符.举个简单的例子 4 +5 = 9 . 例子中,4 和 5 被称为操作数,"+" 称为运算符. 接下来让我们一个个来学习Pytho ...

  9. Mac配置内网穿透

    闲语: Java开发过程中,往往会对接第三方,而在对接过程中,双方间使用的最多的"通讯"方式就是异步通知.可是异步通知过程中,只能通知到外网地址,可是在调试过程我们都是在本地进行- ...

  10. QT写的一个小工具:阿里云MQTT连接参数生成器.

    一.工具介绍. 最近在研究MQTT协议联网的一些问题,现在主流的物联网平台都支持MQTT协议. 在做阿里云平台连接测试的时候,连接参数的生成没有好用的工具, 所以就自己写了一个. 这个工具主要用于阿里 ...