映射器是MyBatis最强大的工具,也是我们使用MyBatis时用得最多的工具,因此熟练掌握它十分必要。MyBatis是针对映射器构造的SQL构建的轻量级框架,并且通过配置生成对应的JavaBean返回给调用者,而这些配置主要便是映射器,在MyBatis中你可以根据情况定义动态SQL来满足不同场景的需要,它比其他框架灵活得多。MyBatis还支持自动绑定JavaBean,我们只要让SQL返回的字段名和JavaBean的属性名保持一致即可(获赠采用驼峰式命名),便可以省掉这些繁琐的映射配置。

今天主要围绕这么几个方面来讲?

1.映射器的主要元素;

2.select元素

3.insert元素

4.update元素和delete元素

5.参数

6.sql元素

7.resultMap结果映射

8.缓存cache

一、映射器的主要元素

关于映射器的主要元素,我用两张图概况。

图一:

图一除了parameterMap之外基本上就不用,其他的都用。

图二:

resultMap是我用的比较多的,至于cache或者cache-ref用的着实不是很多。一般我们在spring和ehcache整合就可以达到缓存目的。当然了,有的时候觉得每次都通过ehcache在对应的方法上配置缓存注解显得麻烦,就可以通过cache的形式。

二、select元素

select元素是我们最常用也是功能最强大的SQL语言。select元素帮助我们从数据库中读出数据,组装数据给业务人员。执行select语句前,我们需要定义参数,它可以是一个简单的参数类型,例如int、float、String,同时也可以是一个复杂参数类型,例如Map或者JavaBean等,这些都是MyBatis接受的参数类型。执行SQL后,MyBatis也提供了强大的映射规则,甚至是自动映射来帮助我们把返回的结果绑定到JavaBean中。

关于select元素的配置,我用如下的图来表示:

图一:

图二:

图三:

关于select细节的东西,我不想说太多,对于初学者而言,说的太多,显得重点不突出,对于有基础的朋友们,说的太多,显得繁琐。

以下说这个常见问题?

1.关于resultType和resultMap

resultType是针对当数据表的字段名与JavaBean中属性名一致时,我们可以使用resultType。如果不一致的话,我们就使用resultMap。因为如果在数据表的字段名与JavaBean的属性不一致的前提下你还使用resultType,那么你查询的数据应该是为Null。

2.关于多个参数传递问题

如果你的数据访问层方法中的参数大于四个以上,建议使用对象来传输数据。

如果是参数列表中的参数与xml中的sql查询条件的字段不一致,可以使用@Parm注解自定义。

例如:

三、insert元素

insert元素,相对于select元素而言要简单许多。MyBatis会在执行插入之后返回一个整数,以表示你进行操作后插入的记录数。

insert元素配置详解

用一张图来表示,如下图所示:

insert 需要注意的是参数列表中的参数与插入的数据的列名要对上,同时还有就是数据表定义的主键非空或自增及其其他字段一些特殊的定义,因为同update一样,往往因为数据表的定义导致出现小问题。

关于批量添加可以参考我的这篇文章:SSM框架之批量增加示例(同步请求jsp视图解析)

四、update和delete

这两个元素很简单,所以一般情况,我们会放在一起讨论。和insert元素一样,MyBatis执行完update元素和delete元素后会返回一个整数,标出执行后影响的记录条数。

批量修改可以参考我的这篇文章:mybatis的批量更新实例

至于批量删除,你知道了批量更新就相当于知道了这个。

五、参数

虽然在MyBatis中参数大部分是像上面所描述的那样简单,但是我们还是有必要讨论一下参数的使用。我们可以通过制定参数的类型去让对应的typeHandler处理它们。

这里需要强调的是关于特殊字符串的替换和处理(#和$)

在MyBatis中,我们常常传递字符串,我们设置的参数#(name)在大部分的情况下MyBatis会用创建预编译的语句,然后MyBatis为它设值,而有时候我们需要的是传递SQL语句的本身,而不是SQL所需要的参数。例如,在一些动态表格(有时候经常遇到根据不同的条件产生不同的动态列)中,我们要传递SQL的列名,根据某些列进行排序,或者传递列名给SQL都是比较常见的场景,当然MyBatis也对这样的场景进行了支持,这些都是Hibernate难以做到的。

六、sql元素

sql元素的意义,在于我们可以定义一串SQL语句的组成部分,其他的语句可以通过引用来使用它们。例如,你有一条SQL需要select几十个字段映射到JavaBean中去,我的第二条数据也是这几十个字段映射到JavaBean中去,显然写两遍是不合适的。那么我们就可以通过sql元素来完成。

例如,下面的这个示例,大家可以做个简单参考。

    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        user_id, login_code, user_name, password, sex, identity_card, create_time, create_by, update_time, update_by, status
    </sql>
    
    <select id="selectOne" resultMap="BaseResultMap">
        select <include refid="Base_Column_List"/>
        from `user` where user_id=#{userId}
    </select>

七、resultMap

resultMap是MyBatis里面最复杂的元素。它的作用是定义映射规则、级联的更新、定制类型转化器等。

前面我们只是仅仅提到了它和resultType的对比。

resultMap定义的主要是一个结果集的映射关系。MyBatis现有的版本只支持resultMap查询,不支持更新或者新增,更不要说说批量的删除和修改了。

1.resultMap元素的构成

其中constructor元素用于配置构造方法。一个POJO可能不存在没有参数的构造方法,这个时候我们就可以使用constructor进行配置。

id元素是表示哪个列是主键,允许多个主键,多个主键则称为联合主键。result是配置POJO到SQL列名的映射关注。这里的result和Id元素,如下图所示:

至于级联,例如一对一,一对多,多对多,我们可以分别使用association、collection等。

后面我会专门有代码示例讲解的。

不过有一点需要注意的是,通常一对一或者一对多,多对多这种的,特别损耗性能,因此对于sql,最好是优化。

关于sql优化的方法,大家可以参考我的这篇博客:造成MySQL全表扫描的原因

这篇文章不会直接告诉你这么做,但是你看了这篇文章,你就会明白为什么要这么做。

在我看来,提出问题比解决问题更重要(当然了,事物都是相对的)。

八、缓存

缓存是互联网系统常常用到的,其特定是将数据保存在内存中。目前流行的缓存服务器有MongoDB、Redis、Ehcache等。缓存是在计算机内存上保存的数据,在读取的时候无需再从磁盘读入,因此具备快速读取和使用的特点,如果缓存命中率高,那么可以极大地提高系统的性能。如果缓存命中率低,那么缓存就不存在使用的意义,所以使用缓存的关键在于存储内容访问的命中率。

关于SSM框架整合Ehcache实战,可以参考我的这篇文章:SSM框架实战之整合EhCache

这篇文章的重点不是缓存,关于redis和memcached及其与ssm框架整合实战及其应用场景,后面会专门有文章详细讲解。

小结:

本文主要参考《深入浅出MyBatis原理与实战》和自身在实战中的总结和归纳。希望能给大家有所帮助。

MyBatis实战之映射器的更多相关文章

  1. 第六章 mybatis注入映射器

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

  2. Java Persistence with MyBatis 3(中文版) 第三章 使用XML配置SQL映射器

    关系型数据库和SQL是经受时间考验和验证的数据存储机制.和其他的ORM 框架如Hibernate不同,MyBatis鼓励开发者可以直接使用数据库,而不是将其对开发者隐藏,因为这样可以充分发挥数据库服务 ...

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

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

  4. java-mybaits-010-mybatis-spring-使用 SqlSession、注入映射器

    一. SqlSession概述 在 MyBatis 中,你可以使用 SqlSessionFactory 来创建 SqlSession.一旦你获得一个 session 之后,你可以使用它来执行映射语句, ...

  5. 《深入浅出MyBatis技术原理与实战》——4. 映射器,5. 动态SQL

    4.1 映射器的主要元素 4.2 select元素 4.2.2 简易数据类型的例子 例如,我们需要统计一个姓氏的用户数量.应该把姓氏作为参数传递,而将结果设置为整型返回给调用者,如: 4.2.3 自动 ...

  6. mybatis映射器配置细则

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

  7. MyBatis映射器元素

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

  8. 深入浅出mybatis之映射器

    目录 概述 XML映射器 定义xml映射器 配置xml映射器 使用xml映射器 接口映射器 定义接口映射器 配置接口映射器 使用接口映射器 总结与对比 概述 映射器是MyBatis中最核心的组件之一, ...

  9. MyBatis中映射器Mapper概述

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

随机推荐

  1. K8s-Demo实现

     Kubernates的基础界面 常用的操作    将创建好的yaml文件通过Create按钮创建所需资源项目. Dashbord:   可以通过Dashbord查看集群详情:cpu.memory.f ...

  2. django-强大的ORM

    一.ORM简介 (对象关系映射:object relationship mapping) MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的 ...

  3. 【代码笔记】iOS-SDWebImage的使用

    一,工程图. 二,代码. RootViewController.m #import "RootViewController.h" //加入头文件 #import "UII ...

  4. 【读书笔记】iOS-网络-理解错误源

    考虑一个字节是如何从设备发往运程服务器以及如何从远程服务器将这个字节接收到设备,这个过程只需要几百毫秒时间,不过确要求网络设备都能正常工作才行.设备网络和网络互联的复杂性导致了分层网络的产生.分层网络 ...

  5. 解读 --- 基于微软企业商务应用平台 (Microsoft Dynamics 365) 之上的人工智能 (AI) 解决方案

    9月25日微软今年一年一度的Ignite 2017在佛罗里达州奥兰多市还是如期开幕了.为啥这么说?因为9月初五级飓风厄玛(Hurricane Irma) 在佛罗里达州登陆,在当地造成了挺大的麻烦.在这 ...

  6. Flink1.4.0连接Kafka0.10.2时遇到的问题

    Flink1.4.0连接部署在Linux上的Kafka0.10.2时,报如下异常: org.apache.flink.streaming.connectors.kafka.FlinkKafkaCons ...

  7. eclipse代码中每行的开始和结尾出现多余的特殊符号

    window -> preferences -> general -> editors -> text editors ->          show whitespa ...

  8. 全球首款完全开源的堡垒机,符合 4A 的专业运维审计系统Jumpserver

    Jumpserver是全球首款完全开源的堡垒机,是符合 4A 的专业运维审计系统. http://www.jumpserver.org https://github.com/jumpserver/ju ...

  9. alias 别名

    别名的作用: 1.通过给危险命令加一些保护参数,防止人为误操作. 2.把很多复杂的字符串或命令变成一个简单的字符串或命令. alias 用法: 定义别名: alias rm='echo "没 ...

  10. python基础学习23----IO模型(简)

    对于一个网络IO(network IO),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel).当一个read操作发生时,该操作会经历 ...