MyBatis从入门到精通(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-17 01:00:53

点击下载

作者:刘增辉

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

MyBatis从入门到精通

MyBatis从入门到精通试读:

前言

自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。

阅读准备

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

· 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 代码生成器可以减轻基本用法中最繁重的那部分书写工作带来的压力。通过本章的学习,可以使用代码生成器快速生成大量基础的方法,让大家更专注于业务代码的开发,从枯燥的基础编码中解脱出来。

第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丰富的测试用例为读者提供更多更有用的学习内容。

致谢

从决定写书,到这本书能够出版,中间经历了很多,因此深感来之不易。在这个过程中,要感谢所有为本书做出过贡献的人。感谢我的父母对我事业的默默支持。感谢我的妻子参与了本书的审校工作,给我提供了许多宝贵意见。感谢我的朋友黄勇、熔岩、杨新伦、悠然在百忙之中抽出时间为我的新书作序推荐。感谢博文视点的策划编辑孙奇俏的持续跟进和大力协助,同时感谢电子工业出版社和博文视点的其他老师给予本书的专业意见。最后,感谢每一位阅读本书的读者,希望本书能给您带来帮助。衷心感谢大家。

联系作者

由衷地感谢大家购买此书,希望大家会喜欢,也希望这本书能够为各位读者带来所希望获得的知识。虽然我已经非常细心地检查书中所提到的所有内容,但仍有可能存在疏漏,若大家在阅读过程中发现错误,在此我先表示歉意。欢迎各位读者对本书的内容和相关源代码发表意见和评论。大家可以通过我的个人邮箱 abel533@gmail.com 与我取得联系,我会一一解答每个人的疑惑。

本书资源

扫码或输入地址http://mybatis.tk进入MyBatis技术网站。网站中提供了大量MyBatis的相关内容,同时可下载本书相关资源。第1章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.com/mybatis。在官方GitHub中可以看到MyBatis的多个子项目。在本书中,我们将学习以下内容。

· mybatis-3(https://github.com/mybatis/mybatis-3):MyBatis 源码,也是本书中主要讲解和使用的内容。

· generator(https://github.com/mybatis/generator):代码生成器,可以生成一些常见的基本方法,提高工作效率。

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

· redis-cache(https://github.com/mybatis/redis-cache):默认集成Redis的缓存实现。

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

· mybatis-spring-boot(https://github.com/mybatis/mybatis-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)、Version(0.0.1-SNAPSHOT),点击【Finish】。图1-2 新建Maven项目

完成以上操作后,等待片刻,一个基于 Maven 的基本结构就创建完成了,得到的 Maven项目的目录结构如图1-3所示。图1-3 Maven项目目录结构

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

以上是Maven项目的基本配置信息,我们还需要为它添加一些常用配置。首先,设置源代码编码方式为UTF-8,配置如下。

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

至此,基本的Maven配置就完成了,但还需要在配置文件中添加一些依赖才能使接下来的工作顺利进行。首先,不能忘记最重要的 MyBatis依赖,在pom.xml文件中添加MyBatis的依赖坐标,配置如下。

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

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

当对Maven的配置进行修改后,还需要在项目上单击鼠标右键,在【Maven】中选择【Update Project...】(或者直接选中项目,按Alt+F快捷键)来更新外部依赖的jar包。

完成上述步骤后,MyBatis的基本开发环境就已经准备好了,在接下来的1.3节中,我们会使用Eclipse实现一个简单的Mybatis示例。1.3 简单配置让MyBatis跑起来

这一节将通过一个MyBatis的简单例子让大家对MyBatis有一个初步的了解。在操作过程中,建议初学者按照书中的步骤进行,如果已经了解各项配置之间的关系,也可以按照自己习惯的方式对配置进行调整。1.3.1 准备数据库

首先创建一个数据库,编码方式设为 UTF-8,可以使用MySQL客户端工具 Navicat 来实现。通过执行下面的SQL语句创建一个名为mybatis的数据库。

CREATE DATABASE mybatis DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

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

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

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

注意!

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

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

简单讲解一下这个配置。

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

· <typeAliases>元素下面配置了一个包的别名,通常确定一个类的时候需要使用类的全限定名称,例如tk.mybatis.simple.model.Country。在MyBatis中需要频繁用到类的全限定名称,为了方便使用,我们配置了 tk.mybatis.simple.model包,这样配置后,在使用类的时候不需要写包名的部分,只使用Country即可。

· <environments>环境配置中主要配置了数据库连接,数据库的 url 为jdbc:mysql://localhost:3306/mybatis,使用的是本机 MySQL 中的 mybatis数据库,后面的username和password分别是数据库的用户名和密码(如果你的数据库用户名及密码和这里的不一样,请修改为自己数据库可用的用户名和密码)。

· <mappers>中配置了一个包含完整类路径的CountryMapper.xml,这是一个MyBatis的SQL语句和映射配置文件,这个XML文件会在后面的章节中介绍。1.3.3 创建实体类和Mapper.xml文件

MyBatis 是一个结果映射框架,这里创建的实体类实际上是一个数据值对象(Data Value Object),在实际应用中,一个表一般会对应一个实体,用于 INSERT、UPDATE、DELETE 和简单的SELECT操作,所以姑且称这个简单的对象为实体类。

提示!

关于Mapper的命名方式:在MyBatis中,根据MyBatis官方的习惯,一般用Mapper作为XML和接口类名的后缀,这里的Mapper和我们常用的DAO后缀类似,只是一种习惯而已,本书中全部使用Mapper后缀。通常称XML为Mapper.xml文件,称接口为Mapper接口,在实际应用中可以根据自己的需要来定义命名方式。

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

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

在 src/main/resources 下面创建 tk/mybatis/simple/mapper 目录,再在该目录下面创建CountryMapper.xml文件,添加如下内容。

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

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

· <select>元素:我们所定义的一个SELECT查询。

· id属性:定义了当前SELECT查询的唯一一个id。

· resultType:定义了当前查询的返回值类型,此处就是指实体类 Country,前面配置中提到的别名主要用于这里,如果没有设置别名,此处就需要写成resultType="tk.mybatis.simple.model.Country"。

· select id,...:查询SQL语句。

创建好实体和Mapper.xml后,接下来要有针对性地配置Log4j,让MyBatis在执行数据库操作的时候可以将执行的SQL和其他信息输出到控制台。1.3.4 配置Log4j以便查看MyBatis操作数据库的过程

在src/main/resources中添加log4j.properties配置文件,输入如下内容。

日志注意事项!

用过 Log4j 日志组件的人可能都会知道,配置中的 log4j.logger.tk.mybatis.simple.mapper对应的是tk.mybatis.simple.mapper包,但是在这个例子中,Java目录下并没有这个包名,只在资源目录下有mapper目录。

在MyBatis的日志实现中,所谓的包名实际上是XML配置中的namespace属性值的一部分。后面章节中介绍结合接口使用的相关内容时,由于 namespace 属性值必须和接口全限定类名相同,因此才会真正对应到Java中的包。当使用纯注解方式时,使用的就是纯粹的包名。

MyBatis日志的最低级别是 TRACE,在这个日志级别下,MyBatis会输出执行 SQL过程中的详细信息,这个级别特别适合在开发时使用。

配置好Log4j后,接下来就可以编写测试代码让MyBatis跑起来了。1.3.5 编写测试代码让MyBatis跑起来

首先在 src/test/java 中创建 tk.mybatis.simple.mapper 包,然后创建 CountryMapperTest测试类,代码如下。

对上面这段代码做一个简单的说明,具体如下。

· 通过Resources工具类将mybatis-config.xml配置文件读入Reader。

· 再通过SqlSessionFactoryBuilder建造类使用Reader创建SqlSessionFactory工厂对象。在创建SqlSessionFactory对象的过程中,首先解析mybatis-config.xml配置文件,读取配置文件中的mappers配置后会读取全部的Mapper.xml进行具体方法的解析,在这些解析完成后,SqlSessionFactory就包含了所有的属性配置和执行SQL的信息。

· 使用时通过SqlSessionFactory工厂对象获取一个SqlSession。

· 通过SqlSession的selectList方法查找到CountryMapper.xml中id="selectAll"的方法,执行SQL查询。

· MyBatis底层使用JDBC执行SQL,获得查询结果集ResultSet后,根据resultType的配置将结果映射为Country类型的集合,返回查询结果。

· 这样就得到了最后的查询结果countryList,简单将结果输出到控制台。

· 最后一定不要忘记关闭 SqlSession,否则会因为连接没有关闭导致数据库连接数过多,造成系统崩溃。

上面的测试代码成功执行后,会输出如下日志。

从日志中可以看到完整的SQL输出和结果输出,从日志对应的级别可以发现SQL、参数、结果数都是DEBUG级别,具体的查询结果列和数据都是TRACE级别。

通过一系列的操作,我们让一个简单的 MyBatis 例子跑了起来,相信大家现在对 MyBatis已经有了初步的了解。

提示!

simple项目下载地址:http://mybatis.tk/book/simple-start.zip。

在学习这部分代码时,如果程序无法运行,或者不知道这些配置和测试类该写到哪里,都可以从该网址下载这部分的完整代码,通过对比来解决问题,或者直接使用这部分基础代码来继续学习接下来的内容。1.4 本章小结

在本章中,我们对MyBatis有了一个简单的认识,学习了如何创建一个使用Maven管理的项目,涉及了一些MyBatis的简单配置以及使用方法,并让一个简单的MyBatis项目跑了起来。在后面的章节中,我们会继续深入地学习MyBatis的各项配置以及各种常见的、复杂的用法。第2章MyBatis XML方式的基本用法

我们设定了一个简单的权限控制需求,采用RBAC(Role-Based Access Control,基于角色的访问控制)方式,这个简单的权限管理将会贯穿整本书中的所有示例。本章将通过完成权限管理的常见业务来学习MyBatis XML方式的基本用法。2.1 一个简单的权限控制需求

在这里简单描述一下权限管理的需求:一个用户拥有若干角色,一个角色拥有若干权限,权限就是对某个资源(模块)的某种操作(增、删、改、查),这样就构成了“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间、角色与权限之间,一般是多对多的关系,如图2-1所示。图2-1 RBAC2.1.1 创建数据库表

首先,要创建五个表:用户表、角色表、权限表、用户角色关系表和角色权限关系表。在已经创建好的mybatis数据库中执行如下SQL脚本。

为了方便对表进行直接操作,此处没有创建表之间的外键关系。对于表之间的关系,会通过业务逻辑来进行限制。

为了方便后面的测试,先在表中插入一些测试数据,SQL脚本如下。

当创建好基本的5个表,并且准备好上述测试数据之后,就可以开始进行简单编码了。2.1.2 创建实体类

MyBatis 默认是遵循“下画线转驼峰”命名方式的,所以在创建实体类时一般都按照这种方式进行创建。由于上面5个表比较类似,因此这里给出用户表和用户角色关联表所对应的实体,另外3个表大家按照相同的规则编写即可。

先看第一个,用户表对应的实体类SysUser的代码如下。

对于 SysUser 实体类,首先需要注意的就是命名方式,它的类名和字段名都采用了“下画线转驼峰”方式。具体采用什么样的命名方式并不重要(方式一致即可),在后面使用这些对象的时候,可以通过resultMap对数据库的列和类的字段配置映射关系。

在MyBatis中,关于数据库字段和Java类型的对应关系,不需要刻意去记,但需要注意一个特殊的类型“byte[]”。这个类型一般对应数据库中的 BLOB、LONGVARBINARY 以及一些和二进制流有关的字段类型,其他类型详细的对应关系可以查看本书附录的内容。

特别注意!

由于Java中的基本类型会有默认值,例如当某个类中存在private int age;字段时,创建这个类时,age会有默认值0。当使用age属性时,它总会有值。因此在某些情况下,便无法实现使age为null。并且在动态SQL的部分,如果使用age!=null进行判断,结果总会为true,因而会导致很多隐藏的问题。

所以,在实体类中不要使用基本类型。基本类型包括byte、int、short、long、float、double、char、boolean。

再来看另一个实体类SysUserRole,代码如下。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载