《深入浅出MyBatis--技术原理与实战》读书笔记

2017年11月30日

       这本书目前为止我仔细看到了第6章,还有3章没有仔细看,这本书的确如作者所说,基于官方文档,因为我仔细读过mybatis的官方文档,基本和官方文档一致,不过官方文档有些不太重要的部分,该书没有讨论。同时还有一些作者对于mybatis运行机制的简单讲解,还有一些实战经验,总的的来说此书还是值得一读。这里有个问题就是源码的问题,该书是博文出的,在博文该书的主页上没有源码下载,其实这本书的大部分章节原封不动的移到了《Java EE互联网轻量级框架整合开发》,这本书在博文的主页上是有源码链接下载的。


2017年11月2日

前言

       移动互联网的特点是大数据高并发、对服务器往往要求分布式、高性能、高灵活等,而传统模式的Java数据库编程框架已经不再适用了。在这样的背景下,一个Java持久层框架MyBatis走入了我们的世界,它以封装少、高性能、可优化、维护简单。它特别适合分布式和大数据网络数据库的编程。

      其实我一直对分布式数据库和大数据网络数据库不太理解。

      MyBatis (独立使用)有两个子项目,一个是MyBatis-Spring(和Spring一起结合使用),还有一个是MyBatis-Guice(MyBatis-Guice子项目是干什么的?)

      MyBatis-Spring:正如第二版那样,Spring 3.0 也仅支持 iBatis2。那么,我们就想将 MyBatis3 的支持添加 到 Spring3.0(参考 Spring Jira 中的问题)中。而不幸的是,Spring 3.0 的开发在 MyBatis 3.0 官方发布前就结束了。 因为 Spring 开发团队不想发布一个基于非发布版的 MyBatis 的整合支 持,那么 Spring 官方的支持就不得不继续等待了。要在 Spring 中支持 MyBatis,MyBatis 社 区认为现在应该是自己团结贡献者和有兴趣的人一起来开始将 Spring 的整合作为 MyBatis 社 区的子项目的时候了。

      MyBatis-Guice:好像是通过官方的方式实现IOC。

作者邮箱:ykzhen2013@163.com

作者博客:http://blog.csdn.net/ykzhen2015


第1章

  • JDBC大概的工作步骤:
  • 使用jdbc编程需要连接数据库,注册驱动和数据库信息。
  • 操作Connection,打开Statement对象。
  • 通过Statement执行SQL,返回结果到ResultSet对象。
  • 使用ResultSet读取数据,然后通过代码转化为具体的POJO对象。
  • 关闭数据库相关资源。针对于资源型对象,一定要记得主动关闭。
    JDBC是由SUN公司提出的一系列规范,但是它只定义了接口规范,而具体的实现是交由各个数据库厂商去实现的,因为每个数据库都有其特殊性,这些是Java规范没有办法确定的,所以JDBC就是一种典型的桥接模式

   JDBC的弊端:其一,工作量相对较大。我们需要先连接,然后处理JDBC底层事务,处理数据类型。我们还需要操作Connection对象、Statement对象和ResultSet对象去拿到数据,并准确关闭它们。其二,我们要对JDBC的编程可能产生的异常进行捕捉处理并正确关闭资源。

       Hibernate屏蔽了SQL,那就意味着只能全表映射,但是一张表可能有几十到上百字段,而你感兴趣的只有2个,这是Hibernate无法适应的。尤其是大型网站系统,对传输数据有严格的规定,不能浪费宽带的场景下就更为明显了。有很复杂的场景需要关联多张表,Hibernate全表逐级取对象的方法也只能做罢,写SQL还需要手工的映射取数据,这带来了很大的麻烦。此外,如果我们需要优化SQL,Hibernate也是无法做到的。

Hibernate的缺点:

----全表映射带来的不便,比如更新时需要发送所有的字段。

----无法根据不同的条件组装不同的SQL。

----对多表关联和复杂SQL查询支持较差,需要自己写SQL,返回后,需要自己将数据组装为POJO。

----不能有效支持存储过程。

----虽然有HQL,但是性能较差。大型网站往往需要优化SQL,而Hibernate做不到。


这里讲解的通过映射类来讲解例子的时候,我都没发现可以在映射类里面可以不用写sql代码,而是通过命名空间的对应,使用xml中的代码。

历史上,MyBatis的前身是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到GitHub,所以目前MyBatis是由GitHub维护的。


2017年11月3日

第二章 MyBatis入门

学习编程是一门实践科学,只有一边编写代码一边学习才会有好的效果。

MyBatis提供两种方式创建SqlSessionFactory:

  • 一种是XML配置的方式(推荐),这样一方面可以避免硬编码,一方面方便日后配置人员的修改,避免重复编码;
  • 另外一种是代码的方式。

2017年11月15日

上述说到的两种方式,通过代码的方式的好处是,可以让关键信息在XML文件中不可见。达到加密的目的。

红框处检查文档正确性的配置文件。其实这个地方的深入理解应该好好看看《Java核心卷 2》里面关于XML的讨论章节。


2017年11月4日

SqlSession使用完毕后一定要关闭,如果不及时关闭资源,数据库的连接资源将很快被耗尽,系统很快因为数据库资源的匮乏而瘫痪。

生命周期

SqlSessionFactoryBuilder  存在于方法的局部

SqlSessionFactory  单例模式,MyBatis生命周期

SqlSession  一个请求数据库事务处理的过程

Mapper  它最大的范围和SqlSession是相同的



log4j是个什么鬼东西?并且第二章最后,我实现了书中的demo,但是最后log4j没有工作,弹出的警告。为什么要使用log4j?要读入默认配置后就可以运行起来了。主要是哟梊一句BasicConfigurator.configure();可以通过属性文件来配置日志输出格式相关规则。

session打开后一定要记着关闭,出现错误后一定要记得回滚。

SqlSession的用途主要有两种:

  • 获取映射器,让映射器通过命名空间和方法名称找到对应的SQL,发送给数据库执行后返回结果。
  • 直接通过命名信息去执行SQL返回结果,这是iBatis版本留下的方式。

2017年11月27日

第三章 配置

如下的MyBatis配置XML文件的层次结构是不能够颠倒顺序的,如果颠倒顺序,MyBatis在解析XML文件的时候就会出现异常。



MyBatis配置XML文件的层次结构。注意,这些层次是不可以颠倒顺序的,如果颠倒顺序,MyBatis在解析的时候就会出现异常。

更多的时候,我们希望使用properties配置文件来配置属性值,以方便我们在多个配置文件中重复使用它们,也方便日后维护和随时修改。在MBatis中的配置方法是引入属性文件

<properties resources="属性文件名">


通过方法参数传递的属性具有最高优先级,resource/url属性中指定的配置文件次之,最低优先级的是properties属性中指定的属性。


系统定义的别名中,有些是支持数组的。意思就是可以有这样的类型int,map就不支持数组,所以其不能有这样的形式map[]。

MyBatis系统处理枚举类型有两个默认的方式,一个是EnumOrdinalTypeHandler,处理枚举时会将枚举对象转换为整形,即其下下标,第一个枚举对象对应的下标为0;另外一个是EnumTypeHandler,其处理方式是名称直接将枚举对象的名字转换为字符串。


如何配置JNDI数据源?


databaseIdProvider数据库厂商标识


2017年11月6日

JDBC的使用大概可以分为下面几步

--使用JDBC编程需要连接数据库,注册驱动和数据库信息。

--操作Connection,打开Statement。

--通过Statement执行SQL,返回结果到ResultSet对象。

--使用ResultSet读取数据,然后通过代码转化为具体的POJO对象。

--关闭数据库相关资源。


映射器由两部分组成:1-java文件;2-XML文件\注解

映射器是MyBatis最复杂、最核心的组件。

引入映射器的方法一般分为4中:1234

插件(plugins)是比较复杂的,使用时要特别小心。

当MyBatis在构建一个结果返回的时候,都会使用ObjectFactory(对象工厂)去构建pojo,在MyBatis中可以定制自己的对象工厂。org.apache.ibatis.refelection.factory.DefaultObject


2017年11月9日

目前流行的缓存服务有MongoDB、Redis、Ehcache。如果缓存命中率很低,那么缓存就不存在使用的意义了,所以使用缓存的关键在于存储内容访问的命中率。


select元素的配置对于statementType resultType  resultOrdered  resultSets都不太明白。

在实际的情况中,大部分的数据库规范都是要求每个单词用下划线分隔,而Java则是用驼峰命名法来命名,于是使用列的别名就可以使得MyBatis自动映射,或者直接在配置文件中开启驼峰命名方式。


传递多个参数:

----使用Map传递参数。因为Map导致业务可读性的丧失,从而导致后续扩展和维护的困难,我们应该在实际的应用中果断废弃这样的传递参数的方式。

----使用@Param注解传递多个参数,这种方式的使用受到参数个数的影响。当n小于等于5时,它是最佳的传参方式,它比用JavaBean更好,因为它更加直观;当n>5时,多个参数将给调用带来困难。

----当参数个数多于5个时,建议使用JavaBean方式。


resultMap通过id元素定义属性,这个对象代表着使用哪个属性作为其主键。result元素定义普通列的映射关系。

resultMap可没有你所看见的那么简单,它是映射器最为复杂的元素,它一般用于复杂,级联这些关联的配置。在简单的情况下,我们可以使用resultType通过自动映射来完成,这样配置的工作量就会大大减少,未来随着进一步的学习深入,我们还会讨论resultMap的高级应用。

自定义主键生成规则,完全没明白

插入和删除执行完成MyBatis会返回一个整数显示更新或删除了几条记录。

MyBatis现有的版本只支持resultMap查询,不支持更新或者保存,更不必说级联的更新、删除和修改了。

第七章 插件

2018年1月14日

      SqlSession下的四大对象:Executor、StatementHandler、ParameterHandler、ResultHandler,在Configuration对象的创建方法里我们看到了MyBatis用责任链去封装他们。换句话说我们有机会在四大对象的调度的时候插入我们的代码去执行一些特殊的要求以满足特殊的场景需求,这便是MyBatis的插件技术。


第九章 实用场景

这些场景包括数据库的BLOB字段的读写,批量操作,调度存储过程,分页,使用参数作为列名,分表等内容。

数据库BLOB字段读写

对于文件的操作,在数据库中往往是通过BLOB字段进行支持的,所以我们先看看MyBatis对BLOB字段的支持。

更多的时候我们都应该有一个文件服务器,数据库读取文件路径即可,而不把文件写入数据库。因为一旦文件很大,那么这个方法就很容易引起内存溢出。所以这样读写BLOB字段时要十分小心,注意使用的场景才行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值