MyBatisMyBatis

简介

MyBatis的前身为iBatis,本是apache的
一个开源项目, 2010年这个类别由于apache software foundation 迁移至了google
code,并且改名为MyBatis。MyBatis是永葆普通SQL查询,存储过程以及高等映射的精良持久层框架。MyBatis消除了几乎拥有的
JDBC代码和参数的手工安装及结果集的寻找。MyBatis使用简易的XML或注解用于配置以及原始映射,将接口和Java的POJOs(Plan
Old Java Objects,普通的Java对象)映射成数据库被的记录。

Mybatis的作用架构分为三叠(图片借用了百度百科):

1)       API接口层:提供被外部使用的接口API,开发人员通过这些当地API来控制数据库。接口层一接接调用请求虽见面调用数据处理层来就具体的数据处理。

2)       数据处理层:负责具体的SQL查找、SQL解析、SQL执行及实施结果映射处理等。它主要的目的是冲调用的求完成同样不好数据库操作。

3)      基础支撑层:负责最基础之功能支持,包括连接管理、事务管理、配置加载与缓存处理,这些都是公家的东西,将他们抽取出来作为最基础之零件。为上层的多寡处理层提供最好基础之支撑。

 MyBatis 1

 

飞入门

MyBatis 2

Mybatis的完整流程图

 

SqlSessionFactoryBuilder

各个一个MyBatis的应用程序的进口是SqlSessionFactoryBuilder,它的用意是通过XML配置文件创建
Configuration对象(当然为可以以次中自行创建),然后经build方法创建SqlSessionFactory对象。没有必要每次看
Mybatis就创办同不行SqlSessionFactoryBuilder,通常的做法是开创一个大局的对象就是得了。示例程序如下:

  1. private static SqlSessionFactoryBuilder sqlSessionFactoryBuilder;  
  2. private static SqlSessionFactory sqlSessionFactory;  
  3. private static void init() throws IOException {  
  4.     String resource = “mybatis-config.xml”;  
  5.     Reader reader = Resources.getResourceAsReader(resource);  
  6.     sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();  
  7.     sqlSessionFactory = sqlSessionFactoryBuilder.build(reader);  
  8. }  

 

SqlSessionFactory

SqlSessionFactory对象由SqlSessionFactoryBuilder创建。它的重要功能是创造SqlSession对象,
和SqlSessionFactoryBuilder对象同,没有必要每次访Mybatis就创造同软SqlSessionFactory,通常的开
法是创建一个大局的靶子就好了。SqlSessionFactory对象一个必要的性质是Configuration对象,它是保留Mybatis全局
配置的一个布置对象,通常由SqlSessionFactoryBuilder从XML配置文件创建。这里为有一个简易的示范:

  1. <?xml version=”1.0″ encoding=”UTF-8″ ?>  
  2. <!DOCTYPE configuration PUBLIC   
  3.     “-//mybatis.org//DTD Config 3.0//EN”  
  4.     “http://mybatis.org/dtd/mybatis-3-config.dtd"&gt;  
  5. <configuration>  
  6.     <!– 配置别名 –>  
  7.     <typeAliases>  
  8.         <typeAlias type=”org.iMybatis.abc.dao.UserDao” alias=”UserDao” />  
  9.         <typeAlias type=”org.iMybatis.abc.dto.UserDto” alias=”UserDto” />  
  10.     </typeAliases>  
  11.        
  12.     <!– 配置环境变量 –>  
  13.     <environments default=”development”>  
  14.         <environment id=”development”>  
  15.             <transactionManager type=”JDBC” />  
  16.             <dataSource type=”POOLED”>  
  17.                 <property name=”driver” value=”com.mysql.jdbc.Driver” />  
  18.                 <property name=”url” value=”jdbc:mysql://127.0.0.1:3306/iMybatis?characterEncoding=GBK” />  
  19.                 <property name=”username” value=”iMybatis” />  
  20.                 <property name=”password” value=”iMybatis” />  
  21.             </dataSource>  
  22.         </environment>  
  23.     </environments>  
  24.       
  25.     <!– 配置mappers –>  
  26.     <mappers>  
  27.         <mapper resource=”org/iMybatis/abc/dao/UserDao.xml” />  
  28.     </mappers>  
  29.       
  30. </configuration>  

一经顾XML头部的宣示,需要因此来验证XML文档正确性。typeAliases 元素是带有有typeAlias(别名)的列表,别名用来替换完整类名,这样在需要完整类名的地方就是足以据此生成叫来替。environment元素体中带有对事务管理和连接池的条件布置。mappers元素是含有有mapper(映射器)的列表,这些mapper的XML文件包含SQL代码和投定义信息。当然,在XML配置文件中还有好多方可安排的,上面的示范指出的虽是极其着重之片,其他安排请参见Mybatis的官方文档。

SqlSession

SqlSession对象的重要功用是水到渠成同样差数据库的拜访和结果的映射,它相仿于数据库的session概念,由于未是线程安全的,所以
SqlSession对象的意域需限制措施外。SqlSession的默认实现类似是DefaultSqlSession,它有星星点点个必安排的属
性:Configuration和Executor。Configuration前文已经描述这里不再多说。SqlSession对数据库的操作都是经
Executor来就的,Executor的有血有肉成效以生一致多少节在讲述。

交目前为止,我们看到底还是mybatis的流水线,我们的应用程序在啊地方插入到此流程中连拿走我们纪念要之结果吧?就是SqlSession这
里。SqlSession有一个第一之法getMapper,顾名思义,这个点子是因此来获取Mapper对象的。什么是Mapper对象?根据
Mybatis的官手册,应用程序除了如起并启动Mybatis之外,还需要定义有接口,接口里定义访问数据库的方法,存放接口的包路径下要停放
同名的XML配置文件。SqlSession的getMapper方法是关系应用程序和Mybatis纽带,应用程序访问getMapper
时,Mybatis会根据传入的接口类型和相应的XML配置文件充分成一个摄对象,这个代理对象就是给Mapper对象。应用程序获得Mapper对象后,
就该通过此Mapper对象来走访Mybatis的SqlSession对象,这样尽管高达里插入到Mybatis流程的目的。示例代码如下:

  1. SqlSession session= sqlSessionFactory.openSession();  
  2. UserDao userDao = session.getMapper(UserDao.class);  
  3. UserDto user = new UserDto();  
  4. user.setUsername(“iMybatis”);  
  5. List<UserDto> users = userDao.queryUsers(user);  

相应之接口:

  1. public interface UserDao {  
  2.     public List<UserDto> queryUsers(UserDto user) throws Exception;  
  3. }  

对应之配置文件:

  1. <?xml version=”1.0″ encoding=”UTF-8″ ?>  
  2. <!DOCTYPE mapper PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN” “http://mybatis.org/dtd/mybatis-3-mapper.dtd"&gt;  
  3. <mapper namespace=”org.iMybatis.abc.dao.UserDao”>  
  4.     <select id=”queryUsers” parameterType=”UserDto” resultType=”UserDto”  
  5.         useCache=”false”>  
  6.         <![CDATA[ 
  7.         select * from t_user t where t.username = #{username} 
  8.         ]]>  
  9.     </select>  
  10. </mapper>  

Executor

Executor对象在开创Configuration对象的上创建,并且缓存在Configuration对象里。Executor对象的最主要力量是调用StatementHandler访问数据库,并将查询结果存入缓存中(如果安排了缓存的语)。

StatementHandler

StatementHandler是真访问数据库的地方,并调用ResultSetHandler处理查询结果。

ResultSetHandler

处理查询结果。

 

MyBatis和Hibernate相比,优势于哪?

1、开发对比开发速度

Hibernate的实在控制要比较Mybatis来得难以把。Mybatis框架相对简单很爱上手,但也针锋相对简陋些。个人认为要因此好Mybatis还是第一使先了解好Hibernate。

支付社区

Hibernate
与Mybatis都是风靡的持久层开发框架,但Hibernate开发社区相对多热闹些,支持之家伙也大半,更新为赶紧,当前高版本4.1.8。而Mybatis相对平静,工具较少,当前最高版本3.2。

付出工作量

Hibernate和MyBatis都产生照应的代码生成工具。可以转变简单基本的DAO层方法。

本着高档查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的照机制,开发者无需关注SQL的成形与结果映射,可以再令人瞩目让业务流程。

2、系统调优对比Hibernate的调优方案

  1. 创制合理之休养存策略;
  2. 尽可能使延缓加载特性;
  3. 采取合理之Session管理机制;
  4. 使用批量逮捕到手,设定合理之批处理参数(batch_size);
  5. 开展客观之O/R映射设计

Mybatis调优方案

MyBatis在Session方面和Hibernate的Session生命周期是同等的,同样需客观的Session管理机制。MyBatis同样有着二级缓存机制。
MyBatis可以拓展详尽的SQL优化规划。

SQL优化方面

Hibernate的查询会将表中的有字段查询出来,这等同碰会发生性能消耗。Hibernate也堪友善写SQL来指定要查询的字段,但这样即使摔了Hibernate开发之简洁性。而Mybatis的SQL是手动编写的,所以可以遵循要求指定询问的字段。

Hibernate
HQL语句的调优需要拿SQL打印出来,而Hibernate的SQL被多人嫌弃因为太可恨了。MyBatis的SQL是协调手动写的用调整惠及。但Hibernate具有温馨之日记统计。Mybatis本身不牵动日志统计,使用Log4j进行日志记录。

扩展性方面

Hibernate与实际数据库的涉嫌只待以XML文件被布置即可,所有的HQL语句与具象采用的数据库无关,移植性很好。MyBatis项目蒙有所的SQL语句都是借助所用之数据库的,所以不同数据库类型的支持不好。

3、对象管理及抓取策略对象管理

Hibernate 是一体化的靶子/关系映射解决方案,它提供了目标状态管理(state
management)的功效,使开发者不再用理会底层数据库系统的底细。也就是说,相对于大的
JDBC/SQL 持久层方案中得管住 SQL
语句,Hibernate采用了重新当之面向对象的见识来持久化 Java 应用被的多寡。

换句话说,使用 Hibernate
的开发者应该总是关注对象的状态(state),不必考虑 SQL
语句的履行。这有细节都由 Hibernate
掌管妥当,只有开发者在拓展系统性能调优的时光才得进行询问。

一经MyBatis在就同一片没有文档说明,用户用对目标好进行详细的保管。

抓取策略

Hibernate对实体关联对象的抓取有着漂亮的编制。对于每一个关联关系都可详细地安装是否推迟加载,并且提供关乎抓到手、查询抓到手、子查询抓到手、批量逮捕到手四种植模式。
它是事无巨细布置与拍卖的。

万一Mybatis的推移加载是全局配置的。

4、缓存机制对比Hibernate缓存

Hibernate一级缓存是Session缓存,利用好一级缓存就待对Session的生命周期进行田间管理好。建议在一个Action操作着应用一个Session。一级缓存需要针对Session进行严加管制。

Hibernate二级缓存是SessionFactory级的复苏存。
SessionFactory的苏存分为内置缓存和外置缓存。内置缓存中存放的凡SessionFactory对象的一对集合属性包含的数码(映射元素据及预约SQL语句等),对于应用程序来说,它是特念之。外置缓存中存放的凡数据库数据的副本,其作用以及一级缓存类似.二级缓存除了因为内存作为存储介质外,还得选用硬盘等标存储设备。二级缓存称为进程级缓存或SessionFactory级缓存,它好吃抱有session共享,它的生命周期伴随在SessionFactory的生命周期存在与消。

5、优势相比

Mybatis优势

  • MyBatis可以拓展更进一步密切的SQL优化,可以削减查询字段。
  • MyBatis容易掌握,而Hibernate门槛较高。

Hibernate优势

  • Hibernate的DAO层开发比MyBatis简单,Mybatis需要保护SQL和结果映射。
  • Hibernate对目标的掩护与缓存要于MyBatis好,对增删改查的对象的保障要有益于。
  • Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同之数据库需要写不同SQL。
  • Hibernate有再度好的二级缓存机制,可以使第三方缓存。MyBatis本身提供的缓存机制不佳。
网站地图xml地图