当前位置: 首页 > 新闻 > 信息荟萃
编号:50
MyBatis从入门到精通中文版.pdf
http://www.100md.com 2019年12月16日
第1页
第9页
第16页
第23页
第40页
第93页

    参见附件(3551KB,314页)。

     MyBatis从入门到精通教程是由作者刘增辉编写发行的知识点学习软件,这本书籍非常适合Java开发人员进行学习,里面有各种知识点架构等待研究并且进行学习!

    MyBatis从入门到精通简介

    《MyBatis从入门到精通》中从一个简单的MyBatis查询入手,搭建起学习MyBatis的基础开发环境。通过全面的示例代码和测试讲解了在MyBatis XML方式和注解方式中进行增、删、改、查操作的基本用法,介绍了动态SQL在不同方面的应用以及在使用过程中的实践方案。针对MyBatis高级映射、存储过程和类型处理器提供了丰富的示例,通过自下而上的方法使读者更好地理解和掌握MyBatis的高级用法,同时针对MyBatis的代码生成器提供了详细的配置介绍。此外,《MyBatis从入门到精通》还提供了缓存配置、插件开发、Spring、Spring Boot集成的详细内容。最后通过介绍Git和GitHub让读者了解MyBatis开源项目,通过对MyBatis源码和测试用例的讲解让读者更好掌握MyBatis。

    MyBatis从入门到精通特色

    1、由浅入深,适合新手入门,适合老手继续深入学习;

    2、由MyBatis官方推荐插件PageHelper作者亲自执笔;

    3、详细解读源代码,带领读书深入理解源码核心思想。

    MyBatis从入门到精通作者介绍

    刘增辉,资深Java工程师,热爱技术研究,乐于分享心得,活跃于CSDN和开源中国网站。对MyBatis源码有着深入研究,同时热衷于开源项目,在GitHub和开源中国网站上发布了多个开源项目,是MyBatis官方推荐的分页插件PageHelper和通用Mapper的作者,所发布项目受到了数千人的关注。

    MyBatis从入门到精通适读人群

    1.资深Java开发工程师执笔

    作者是资深Java开发工程师,活跃于CSDN及开源中国,对MyBatis研究深入,是MyBatis官方推荐的分页插件PageHelper即通用Mapper的作者。

    2.示例完整,注释详细

    《MyBatis从入门到精通》中的示例代码都非常完整,同时每行核心语句都附有注释,可以帮助读者轻松掌握代码的内容,快速入门,持续深化,举一反三。

    2.解读源码,资源丰富

    《MyBatis从入门到精通》的特点在于详细解读MyBatis源代码,带领大家深入理解源码核心。另外,作者开源了许多优秀项目(MyBatis官方推荐的扩展组件等),每一位读者都可以获得《MyBatis从入门到精通》的宝贵资源,并与作者交流讨论。

    MyBatis从入门到精通截图

    C

    M

    Y

    CM

    MY

    CY

    CMY

    K

    MyBatis从入门到精通fy.pdf 1 201761 16:21:09C

    M

    Y

    CM

    MY

    CY

    CMY

    K

    MyBatis从入门到精通fy.pdf 1 201761 16:21:09

    更多免费电子书搜索「雅书」 https:yabook.org

    内 容 简 介

    本书中从一个简单的 MyBatis 查询入手,搭建起学习 MyBatis 的基础开发环境。通过全面的示例代码

    和测试讲解了在 MyBatis XML方式和注解方式中进行增、删、改、查操作的基本用法,介绍了动态 SQL

    在不同方面的应用以及在使用过程中的最佳实践方案。针对 MyBatis 高级映射、存储过程和类型处理器提

    供了丰富的示例,通过自下而上的方法使读者更好地理解和掌握 MyBatis 的高级用法,同时针对 MyBatis

    的代码生成器提供了详细的配置介绍。此外,本书还提供了缓存配置、插件开发、Spring、Spring Boot 集

    成的详细内容。最后通过介绍Git 和 GitHub 让读者了解 MyBatis 开源项目,通过对 MyBatis 源码和测试用

    例的讲解让读者更好掌握 MyBatis。

    未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。

    版权所有,侵权必究。

    图书在版编目(CIP)数据

    MyBatis 从入门到精通 刘增辉著. —北京:电子工业出版社,2017.7

    ISBN 978-7-121-31797-2

    Ⅰ. ①M… Ⅱ. ①刘… Ⅲ. ①JAVA语言-程序设计 Ⅳ. ①TP312.8

    中国版本图书馆 CIP 数据核字(2017)第121030 号

    策划编辑:孙奇俏

    责任编辑:徐津平

    印 刷:

    装 订:

    出版发行:电子工业出版社

    北京市海淀区万寿路 173 信箱 邮编 100036

    开 本:787×980 116 印张:19.5 字数:430 千字

    版 次:2017 年7 月第1 版

    印 次:2017 年7 月第1 次印刷

    定 价:79.00 元

    凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。若书店售缺,请与本社发行部联系,联系及邮购电话:(010)88254888,88258888。

    质量投诉请发邮件至 zlts@phei.com.cn,盗版侵权举报请发邮件至 dbqq@phei.com.cn。

    本书咨询联系方式:010-51260888-819,faq@phei.com.cn

    推荐序

    分离是为了更好的相聚

    2013 年,我在开源中国网站上认识了本书作者刘增辉,并和他多次探讨过关于 Java 开源框

    架的种种技术问题。那段时间,我正在开源一款名为 Smart Framework的轻量级 Java Web 框架,当时我不敢奢望自己开源的框架会有多少人认可,但没想到后来还真有不少朋友们为此框架提

    出了宝贵建议并做出了巨大贡献。尤其是在数据持久层这块,增辉给了我许多支持与帮助,让

    我感受到开源带给我的不仅是技术能力上的提升,更多的是让自己感到快乐。

    我了解到增辉对 MyBatis 的研究颇为深入,不仅对 MyBatis 的内核,甚至对于其扩展都能

    做到了然于心、游刃有余。他曾经也开源了许多 MyBatis 核心组件,帮助许多开发者提高了工

    作效率,而我正是这众多开发者中的一位。

    我不想占用这篇推荐序的宝贵篇幅为大家讲解如何来使用 MyBatis,因为这本书中对

    MyBatis 的介绍远比我讲的更加详细和深入。现在我只想和大家聊聊架构设计中的一个核心问

    题:关注点分离。因为这个问题同样也是 MyBatis框架需要解决的核心问题。

    关注点分离

    关注点分离所对应的英文是 Separation of Concerns,简称 SOC。它是最经典的架构设计原

    则之一,在许多架构设计中被广泛使用。关注点分离原则为我们的架构设计提出了三点要求。

    1.架构中需要变化的部分,一定要能够非常清晰地被识别出来。

    2.若架构中某部分发生变化,则该变化不会影响到其他部分。

    3.若架构中某部分需要扩展,则该扩展也不会影响到其他部分。

    架构能做到关注点分离,才能做到真正意义上的解耦,这是架构师们需要努力实现的目

    标。如果大家要问,关注点分离做得最有效的落地实践是什么?我们首先能想到的就是“前

    更多免费电子书搜索「雅书」 https:yabook.orgIV │ MyBatis 从入门到精通

    后端分离” 。

    前后端分离

    曾经我们开发 Web 应用程序时,对前端和后端的概念不太清晰,开发者们逐渐认为前端和

    后端有必要进行分离了,前端需要考虑界面展现与数据展现问题,后端需要考虑业务逻辑与数

    据逻辑问题。可见,前端和后端所关注的问题是完全不同的,应该在架构上将它们进行分离。

    此外,在团队协作上也能将前端与后端这两部分的工作进行分离,因此出现了前端工程师与后

    端工程师这两个不同岗位。这样分工绝不是偶然的,它不仅让架构变得更加解耦,还能显著地

    提升团队的开发效率。

    针对前端工程师而言,需要将界面展现与数据展现相分离;针对后端工程师而言,不仅要清

    晰地理解业务逻辑,善于将数据进行合理的建模,最终还要做到将业务逻辑与数据逻辑相分离。

    业务逻辑与数据逻辑相分离

    业务逻辑对于我们而言已经很清楚了,但数据逻辑包括哪些呢?最直接的就是一个个对应

    于数据库中每张数据表的实体对象,它有一个很好听的名字:数据访问对象,即 Data Access

    Object,简称 DAO。很明显,这一层数据直接和底层数据库打交道,我们将它们从业务逻辑中

    分离出来,并加以封装。也就是说,没必要为每一个 DAO 对象初始化的过程去编写大量的代

    码,这些代码应该封装到一个框架中。我们只需要编写相应的 SQL 语句,并将这些 SQL 语

    句从业务代码中分离出来,最终将执行 SQL语句所得到的结果集映射到 DAO 对象中即可。

    不知道大家对我刚刚提到的“关注点分离”有怎样的理解。无论大家理解或深或浅,毫无

    疑问,这个问题都已成为架构中最核心的部分。

    MyBatis就是这样的框架——它能帮助我们将业务逻辑与数据逻辑相分离,让开发应用程序

    的过程变得更加高效。究竟MyBatis中隐藏着怎样的奥秘?不要急,这本书将为大家揭晓答案。

    作者增辉停下开发的脚步,通过深思熟虑和细心总结,把动态的实践静止到了纸张上,为

    各位读者悉心解读 MyBatis 的方方面面。相信他创作这本书的过程亦如当初刻苦自学 MyBatis

    并在各大社区开源自己编写的核心组件的过程,倾注了全部的热情和心血。不忘初心,方得始

    终,希望各位读者能够喜欢这本书,并从中有所收获。

    《架构探险》作者、特赞科技 CTO,黄勇

    2017 年5 月

    推荐语

    我和作者在开源中国社区上认识,源于我当时开源了 Tiny 开发框架 ,我们就框架中的各

    个部分展开了热烈的讨论,作者也就框架的发展提出了大量有益的建议,做出非常大的贡献。

    后来了解到作者也开源了很多自己编写的项目,其中尤以 MyBatis扩展组件 PageHelper 最为突

    出。作者是一位对技术十分执着的探索者,拥抱开源、乐于分享,将自己多年来在 MyBatis 领

    域的研究心得和实践经验汇集在了这本书中。本书由浅入深,引领新手快速入门,带领老手逐

    步精通,也能为精通者提供参考,是一本值得拥有的 MyBatis 专著。结识这样一位志同道合的

    朋友我感到非常荣幸,也希望大家通过本书结识他。

    《企业级 Java EE 架构设计精深实践》作者、Tiny开源框架发起者,罗果

    MyBatis 的前身是 iBATIS,它以接近 JDBC 的性能优雅地实现 Java 代码与 SQL 语句的分

    离,让开发者将数据操作专注点转移到 SQL 语句上,进而使代码维护变得更加容易。历经 10

    多年的发展, MyBatis日臻成熟,现已成为Java持久化框架中的佼佼者被广泛应用。但是MyBatis

    也有一些不完美的地方,例如物理分页问题、缓存问题,对于这些问题,作者在本书中给出了

    自己的解决方案。本书通俗易懂,妙趣横生,通过实例全面深入讲解了 MyBatis 的关键技术,是 MyBatis开发中一本不可多得的好书,在这里隆重推荐给各位读者!

    互联网金融公司 CTO,熔岩

    “万物之始,大道至简,衍化至繁” !MyBatis正是循“至简之道”至今,须臾不离,方有

    今日的繁荣!放眼于 Java 框架丛林,十数载以来,无人问津者有之,而后放逐者有之,谩骂者

    有之,束之高阁者有之,恩泽九州者亦有之……窃以为,MyBatis当属“恩泽九州”者,何也?

    始终秉持“简单”这一设计理念;架构体系开放;外围插件百花齐放,这其中尤为突出者当属

    作者的 PageHelper。PageHelper 经刘兄数载打磨,已广泛应用于诸多项目。得知刘兄 MyBatis

    新作历经持续打磨即将面世,甚为欣喜。刘兄是 PageHelper 的铸造者,也是国内 MyBatis 方面

    不争的权威专家,强烈建议大家持卷品读!

    资深 Java 开发工程师,杨新伦

    更多免费电子书搜索「雅书」 https:yabook.org

    读者服务

    轻松注册成为博文视点社区用户(www.broadview.com.cn),扫码直达本书页面。

    · 提交勘误:您对书中内容的修改意见可在【提交勘误】处提交,若被采纳,将获赠博文

    视点社区积分(在购买电子书时,积分可用来抵扣相应金额)。

    · 交流互动:在页面下方【读者评论】处留下您的疑问或观点,与我们和其他读者一同学

    习交流。

    页面入口:http:www.broadview.com.cn31797

    前言

    自 2013 年起,我开始带领团队开发项目,公司此前使用的是一套深度集成的 Spring、Struts

    和 Hibernate 框架,这套重量级框架显然已经不适合用在全新的项目中。当时使用的 Hibernate

    还是较早的版本,在项目的业务层需要拼接大量的 SQL 和 HQL 才能进行数据库操作。综合多

    方面因素,我决定选择其他持久化框架进行项目开发。因为 MyBatis SQL和代码分离的方式以

    及动态 SQL的强大功能,加之其在对查询结果进行映射处理等方面具有显著优点,因此,我与

    MyBatis开始结缘。

    为了提高查询效率,通常会采用物理分页,然而 MyBatis只能支持内存分页。若想让MyBatis

    支持物理分页,只能通过基于拦截器的插件来实现。当时,已有的 MyBatis 分页插件都不适用

    于公司已经开发了大半的项目,因此我有了自己写一个分页插件的想法。完成后的分页插件

    (PageHelper)能很方便地实现对 MyBatis 查询方法的分页。后来,我在 CSDN 和开源中国的

    博客中分享了代码,并且详细说明了实现原理。在后续更新插件的一篇博客评论中,红薯(开

    源中国创始人)说: “应该把代码放到 git.oschina.net 中,放网盘很不专业哦! ”因为这句话,我

    便踏入了开源的世界。

    由于 PageHelper 分页插件有越来越多人使用,因而有很多网友通过留言、私信、邮件等方

    式和我讨论 MyBatis 的相关问题。为了解决网友的问题以及完善分页插件的功能,我深入学习

    了 MyBatis 的源码,通过不断的学习,不仅从深层次了解了各种问题的产生原因,对 MyBatis

    的理解也逐渐加深。2014年 11 月,我利用闲暇时间又开发了一个新的开源项目:MyBatis通用

    Mapper,它实现了 MyBatis 单表增、删、改、查的基本方法,能够帮助开发人员节省大量时间。

    这几年来,我一直在博客上面和大家分享 MyBatis 的相关内容,在这期间和网友交流解决

    的问题有很多是重复的,也有很多都是基础的。现在已有的 MyBatis 学习途径提供给大家的知

    识,有一些比较深奥不适合初学者,有一些比较基础却不全面。为了让读者比较容易地全面掌

    握 MyBatis 的相关知识,这本书得以诞生,本书将通过全面完整的大量示例,让读者轻松且全

    面地掌握 MyBatis。

    更多免费电子书搜索「雅书」 https:yabook.orgVIII │ MyBatis 从入门到精通

    阅读准备

    在开始学习之前,需要准备好如下的开发环境。

    · JDK1.6 及以上版本。

    · MyBatis 3.3.0 版本。

    · MySQL数据库。

    · Eclipse 4 及以上版本。

    · Apache Maven构建工具。

    本书内容

    全书共 11 章,每一章的具体内容如下。

    第 1 章 MyBatis入门

    本章先简单介绍了 MyBatis 的发展历史和特点,然后通过一步步的操作搭建了一个学习

    MyBatis的基础环境,这个开发环境也是学习后续几个章节的基础。

    第 2 章 MyBatis XML 方式的基本用法

    本章设定了一个简单的权限控制需求,使用 MyBatis XML方式实现了数据库中一个表的常

    规操作。在查询方面,通过根据主键查询和查询全部两个方法让读者在学会使用 MyBatis 查询

    方法的同时,还深入了解 MyBatis 返回值的设置原理。在增、删、改方面提供了大量详细的示

    例,这些示例覆盖了 MyBatis基本用法的方方面面。

    第 3 章 MyBatis注解方式的基本用法

    虽然 XML 方式是主流,但是仍然有许多公司选择了注解方式,因此本章非常适合使用注

    解方式的读者。本章使用注解方式几乎实现了同 XML 方式类似的全部方法,包含许多常用注

    解的基本用法。对于初学者来说,即使不使用注解方式,通过本章和第 2 章的对比也可以对

    MyBatis有更深的了解。

    第 4 章 MyBatis动态 SQL

    本章详细介绍了 MyBatis 最强大的动态 SQL 功能,通过丰富的示例讲解了各种动态 SQL

    的用法,为动态 SQL 中可能出现的问题提供了最佳实践方案,还提供了动态 SQL 中常用的

    OGNL 用法。

    第 5 章 MyBatis代码生成器

    本章介绍的 MyBatis 代码生成器可以减轻基本用法中最繁重的那部分书写工作带来的压前言 │ IX

    力。通过本章的学习,可以使用代码生成器快速生成大量基础的方法,让大家更专注于业务代

    码的开发,从枯燥的基础编码中解脱出来。

    第 6 章 MyBatis高级查询

    本章介绍了 MyBatis 中的高级结果映射,包括一对一映射、一对多映射和鉴别器映射。通

    过循序渐进的代码示例让读者轻松地学会使用 MyBatis 中最高级的结果映射。本章还通过全面

    的示例讲解了存储过程的用法和类型处理器的用法。

    第 7 章 MyBatis缓存配置

    本章讲解了 MyBatis 缓存配置的相关内容,提供了 EhCache 缓存和 Redis缓存的集成方法。

    虽然二级缓存功能强大,但是使用不当很容易产生脏数据。本章针对脏数据的产生提供了最佳

    解决方案,并且介绍了二级缓存适用的场景。

    第 8 章 MyBatis插件开发

    本章介绍了MyBatis强大的扩展能力,利用插件可以很方便地在运行时改变MyBatis的行为。

    通过两个插件示例让读者初窥门径,结合第11章的内容可以让读者开发出适合自己的插件。

    第 9 章 Spring 集成 MyBatis

    本章介绍了最流行的轻量级框架 Spring集成 MyBatis的方法,通过一步步操作从零开始配

    置,搭建一个基本的 Spring、Spring MVC、MyBatis开发环境。

    第 10 章 Spring Boot 集成 MyBatis

    本章介绍了最流行的微服务框架 Spring Boot 集成 MyBatis的方法,通过 MyBatis官方提供

    的 Starter 可以很方便地进行集成。同时,本章对 Starter 中的配置做了简单的介绍,可以满足读

    者对 MyBatis 各项配置方面的需要。

    第 11 章 MyBatis 开源项目

    本章是一扇通往开源世界的大门,也是一扇通往 MyBatis 源码学习的大门。从 Git 入门到

    GitHub 入门,读者可以学会使用最流行的分布式版本控制系统和源代码托管服务。通过一段代

    码让大家了解 MyBatis 中的一部分关键类,通过代码包讲解可以了解 MyBatis 每个包中所含的

    功能。最后通过 MyBatis丰富的测试用例为读者提供更多更有用的学习内容。

    致谢

    从决定写书,到这本书能够出版,中间经历了很多,因此深感来之不易。在这个过程中,要感谢所有为本书做出过贡献的人。感谢我的父母对我事业的默默支持。感谢我的妻子参与了

    本书的审校工作,给我提供了许多宝贵意见。感谢我的朋友黄勇、熔岩、杨新伦、悠然在百忙

    之中抽出时间为我的新书作序推荐。感谢博文视点的策划编辑孙奇俏的持续跟进和大力协助,更多免费电子书搜索「雅书」 https:yabook.orgX │ MyBatis 从入门到精通

    同时感谢电子工业出版社和博文视点的其他老师给予本书的专业意见。最后,感谢每一位阅读

    本书的读者,希望本书能给您带来帮助。衷心感谢大家。

    联系作者

    由衷地感谢大家购买此书,希望大家会喜欢,也希望这本书能够为各位读者带来所希望获

    得的知识。虽然我已经非常细心地检查书中所提到的所有内容,但仍有可能存在疏漏,若大家

    在阅读过程中发现错误,在此我先表示歉意。欢迎各位读者对本书的内容和相关源代码发表意

    见和评论。大家可以通过我的个人邮箱 abel533@gmail.com 与我取得联系,我会一一解答每个

    人的疑惑。

    本书资源

    扫码或输入地址 http:mybatis.tk 进入 MyBatis 技术网站。网站中提供了大量 MyBatis 的相

    关内容,同时可下载本书相关资源。

    目录

    第 1章 MyBatis 入门 ........................................................................................................ 1

    1.1 MyBatis简介 ..................................................................................................................2

    1.2 创建 Maven 项目 ............................................................................................................3

    1.3 简单配置让MyBatis 跑起来 .........................................................................................7

    1.3.1 准备数据库 ..........................................................................................................8

    1.3.2 配置 MyBatis .......................................................................................................8

    1.3.3 创建实体类和Mapper.xml文件 .......................................................................10

    1.3.4 配置 Log4j以便查看MyBatis操作数据库的过程 ......................................... 11

    1.3.5 编写测试代码让MyBatis跑起来.....................................................................12

    1.4 本章小结 .......................................................................................................................14

    第 2章 MyBatis XML 方式的基本用法 ........................................................................... 15

    2.1 一个简单的权限控制需求 ...........................................................................................16

    2.1.1 创建数据库表 ....................................................................................................16

    2.1.2 创建实体类 ........................................................................................................19

    2.2 使用XML方式 ............................................................................................................21

    2.3 select用法.....................................................................................................................23

    2.4 insert用法 .....................................................................................................................35

    2.4.1 简单的 insert方法 .............................................................................................35

    2.4.2 使用JDBC 方式返回主键自增的值.................................................................38

    2.4.3 使用 selectKey返回主键的值...........................................................................40

    2.5 update用法 ...................................................................................................................42

    2.6 delete用法 ....................................................................................................................45

    2.7 多个接口参数的用法 ...................................................................................................47

    更多免费电子书搜索「雅书」 https:yabook.orgXII │ MyBatis 从入门到精通

    2.8 Mapper接口动态代理实现原理 .................................................................................50

    2.9 本章小结 .......................................................................................................................51

    第 3章 MyBatis注解方式的基本用法 ............................................................................ 53

    3.1 @Select注解 ................................................................................................................54

    3.1.1 使用 mapUnderscoreToCamelCase 配置 ...........................................................55

    3.1.2 使用 resultMap 方式 ..........................................................................................55

    3.2 @Insert注解 .................................................................................................................58

    3.2.1 不需要返回主键 ................................................................................................58

    3.2.2 返回自增主键 ....................................................................................................58

    3.2.3 返回非自增主键 ................................................................................................59

    3.3 @Update注解和@Delete注解 ...................................................................................59

    3.4 Provider注解 ................................................................................................................60

    3.5 本章小结 .......................................................................................................................61

    第4章 MyBatis动态 SQL .............................................................................................. 63

    4.1 if用法 ...........................................................................................................................64

    4.1.1 在WHERE条件中使用if .................................................................................64

    4.1.2 在UPDATE 更新列中使用if ...........................................................................68

    4.1.3 在INSERT动态插入列中使用if .....................................................................70

    4.2 choose用法...................................................................................................................72

    4.3 where、set、trim用法 .................................................................................................75

    4.3.1 where用法 .........................................................................................................75

    4.3.2 set用法 ...............................................................................................................76

    4.3.3 trim用法 ............................................................................................................77

    4.4 foreach 用法 ..................................................................................................................78

    4.4.1 foreach实现 in集合 ..........................................................................................78

    4.4.2 foreach实现批量插入 .......................................................................................81

    4.4.3 foreach实现动态UPDATE ...............................................................................84

    4.5 bind用法.......................................................................................................................86

    4.6 多数据库支持 ...............................................................................................................86

    4.7 OGNL用法...................................................................................................................89 目录 │ XIII

    4.8 本章小结 .......................................................................................................................90

    第 5章 Mybatis代码生成器 ........................................................................................... 91

    5.1 XML配置详解 .............................................................................................................92

    5.1.1 property标签 ......................................................................................................95

    5.1.2 plugin标签 .........................................................................................................96

    5.1.3 commentGenerator标签 ....................................................................................97

    5.1.4 jdbcConnection标签 ..........................................................................................99

    5.1.5 javaTypeResolver标签 .................................................................................... 100

    5.1.6 javaModelGenerator标签 ................................................................................ 101

    5.1.7 sqlMapGenerator标签 ..................................................................................... 102

    5.1.8 javaClientGenerator标签 ................................................................................. 103

    5.1.9 table标签 ......................................................................................................... 104

    5.2 一个配置参考示例 ..................................................................................................... 109

    5.3 运行 MyBatis Generator ............................................................................................. 111

    5.3.1 使用Java编写代码运行 ................................................................................. 111

    5.3.2 从命令提示符运行 .......................................................................................... 113

    5.3.3 使用 Maven Plugin运行 .................................................................................. 115

    5.3.4 使用 Eclipse插件运行 .................................................................................... 117

    5.4 Example介绍 ............................................................................................................. 119

    5.5 本章小结 ..................................................................................................................... 124

    第 6章 MyBatis高级查询 ............................................................................................. 125

    6.1 高级结果映射 ............................................................................................................. 126

    6.1.1 一对一映射 ...................................................................................................... 126

    6.1.2 一对多映射 ...................................................................................................... 140

    6.1.3 鉴别器映射 ...................................................................................................... 156

    6.2 存储过程 ..................................................................................................................... 159

    6.2.1 第一个存储过程 .............................................................................................. 162

    6.2.2 第二个存储过程 .............................................................................................. 164

    6.2.3 第三个和第四个存储过程 .............................................................................. 166

    6.2.4 在Oracle中使用游标参数的存储过程 .......................................................... 168

    更多免费电子书搜索「雅书」 https:yabook.orgXIV │ MyBatis 从入门到精通

    6.3 使用枚举或其他对象 ................................................................................................. 170

    6.3.1 使用 MyBatis提供的枚举处理器................................................................... 170

    6.3.2 使用自定义的类型处理器 .............................................................................. 172

    6.3.3 对Java 8日期(JSR-310)的支持 ................................................................ 175

    6.4 本章小结 ..................................................................................................................... 176

    第 7章 MyBatis缓存配置 ............................................................................................. 177

    7.1 一级缓存 ..................................................................................................................... 178

    7.2 二级缓存 ..................................................................................................................... 181

    7.2.1 配置二级缓存 .................................................................................................. 181

    7.2.2 使用二级缓存 .................................................................................................. 184

    7.3 集成EhCache缓存 .................................................................................................... 187

    7.4 集成Redis缓存 .......................................................................................................... 190

    7.5 脏数据的产生和避免 ................................................................................................. 191

    7.6 二级缓存适用场景 ..................................................................................................... 194

    7.7 本章小结 ..................................................................................................................... 194

    第 8章 MyBatis插件开发 ............................................................................................. 195

    8.1 拦截器接口介绍 ......................................................................................................... 196

    8.2 拦截器签名介绍 ......................................................................................................... 198

    8.2.1 Executor接口 ................................................................................................... 198

    8.2.2 ParameterHandler接口 .................................................................................... 200

    8.2.3 ResultSetHandler接口 ..................................................................................... 201

    8.2.4 StatementHandler接口 .................................................................................... 202

    8.3 下画线键值转小写驼峰形式插件 ............................................................................. 203

    8.4 分页插件 ..................................................................................................................... 206

    8.4.1 PageInterceptor拦截器类 ................................................................................ 207

    8.4.2 Dialect接口 ...................................................................................................... 212

    8.4.3 MySqlDialect实现 ........................................................................................... 216

    8.5 本章小结 ..................................................................................................................... 220

    目录 │ XV

    第 9章 Spring 集成 MyBatis ......................................................................................... 221

    9.1 创建基本的Maven Web 项目 .................................................................................... 222

    9.2 集成Spring和 Spring MVC ...................................................................................... 227

    9.3 集成 MyBatis .............................................................................................................. 232

    9.4 几个简单实例 ............................................................................................................. 234

    9.4.1 基本准备 .......................................................................................................... 235

    9.4.2 开发 Mapper层(Dao层) ............................................................................ 235

    9.4.3 开发业务层(Service层) ............................................................................. 238

    9.4.4 开发控制层(Controller层) ......................................................................... 240

    9.4.5 开发视图层(View层) ................................................................................. 242

    9.4.6 部署和运行应用 .............................................................................................. 245

    9.5 本章小结 ..................................................................................................................... 246

    第 10 章 Spring Boot集成 MyBatis .............................................................................. 247

    10.1 基本的 Spring Boot项目 ......................................................................................... 248

    10.2 集成MyBatis ............................................................................................................ 251

    10.3 MyBatis Starter配置介绍 ........................................................................................ 253

    10.4 简单示例 ................................................................................................................... 255

    10.4.1 引入 simple依赖............................................................................................ 255

    10.4.2 开发业务(Service)层 ................................................................................ 258

    10.4.3 开发控制(Controller)层 ............................................................................ 259

    10.4.4 运行应用查看效果 ........................................................................................ 259

    10.5 本章小结 ................................................................................................................... 260

    第 11 章 MyBatis 开源项目 ........................................................................................... 261

    11.1 Git入门 ..................................................................................................................... 262

    11.1.1 初次运行配置 ................................................................................................ 262

    11.1.2 初始化和克隆仓库 ........................................................................................ 263

    11.1.3 本地操作 ........................................................................................................ 265

    11.1.4 远程操作 ........................................................................................................ 267

    11.2 GitHub入门 .............................................................................................................. 269

    11.2.1 创建并提交到仓库 ........................................................................................ 269

    更多免费电子书搜索「雅书」 https:yabook.orgXVI │ MyBatis 从入门到精通

    11.2.2 Fork仓库并克隆到本地 ................................................................................ 272

    11.2.3 社交功能 ........................................................................................................ 275

    11.3 MyBatis源码讲解 .................................................................................................... 278

    11.4 MyBatis测试用例 .................................................................................................... 290

    11.5 本章小结 ................................................................................................................... 293

    附录 类型处理器(TypeHandIer) ............................................................................... 295

    第 1 章

    MyBatis入门

    1 chapter

    更多免费电子书搜索「雅书」 https:yabook.org2 │ MyBatis 从入门到精通

    1.1 MyBatis 简介

    MyBatis 的前身是 iBATIS,是 Clinton Begin 在 2001 年发起的一个开源项目,最初侧重于

    密码软件的开发,后来发展成为一款基于 Java 的持久层框架。2004 年,Clinton 将 iBATIS 的名

    字和源码捐赠给了 Apache 软件基金会,接下来的 6 年中,开源软件世界发生了巨大的变化,一

    切开发实践、基础设施、许可,甚至数据库技术都彻底改变了。2010 年,核心开发团队决定离

    开 Apache 软件基金会,并且将 iBATIS 改名为 MyBatis。

    MyBatis 是一款优秀的支持自定义 SQL 查询、存储过程和高级映射的持久层框架,消除了

    几乎所有的 JDBC代码和参数的手动设置以及结果集的检索。 MyBatis可以使用 XML或注解进

    行配置和映射,MyBatis 通过将参数映射到配置的 SQL形成最终执行的 SQL 语句,最后将执行

    SQL 的结果映射成 Java 对象返回。

    与其他的 ORM(对象关系映射)框架不同,MyBatis 并没有将 Java 对象与数据库表关联起

    来,而是将 Java 方法与 SQL语句关联。MyBatis 允许用户充分利用数据库的各种功能,例如存

    储过程、视图、各种复杂的查询以及某数据库的专有特性。如果要对遗留数据库、不规范的数

    据库进行操作,或者要完全控制 SQL的执行,MyBatis 将会是一个不错的选择。

    与 JDBC相比,MyBatis简化了相关代码,SQL语句在一行代码中就能执行。MyBatis提供

    了一个映射引擎,声明式地将 SQL 语句的执行结果与对象树映射起来。通过使用一种内建的类

    XML表达式语言,SQL 语句可以被动态生成。

    MyBatis支持声明式数据缓存(declarative data caching)。当一条 SQL语句被标记为“可缓

    存”后,首次执行它时从数据库获取的所有数据会被存储在高速缓存中,后面再执行这条语句

    时就会从高速缓存中读取结果,而不是再次命中数据库。MyBatis 提供了默认情况下基于 Java

    HashMap 的缓存实现,以及用于与 OSCache、Ehcache、Hazelcast 和 Memcached 连接的默认连

    接器,同时还提供了 API 供其他缓存实现使用。

    MyBatis官方 GitHub 地址为 https:github.commybatis。在官方 GitHub 中可以看到 MyBatis

    的多个子项目。在本书中,我们将学习以下内容。

    · mybatis-3(https:github.commybatismybatis-3):MyBatis 源码,也是本书中主要讲解

    和使用的内容。

    · generator(https:github.commybatisgenerator):代码生成器,可以生成一些常见的基本

    方法,提高工作效率。

    · ehcache-cache (https:github.commybatisehcache-cache):默认集成 Ehcache 的缓存实现。

    · redis-cache(https:github.commybatisredis-cache):默认集成 Redis的缓存实现。 第 1章 MyBatis 入门 │ 3

    · spring(https:github.commybatisspring):方便和 Spring集成的工具类。

    · mybatis-spring-boot(https:github.commybatismybatis-spring-boot): 方 便 和 Spring Boot

    集成的工具类。

    除此之外还有大量和其他项目集成的子项目,如果有需要,学习本书内容之余可以自学其

    他相关的技术。

    1.2 创建 Maven 项目

    Maven 是一个优秀的项目构建和管理工具,后面要学习的内容都会在 Maven构建的项目基

    础上进行讲解和测试,本书中使用 Eclipse 作为开发工具。

    先在 Eclipse 中创建一个基本的 Maven 项目,按照如下步骤进行操作即可。

    · 在 Eclipse 中打开【File】→【New】选择【Other】(或者使用快捷键 Ctrl+N)打开新建

    项目向导,如图 1-1 所示。

    图 1-1 新建项目向导

    · 选择【Maven】下的【Maven Project】,点击【Next】, 如 图 1-2 所示。

    · 选中【Create a simple project(skip archetype selection)】前的复选框,点击【Next】。

    · 输入 Group Id(tk.mybatis)、Artifact Id(simple)、Ver s ion(0.0.1-SNAPSHOT),点击【Finish】。

    更多免费电子书搜索「雅书」 https:yabook.org4 │ MyBatis 从入门到精通

    图 1-2 新建 Maven 项目

    完成以上操作后,等待片刻,一个基于 Maven 的基本结构就创建完成了,得到的 Maven

    项目的目录结构如图 1-3 所示。

    图 1-3 Maven 项目目录结构

    打开 Maven项目的配置文件 pom.xml,可以看到如下配置。

    
    xmlns:xsi=http:www.w3.org2001XMLSchema-instance

    xsi:schemaLocation="http:maven.apache.orgPOM4.0.0

    http:maven.apache.orgxsdmaven-4.0.0.xsd">

    4.0.0

    tk.mybatis

    simple

    0.0.1-SNAPSHOT

    第 1章 MyBatis 入门 │ 5

    

    

    以上是 Maven项目的基本配置信息,我们还需要为它添加一些常用配置。首先,设置源代

    码编码方式为 UTF-8,配置如下。

    

    UTF-8

    接着,设置编译源代码的 JDK 版本。为了增大兼容范围,本书中使用的是 JDK 1.6,配置

    如下。

    

    

    

    maven-compiler-plugin

    

    1.61.6

    至此,基本的 Maven 配置就完成了,但还需要在配置文件中添加一些依赖才能使接下来的

    工作顺利进行。首先,不能忘记最重要的 MyBatis依赖,在 pom.xml 文件中添加 MyBatis的依

    赖坐标,配置如下。

    

    

    org.mybatis

    mybatis

    3.3.0

    

    

    更多免费电子书搜索「雅书」 https:yabook.org6 │ MyBatis 从入门到精通

    可以通过 http:search.maven.org或 http:mvnrepository.com来查找依赖坐标。

    接着,还需要添加会用到的 Log4j、JUnit 和 MySql 驱动的依赖。最终的 pom.xml 文件内容

    如下。

    
    xmlns:xsi="http:www.w3.org2001XMLSchema-instance"

    xsi:schemaLocation="http:maven.apache.orgPOM4.0.0

    http:maven.apache.orgxsdmaven-4.0.0.xsd">

    4.0.0

    tk.mybatis

    simple

    0.0.1-SNAPSHOT

    

    UTF-8

    

    

    junit

    junit

    4.12

    test

    

    org.mybatis

    mybatis

    3.3.0

    

    mysql

    mysql-connector-java

    5.1.38

    

    org.slf4j

    slf4j-api

    1.7.12 第 1章 MyBatis 入门 │ 7

    

    

    org.slf4j

    slf4j-log4j12

    1.7.12

    

    log4j

    log4j

    1.2.17

    

    

    

    maven-compiler-plugin

    

    1.61.6

    当对 Maven的配置进行修改后,还需要在项目上单击鼠标右 键 ,在【Maven】中 选 择【Update

    Project...】(或者直接选中项目,按 Alt+F 快捷键)来更新外部依赖的 jar 包。

    完成上述步骤后,MyBatis 的基本开发环境就已经准备好了,在接下来的 1.3 节中,我们会

    使用 Eclipse 实现一个简单的 Mybatis 示例。

    1.3 简单配置让MyBatis跑起来

    这一节将通过一个 MyBatis 的简单例子让大家对 MyBatis 有一个初步的了解。在操作过程

    中,建议初学者按照书中的步骤进行,如果已经了解各项配置之间的关系,也可以按照自己习

    惯的方式对配置进行调整。

    更多免费电子书搜索「雅书」 https:yabook.org8 │ MyBatis 从入门到精通

    1.3.1 准备数据库

    首先创建一个数据库,编码方式设为 UTF-8,可以使用 MySQL 客户端工具 Navicat 来实

    现。通过执行下面的 SQL 语句创建一个名为 mybatis 的数据库。

    CREATE DATABASE mybatis DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

    然后再创建一个名为 country 的表并插入一些简单的数据,代码如下。

    use mybatis;

    CREATE TABLE `country` (

    `id` int NOT NULL AUTO_INCREMENT ,`countryname` varchar(255) NULL ,`countrycode` varchar(255) NULL ,PRIMARY KEY (`id`));

    insert country(`countryname`,`countrycode`)

    values ('中国','CN'),('美国','US'),('俄罗斯','RU'),('英国','GB'),('法国','FR');

    准备好表和简单的数据后,继续来配置 MyBatis。

    1.3.2 配置MyBatis

    配置 MyBatis 有多种方式,本节使用最基础最常用的 XML形式进行配置。

    除 XML 方式外,在后面介绍和 Spring 集成的时候还会使用 Spring bean 方式进行配置,另外还可以通过 Java编码方式进行配置。由于 Java 编码配置方式不常用,因此在本书中没有

    涉及。

    使用 XML形式进行配置,首先在 srcmainresources 下面创建 mybatis-config.xml 配置文件,然后输入如下内容。

    

    
    PUBLIC "-mybatis.orgDTD Config 3.0EN"

    "http:mybatis.orgdtdmybatis-3-config.dtd">

    

    注意! 第 1章 MyBatis 入门 │ 9

    

    

    

    

    

    

    

    

    
    value="jdbc:mysql:localhost:3306 mybatis">

    

    

    

    

    简单讲解一下这个配置。

    · 中的 logImpl 属性配置指定使用 LOG4J 输出日志。

    · 元素下面配置了一个包的别名,通常确定一个类的时候需要使用类的

    全限定名称,例如 tk.mybatis.simple.model.Country。在 MyBatis中需要频繁

    用到类的全限定名称,为了方便使用,我们配置了 tk.mybatis.simple.model 包,这样配置后,在使用类的时候不需要写包名的部分,只使用 Country 即可。

    · 环境配置中主要配置了数据库连接,数据库的 url 为

    jdbc:mysql:localhost:3306mybatis,使用的是本机 MySQL 中的 mybatis

    数据库,后面的 username 和 password 分别是数据库的用户名和密码(如果你的数

    更多免费电子书搜索「雅书」 https:yabook.org10 │ MyBatis 从入门到精通

    据库用户名及密码和这里的不一样,请修改为自己数据库可用的用户名和密码)。

    · 中配置了一个包含完整类路径的 CountryMapper.xml,这是一个 MyBatis的

    SQL 语句和映射配置文件,这个 XML文件会在后面的章节中介绍。

    1.3.3 创建实体类和 Mapper.xmI文件

    MyBatis 是一个结果映射框架,这里创建的实体类实际上是一个数据值对象(Data Value

    Object),在实际应用中,一个表一般会对应一个实体,用于 INSERT、UPDATE、DELETE 和

    简单的 SELECT 操作,所以姑且称这个简单的对象为实体类。

    关于 Mapper 的命名方式:在 MyBatis 中,根据 MyBatis 官方的习惯,一般用 Mapper 作

    为 XML和接口类名的后缀,这里的 Mapper和我们常用的 DAO 后缀类似,只是一种习惯而已,本书中全部使用 Mapper 后缀。通常称 XML 为 Mapper.xml 文件,称接口为 Mapper 接口,在

    实际应用中可以根据自己的需要来定义命名方式。

    在 srcmainjava 下创建一个基础的包 tk.mybatis.simple,在这个包下面再创建 model 包。

    根据数据库表 country,在 model 包下创建实体类 Country,代码如下。

    package tk.mybatis.simple.model;

    public class Country {

    private Long id;

    private String countryname;

    private String countrycode;

    getter 和 setter方法

    }

    在 srcmainresources 下面创建 tkmybatissimplemapper 目录,再在该目录下面创建

    CountryMapper.xml 文件,添加如下内容。

    

    
    "http:mybatis.orgdtdmybatis-3-mapper.dtd" >

    

    

    SQL 定义在 CountryMapper.xml 文件中,里面的配置作用如下。

    · :XML 的根元素,属性 namespace 定义了当前 XML的命名空间。

    · 部分的代码。

    

    
    "http:mybatis.orgdtdmybatis-3-mapper.dtd" >

    

    

    

    

    

    

    

    

    
    jdbcType= "TIMESTAMP">

    

    前面创建接口和 XML 时提到过,接口和 XML 是通过将 namespace 的值设置为接口的全

    限定名称来进行关联的,那么接口中方法和 XML 又是怎么关联的呢?

    可以发现,XML 中的 select 标签的 id 属性值和定义的接口方法名是一样的。MyBatis

    就是通过这种方式将接口方法和 XML中定义的 SQL语句关联到一起的,如果接口方法没有和

    XML中的 id 属性值相对应,启动程序便会报错。映射 XML和接口的命名需要符合如下规则。

    · 当只使用 XML 而不使用接口的时候, namespace 的值可以设置为任意不重复的名称。

    · 标签的 id 属性值在任何时候都不能出现英文句号“.” ,并且同一个命名空间下不能出

    现重复的 id。

    · 因为接口方法是可以重载的,所以接口中可以出现多个同名但参数不同的方法,但是

    XML 中 id 的值不能重复,因而接口中的所有同名方法会对应着 XML 中的同一个 id

    的方法。最常见的用法就是,同名方法中其中一个方法增加一个 RowBound 类型的参

    数用于实现分页查询。 第 2章 MyBatis XML方式的基本用法 │ 25

    明白上述两者之间的关系后,通过 UserMapper.xml 先来了解一下 XML 中一些标签和属性

    的作用。

    · 部分的代码。

    

    这个接口中对应方法的返回值类型为 List,为什么不是 SysUser 呢?

    在定义接口中方法的返回值时,必须注意查询 SQL可能返回的结果数量。

    当返回值最多只有 1 个结果的时候(可以 0 个),可以将接口返回值定义为 SysUser,而

    不是 List。当然,如果将返回值改为 List或 SysUser[],也没有

    问题,只是不建议这么做。当执行的 SQL 返回多个结果时,必须使用 List

    SysUser[]作为返回值,如果使用 SysUser,就会抛出 TooManyResultsException 异常。

    观察一下 UserMapper.xml 中 selectById 和 selectAll 的区别:selectById 中使用

    了 resultMap 来设置结果映射,而 selectAll 中则通过 resultType 直接指定了返回结果

    的类型。可以发现,如果使用 resultType 来设置返回结果的类型,需要在 SQL 中为所有列

    名和属性名不一致的列设置别名,通过设置别名使最终的查询结果列和 resultType 指定对象

    的属性名保持一致,进而实现自动映射。

    可以通过在 resultMap 中配置 property 属性和 column 属性的映射,或者在 SQL中

    设置别名这两种方式实现将查询列映射到对象属性的目的。

    property 属性或别名要和对象中属性的名字相同,但是实际匹配时,MyBatis会先将两

    者都转换为大写形式,然后再判断是否相同,即 property="userName"和 property=

    "username"都可以匹配到对象的userName属性上。判断是否相同的时候要使用USERNAME,因此在设置 property 属性或别名的时候,不需要考虑大小写是否一致,但是为了便于阅读,要尽可能按照统一的规则来设置。

    在数据库中,由于大多数数据库设置不区分大小写,因此下画线方式的命名很常见,如

    名称映射规则

    更多免费电子书搜索「雅书」 https:yabook.org28 │ MyBatis 从入门到精通

    user_name、 user_email。在 Java 中,一般都使用驼峰式命名,如 userName、 userEmail。

    因为数据库和 Java 中的这两种命名方式很常见,因此 MyBatis 还提供了一个全局属性

    mapUnderscoreToCamelCase,通过配置这个属性为 true 可以自动将以下画线方式命名的

    数据库列映射到 Java 对象的驼峰式命名属性中。这个属性默认为 false,如果想要使用该功能,需要在 MyBatis的配置文件(第 1 章中的 mybatis-config.xml 文件)中增加如下配置。

    

    

    

    使用上述配置的时候,前面的 selectAll 可以改写如下。

    

    还可以将 SQL 简单写为 select from sys_user,但是考虑到性能,通常都会指定

    查询列,很少使用代替所有列。

    了解上面这些要点之后,基本的查询就难不倒我们了。接下来通过测试用例来验证上面的

    两个查询。在学习过程中,建议大家在有不同想法的时候,多写一些例子来验证自己的问题或

    猜测。

    为了方便大家学习后面的大量测试,此处先根据第 1 章中的测试提取一个基础测试类

    BaseMapperTest。

    基础测试类

    public class BaseMapperTest {

    private static SqlSessionFactory sqlSessionFactory;

    @BeforeClass

    public static void init{

    try { 第 2章 MyBatis XML方式的基本用法 │ 29

    Reader reader = Resources.getResourceAsReader("mybatis-config.xml");

    sqlSessionFactory = new SqlSessionFactoryBuilder.build(reader);

    reader.close;

    } catch (IOException ignore) {

    ignore.printStackTrace;

    }

    }

    public SqlSession getSqlSession{

    return sqlSessionFactory.openSession;

    }

    }

    将原来的 CountryMapperTest 测试类修改如下。

    public class CountryMapperTest extends BaseMapperTest {

    @Test

    public void testSelectAll{

    SqlSession sqlSession = getSqlSession;

    try {

    List countryList =

    sqlSession.selectList("tk.mybatis.simple.mapper

    .CountryMapper.selectAll");

    printCountryList(countryList);

    } finally {

    不要忘记关闭 sqlSession

    sqlSession.close;

    }

    }

    private void printCountryList(List countryList){

    for(Country country : countryList){

    System.out.printf("%-4d%4s%4s\n",country.getId,country.getCountryname,country.getCountrycode);

    }

    }

    }

    修改后的测试类继承了 BaseMapperTest,通过调用 getSqlSession方法获取一个

    SqlSession 对象,另外由于在 UserMapper 中添加了一个 selectAll 方法,因此

    CountryMapperTest 中的 selectAll 方法不再唯一,调用时必须带上 namespace(命名

    更多免费电子书搜索「雅书」 https:yabook.org30 │ MyBatis 从入门到精通

    空间),因此这里要改为 tk.mybatis.simple.mapper.CountryMapper.selectAll。修

    改后,运行该测试类保证其可以正常运行。

    参考 CountryMapperTest 测试类,可以模仿着编写一个 UserMapperTest 测试类,代

    码如下。

    public class UserMapperTest extends BaseMapperTest {

    @Test

    public void testSelectById{

    获取 sqlSession

    SqlSession sqlSession = getSqlSession;

    try {

    获取 UserMapper 接口

    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    调用 selectById 方法,查询 id = 1的用户

    SysUser user = userMapper.selectById(1l);

    user 不为空

    Assert.assertNotNull(user);

    userName = admin

    Assert.assertEquals("admin", user.getUserName);

    } finally {

    不要忘记关闭 sqlSession

    sqlSession.close;

    }

    }

    @Test

    public void testSelectAll{

    SqlSession sqlSession = getSqlSession;

    try {

    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    调用 selectAll 方法查询所有用户

    List userList = userMapper.selectAll;

    结果不为空

    Assert.assertNotNull(userList);

    用户数量大于 0 个

    Assert.assertTrue(userList.size > 0);

    } finally {

    不要忘记关闭 sqlSession

    sqlSession.close;

    }

    }

    } 第 2章 MyBatis XML方式的基本用法 │ 31

    右键单击该类,在 Run As 选项中选择 JUnit Test 执行测试,测试通过,输出如下日志。

    DEBUG [main] - ==> Preparing: select id, user_name userName,user_password userPassword,user_email userEmail,user_info userInfo,head_img headImg,create_time createTime

    from sys_user

    DEBUG [main] - ==> Parameters:

    TRACE [main] - <== Columns: id, userName, userPassword, userEmail,userInfo, headImg, createTime

    TRACE [main] - <== Row: 1, admin, 123456, admin@mybatis.tk,<>, <>, 2016-04-01 17:00:58.0

    TRACE [main] - <== Row: 1001, test, 123456, test@mybatis.tk,<>, <>, 2016-04-01 17:01:52.0

    DEBUG [main] - <== Total: 2

    DEBUG [main] - ==> Preparing: select from sys_user where id = ?

    DEBUG [main] - ==> Parameters: 1(Long)

    TRACE [main] - <== Columns: id, user_name, user_password, user_email,user_info, head_img, create_time

    TRACE [main] - <== Row: 1, admin, 123456, admin@mybatis.tk,<>, <>, 2016-04-01 17:00:58.0

    DEBUG [main] - <== Total: 1

    通过日志输出的结果可以验证之前的代码。

    上面两个SELECT 查询仅仅是简单的单表查询,这里列举的是两种常见的情况,在实际业务

    中还需要多表关联查询,关联查询结果的类型也会有多种情况,下面来列举一些复杂的用法。

    第一种简单的情形:根据用户 id 获取用户拥有的所有角色,返回的结果为角色集合,结

    果只有角色的信息,不包含额外的其他字段信息。这个方法会涉及 sys_user、sys_role 和

    sys_user_role 这 3 个表,并且该方法写在任何一个对应的 Mapper 接口中都可以。将这个

    方法写到 UserMapper 中,代码如下。

    根据用户 id获取角色信息

    @param userId

    @return

    更多免费电子书搜索「雅书」 https:yabook.org32 │ MyBatis 从入门到精通

    List selectRolesByUserId(Long userId);

    在对应的 UserMapper.xml 中添加如下代码。

    

    虽然这个多表关联的查询中涉及了 3 个表,但是返回的结果只有 sys_role 表中的信息,所以直接使用 SysRole 作为返回值类型即可。大家可以参照之前的测试示例编写代码对此方

    法进行测试。

    为了说明第二种情形,我们设置一个需求(仅为了说明用法):以第一种情形为基础,假设

    查询的结果不仅要包含 sys_role 中的信息,还要包含当前用户的部分信息(不考虑嵌套的情

    况),例如增加查询列 u.user_name as userName。这时 resultType 该如何设置呢?

    先介绍两种简单的方法,第一种方法就是在 SysRole 对象中直接添加 userName 属性,这样仍然使用 SysRole 作为返回值,或者也可以创建一个如下所示的对象。

    public class SysRoleExtend extends SysRole {

    private String userName;

    public String getUserName {

    return userName;

    }

    public void setUserName(String userName) {

    this.userName = userName;

    }

    }

    将 resultType 设置为扩展属性后的 SysRoleExtend 对象,通过这种方式来接收多余

    的值。这种方式比较适合在需要少量额外字段时使用,但是如果需要其他表中大量列的值时,这种方式就不适用了,因为我们不能将一个类的属性都照搬到另一个类中。 第 2章 MyBatis XML方式的基本用法 │ 33

    针对这种情况,在不考虑嵌套 XML 配置(第 6 章会详细讲解)的情况下,可以使用第二

    种方法,代码如下。

    角色表

    public class SysRole {

    其他原有字段...

    用户信息

    private SysUser user;

    直接在 SysRole 中增加 SysUser 对象,字段名为 user,增加这个字段后,修改 XML

    中的 selectRolesByUserId 方法。

    

    注意看查询列增加的两行,如下所示。

    u.user_name as "user.userName",u.user_email as "user.userEmail"

    这里在设置别名的时候,使用的是“user.属性名” ,user 是 SysRole 中刚刚增加的属

    性,userName 和 userEmail 是 SysUser 对象中的属性,通过这种方式可以直接将值赋给

    user 字段中的属性。

    在 UserMapperTest 中执行如下测试代码。

    @Test

    public void testSelectRolesByUserId{

    SqlSession sqlSession = getSqlSession;

    更多免费电子书搜索「雅书」 https:yabook.org34 │ MyBatis 从入门到精通

    try {

    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    调用 selectRolesByUserId 方法查询用户的角色

    List roleList = userMapper.selectRolesByUserId(1L);

    结果不为空

    Assert.assertNotNull(roleList);

    角色数量大于 0个

    Assert.assertTrue(roleList.size > 0);

    } finally {

    不要忘记关闭 sqlSession

    sqlSession.close;

    }

    }

    输出日志如下。

    DEBUG [main] - ==> Preparing: select r.id, r.role_name roleName, r.enabled,r.create_by createBy,r.create_time createTime,u.user_name as "user.userName",u.user_email as "user.userEmail"

    from sys_user u

    inner join sys_user_role ur

    on u.id = ur.user_id

    inner join sys_role r

    on ur.role_id = r.id

    where u.id = ?

    DEBUG [main] - ==> Parameters: 1(Long)

    TRACE [main] - <== Columns: id, roleName, enabled, createBy, createTime,user.userName, user.userEmail

    TRACE [main] - <== Row: 1, 管理员, 1, 1, 2016-04-01 17:02:14.0,admin, admin@mybatis.tk

    TRACE [main] - <== Row: 2, 普通用户, 1, 1, 2016-04-01 17:02:34.0,admin, admin@mybatis.tk

    DEBUG [main] - <== Total: 2

    从输出日志中可以很明显看到增加的两列,但是看不到对象中的效果。在 Assert.

    assertNotNull(roleList);这一行设置断点,可以看到当前实例的状态如图2-2所示。

    以上是两种简单方式的介绍,在本书后续章节中还会介绍通过 resultMap 处理这种嵌套

    对象的方式。

    关于 select 方法的基本内容就先介绍这么多,下面来看 insert 用法。 第 2章 MyBatis XML方式的基本用法 │ 35

    图 2-2 roleList 状态

    2.4 insert 用法

    和上一节的 select 相比,insert 要简单很多。只有让它返回主键值时,由于不同数据

    库的主键生成方式不同,这种情况下会有一些复杂。首先从最简单的 insert 方法开始学 ......

您现在查看是摘要介绍页, 详见PDF附件(3551KB,314页)