• MyBatis映射器(转载)


        <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();
    • }
    • }
    </article>
    

    原文链接:点这里跳转到原文

    不一样的烟火
  • 相关阅读:
    银行类题目
    Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。
    Java-set集合
    Java——List集合
    java异常处理:建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,如new Bank(100),
    java基础-继承:矩形体积类问题
    类的继承和多态性-编写Java应用程序,定义Animal类,此类中有动物的属性:名称 name,腿的数量legs,统计动物的数量 count;方法:设置动物腿数量的方法 void setLegs(),获得腿数量的方法 getLegs(),设置动物名称的方法 setKind(),获得动物名称的方法 getKind(),获得动物数量的方法 getCount()。定义Fish类,是Animal类的子类,
    实验三 类的继承和多态性
    java基础—继承题目:编写一个Animal类,具有属性:种类;具有功能:吃、睡。定义其子类Fish
    java基础,继承类题目:编写一个Java应用程序,该程序包括3个类:Monkey类、People类和主类 E
  • 原文地址:https://www.cnblogs.com/cstdio1/p/11897900.html
Copyright © 2020-2023  润新知