MyBatis技术原理(笔记一)

最近在看《深入浅出MyBatis技术原理与实践》,此篇作为读后笔记一。

第一章 简介

说道Mybatis 就要知道什么是ORM模型(Object Relational Mapping)对象关系映射。它是一种程序技术,主要解决POJO对象和数据库数据之间相互映射,将程序中的对象自动持久化到关系数据库中,或者将数据库中的数据转化为POJO。

Hibernate 和 MyBatis

Hibernate 是一个开放源代码的ORM框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

Hibernate和 MyBatis的优缺点

Hibernate 的优点

1.hibernate是全自动,完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。消除了代码的映射规则,只需在xml或者注解中配置即可。
2.无序管理数据库连接,它也配置在xml里面。
3.有更好的二级缓存机制,可以使用第三方缓存。
4.一个会话中不用操作多个对象,只要操作Session对象就可以。同样关闭资源只要关闭Session即可。
5.hibernate拥有完整的日志系统,涉及广泛,包括sql记录、关系异常、优化警告、缓存提示、脏数据警告等。
6.可移植性强。

Hibernate 的缺点

1.全表映射有时很不方便,比如修改个别字段也要发送所有字段。
2.无法根据不同的条件组装不同的SQL。
3.多表关联和复杂的SQL支持较差,不支持存储过程。
4.优化SQL能力太差。
5.sql很多都是自动生成的,无法直接维护sql,虽然有hql查询,但功能还是不及sql强大,见到报表等变态需求时,hql查询要弱些,也就是说hql查询是有局限的。

MyBatis 的优点

1.针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。SQL更灵活,适用于多表查询。
2.可以进行更为细致的SQL优化,提供xml标签,支持编写动态sql,同时支持存储过程,满足各种应用系统和互联网应用的变化需求。
3.数据Mapper接口编程根据xml创建映射器。简化工作便于集中业务程序。

MyBatis 的缺点

1.关联表多时,字段多的时候,sql工作量很大。
2.sql依赖于数据库,导致数据库移植性差。
3.编写动态sql时,不方便调试,尤其逻辑复杂时。

第二章 入门

MyBatis 的核心组件

1.SqlSessionFactoryBuilder 构造器

它可以从XML配置文件或一个预先定制的Configuration的实例构建SqlSessionFactory。构建的Builder 模式。

2.SqlSessionFactory 工厂接口

每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心,它一旦被创建,应该在应用执行期间都存在。依靠它来生成SqlSession ,使用的是工厂模式。

3.SqlSession 执行SQL任务会话

一个既可以发送SQL 执行返回结果,也可以获取Mapper 的接口。

4.Mapper 映射器

MyBatis 新设计存在的组件,它由一个Java 接口和XML文件(或注解)构成,需要给出对应的SQL和映射规则。

MyBatis 的生命周期

SqlSessionFactoryBuilder 的作用在于创建SqlSessionFactory ,创建成功后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建SqlSessionFactory 的方法中,而不要让其长期存在。

SqlSessionFactory 可以被认为是一个数据库连接池,它的作用是创建SqlSession 接口对象。因为MyBatis 的本质就是Java 对数据库的操作,所以SqlSessionFactory 的生命周期存在于整个MyBatis 的应用之中,所以一旦创建了SqlSessionFactory , 就要长期保存它,直至不再使用MyBatis 应用,所以可以认为SqlSessionFactory 的生命周期就等同于MyBati s 的应用周期。

SqlSession 如果说SqlSessionFactory 相当于数据库连接池,那么SqlSession 就相当于一个数据库连接( Connection 对象) ,你可以在一个事务里面执行多条SQL ,然后通过它的commit、rollback 等方法, 提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给SqlSessionFactory , 否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用t可… catch … . finally …语句来保证其正确关闭。

Mapper 是一个接口,它由SqlSession 所创建,所以它的最大生命周期至多和SqlSession保持一致,尽管它很好用,但是由于SqlSession 的关闭,它的数据库连接资源也会消失,所以它的生命周期应该小于等于SqlSession 的生命周期。

第三章 配置

MyBatis 的配置文件

<?xml version = "1.0" encoding= "UTF - 8" ?>
	<configuration> <!--配置-->
	<properties/> <!--属性-->
	<settings/> <!--设置-->
	<typeAliases/> <!--类型命名-->
	<typeHandlers/> <!--类型处理器-->
	<objectFactory/> <!--对象工厂-->
	<plugins/> <!--插件-->
	<environments> <!--配置环境-->
		<environment> <!--环境变量-->
			<transact 工onManager/> <!--事务管理器-->
			<dataSource/> <!--数据源-->
		</environment>
	</environments>
	<databaseidProvider/> <!--数据库厂商标识-->
	<mappers/> <!--映射器-->
</configuration>

其中properties 、settings 、typeAliases 、typeHandler、plugin 、environments 、mappers 是常用的内容。

1.properties (属性)

属性可以给系统配置一些运行参数, 可以放在XML 文件或者properties 文件中,而不是放在Java 编码中, 这样的好处在于方便参数修改,而不会引起代码的重新编译。一般而言, MyBatis 提供了3 种方式让我们使用properties , 它们是:
property句子元素。
properties 文件。
程序代码传递。
正常开发中经常用到properties 文件的方式 避免开发模式、测试模式、和成产模式变更时修改程序。
jdbc.properties 文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=learn

调用方式:

<properties resource="jdbc.properties"/>

2.settings(配置)

settings 是MyBatis 中最复杂的配置,它能深刻影响MyBatis 底层的运行,但是在大部分情况下使用默认值便可以运行,所以在大部分情况下不需要大量配置它,只需要修改一些常用的规则即可, 比如自动映射、驼峰命名映射、级联规则、是否启动缓存、执行器(Executor)类型等。

<settings>
  <!--该配置影响所有映射器中配置缓存的全局开关 默认true-->
  <setting name="cacheEnabled" value="true"/>

  <!--延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。在特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态 默认false-->
  <setting name="lazyLoadingEnabled" value="true"/> 
  <!--是否允许单一语句返回多结柴集(需要兼容驱动〕 默认true-->
  <setting name="multipleResultSetsEnabled" value="true"/>

  <!--使用列标签代替列名.不同的驱动会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果 默认true-->
  <setting name="useColumnLabel" value="true"/>

  <!--允许JDBC 支持自动生成主键,需要驱动兼容。如果置设为true,这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作 默认false-->
  <setting name="useGeneratedKeys" value="false"/>

  <!--指定MyBatis应如何自动映射列到字段或属性。NONE表示驭消自动映射;PARTIAL表示只会自动映射,没有定义嵌套结果集和映射结果集。FULL会自动映射任意复杂的结果然(无论是否

嵌套)默认PARTIAL-->
  <setting name="autoMappingBehavior" value="PARTIAL"/>
  <!--配置默认的执行器。S IMPLE 是普通的执行器: REUSE会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新   默认SIMPLE-->
  <setting name="defaultExecutorType" value="SIMPLE"/>
  <!--设置超时时间,它决定驱动等待数据库响应的秒数 -->
  <setting name="defaultStatementTimeout" value="25"/>
  <!--设置数据库驱动程序默认返回的条数限制,此参数可以重新设置-->
  <setting name="defaultFetchSize" value="100"/>
  <!--允许在版套语句中使用分页( Row B ounds )。如果允许,设置false 默认false-->
  <setting name="safeRowBoundsEnabled" value="false"/>
  <!--是否开启自动驼峰命名规则映射,即从经典数据库列名 A_COLUMN 到经典Java 属性名aColumn 的类似映射 默认false-->
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <!--MyBatis 利用本地缓存机制( Local Cache )防止循环引用(circular references)和加速重复嵌套查询.默认值为SESSION,这种情况下会缓存一个会话中执行的所有查询。若设笠值为STATEMENT ,本地会话仅用在语句执行上,对相同SqlSession的不同调用将不会共享数据-->
  <setting name="localCacheScope" value="SESSION"/>
  <!--当没有为参数提供特定的JDBC 类型时,为空值指定JDBC 类型。某些驱动需要指定列的JDBC 类型,多数情况直接用一般类型即可,比如NULL 、VARCHAR 或OTHER 默认OTHER -->
  <setting name="jdbcTypeForNull" value="OTHER"/>
  <!--指定哪个对象的方法触发一次延迟加载-->
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>

</settings>

3.typeAliases (别名)

在MyBatis中允许定义一个简写来代表这个类,这就是别名,别名分为系统定义别名和自定义别名。它只和XML配置有关,存在的意义仅在于用来减少类完全限定名的冗余。

<typeAliases>
  <!--以类为单位-->
  <typeAlias alias="user" type="cn.mybatis.domain.User"/>
  <!--以包为单位-->
  <package name="cn.mybatis.domain"/>
</typeAliases>

注: 如果没和Sring整合 以包为单位定义别名,需要在对应包下的类提供注解,@Alias (“别名”) --类注解.

4.typeHandler (类型转换处理器)

MyBatis 内部定义了许多有用的typeHandler,在大部分的情况下无须显式地声明jdbcType和javaType,或者用typeHandler 去指定对应的typeHandler来实现数据类型转换,一般使用系统默认的就足够了。当然也可以自定义typeHandler 需要去实现接口typeHandler,或者继承BaseTypeHandler。

5.objectFactory(对象工厂)

当创建结果集时,MyBatis会使用一个对象工厂来完成创建这个结果集实例。在默认的情况下, MyBatis会使用其定义的对象工厂一DefaultObjectFactory ( org.apache.ibatis.reflection.factory.DefaultObjectFactory )来完成对应的工作。一般情况下系统默认即可。

6.environments(配置环境)

运行环境主要的作用是配置数据库信息,它可以配置多个数据库,一般而言只需要配置其中的一个就可以了。它下面又分为两个可配置的元素: 事务管理器(transactionManager)、数据源(dateSource),工作中一般采用spring配置文件方式配置数据源和事务管理器。

<properties resource="jdbc.properties"/>
<environments default="development">
        <environment id="development">
            <transactionManager type="JDBC">
                <property name="autoCommit" value="false"/>
            </transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

7.mapper(映射器引入)

1.用文件路径引入映射器

<!-- 使用类路径查找资源文件-->
<mappers>
	<mapper resource="com/mybatis/mapper/*Mapper.xml" />
</mappers>

2.用*Mapper.xml文件 引入映射器 不常用

<!--使用本地文件-->
<mappers>
	<mapper url="file:///var/mapper/*Mapper.xml"/>
< / mappers >

3.用类注册引入映射器 不常用

<!-- 使用接口类-->
<mappers>
	<mapper class="com.mybatis.mapper.*Mapper" />
</mappers>

4.用包名引入映射器

<!-- 使用包名-->
<mappers>
	<package name="com.mybatis.mapper"/>
</mappers>

参考博文

菜鸡旭旭关于MyBatis博客.

猜你喜欢

转载自blog.csdn.net/Dullon_jiang/article/details/88040113