`

Mybatis的介绍--转

 
阅读更多
 

    MyBatis的前身就是iBatis,iBatis本是apache的一个开源项目,2010年这个项目由apahce sofeware foundation 迁移到了google code,并且改名为MyBatis。

 

    iBATIS 一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO),同时还提供一个利用这个框架开发的 JPetStore实例。(来源于百度)

 

    总体来说 MyBatis 主要完成两件事情

  1. 根据 JDBC 规范建立与数据库的连接;
  2. 通过Annotaion/XML+JAVA反射技术,实现 Java 对象与关系数据库之间相互转化。

一、原理介绍

    Mybatis的应用是围绕着一个SqlSessionFactory实例展开的。SqlSessionFactoryBuilder根据XML映射文件创建SqlSessionFactory。

 

    SqlSessionFactory由名字可以联想到,可以通过它获取一个SqlSession。SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句:

Java代码  收藏代码
  1. SqlSession session = sqlSessionFactory.openSession();  
  2. try {  
  3.   Blog blog = session.selectOne("org.mybatis.example.BlogMapper.selectBlog"101);  
  4. finally {  
  5.   session.close();  
  6. }  

 上面的方法是基于Mybatis的旧版本,在最新的版本中有更清晰的方法,通过一个java接口作为参数(e.g. BlogMapper.class)返回一个给定的sql映射。

Java代码  收藏代码
  1. SqlSession session = sqlSessionFactory.openSession();  
  2. try {  
  3.   BlogMapper mapper = session.getMapper(BlogMapper.class);  
  4.   Blog blog = mapper.selectBlog(101);  
  5. finally {  
  6.   session.close();  
  7. }  

  看到这里,您可能会对什么才是SqlSession和Mapper类真正执行的sql语句非常好奇。下面我们看一下例子.

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper  
  3.   PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
  4.   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  5. <mapper namespace="org.mybatis.example.BlogMapper">  
  6.   <select id="selectBlog" parameterType="int" resultType="Blog">  
  7.     select * from Blog where id = #{id}  
  8.   </select>  
  9. </mapper>  

   这个例子非常简单,是轻量级的。您可以定义众多类似这样的sql语句。这个文件在命名空 间"org.mybatis.example.BlogMapper"中,定义了一个叫做"selectBlog"的sql语句。这样就可以使用一个绝对 唯一路径“org.mybatis.example.BlogMapper.selectBlog”定位到这个sql语句上。如下所示:

Java代码  收藏代码
  1. Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog"101);  

   请 注意 这是 一个绝对唯一的 Java类 调用 方法 如何 类似 这个名字 可以 直接 映射到 命名空间 映射 ,以及 具有 相匹配的 名称 、参数 返回 类型 映射 select语句 方法 这使得 您可以 简单地调用 映射 接口 方法 这里 例子

Java代码  收藏代码
  1. BlogMapper mapper = session.getMapper(BlogMapper.class);  
  2. Blog blog = mapper.selectBlog(101);  

    如您所见,第二种方法更简洁,不需要返回值的cast。

 

    到目前为止,我们已经了解Mybatis如何将xml映射文件与Java类映射去执行sql语句的,具体xml映射文件的含义请查询mybatis官方网站的资料 ,再此不在介绍。

二、spring的集成

在基本的 MyBatis 中,session 工厂可以使用 SqlSessionFactoryBuilder 来创建。而在 MyBatis-Spring 中,则使用 SqlSessionFactoryBean 来替代。

 

要创建工厂 bean,放置下面的代码在 Spring 的 XML 配置文件中:

Xml代码  收藏代码
  1. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
  2.   <property name="dataSource" ref="dataSource" />  
  3. </bean>  

 要注意 SqlSessionFactoryBean 实现了 Spring 的 FactoryBean 接口(请参考Spring文档的3.8 章节)这就说明了由Spring最终创建的bean不是SqlSessionFactoryBean本身。而是工厂类的getObject()返回的方法 的结果。这种情况下,Spring将会在应用启动时为你创建SqlSessionFactory对象,然后将它以SqlSessionFactory为名 来存储。在 Java中, 相同的代码是:

Java代码  收藏代码
  1. SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();  
  2. SqlSessionFactory sessionFactory = factoryBean.getObject();  

 在一般的MyBatis-Spring 用法中, 你不需要直接使用 SqlSessionFactoryBean或和其对应的SqlSessionFactory。相反,session工厂将会被注入到 MapperFactoryBean或其它扩展了SqlSessionDaoSupport 的DAO(Data Access Object,数据访问对象,译者注)中。

 

下面给出一个完成的Mybatis-spring集成的例子:

Xml代码  收藏代码
  1. <context:property-placeholder location="classpath*:jdbc.properties"  ignore-unresolvable="true"/>  
  2.           
  3.     <!-- enable component scanning (beware that this does not enable mapper scanning!) -->      
  4.     <context:component-scan base-package="com.buybal.rxhuirr.db" />  
  5.     <!-- scan for mappers and let them be autowired -->  
  6.     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
  7.         <property name="basePackage" value="com.buybal.rxhuirr.db.data" />  
  8.     </bean>  
  9.     <!-- enable autowire -->  
  10.     <context:annotation-config />  
  11.       
  12.     <bean id="testDb" class="org.apache.commons.dbcp.BasicDataSource"  
  13.         destroy-method="close">  
  14.         <property name="driverClassName" value="${driver}" />  
  15.         <property name="url" value="jdbc:mysql://10.0.0.20:3306/mybatis_demodb?defaultBatchValue=1000" />  
  16.         <property name="username" value="reportnew" />  
  17.         <property name="password" value="reportnew" />  
  18.         <property name="validationQuery" value="SELECT count(*) FROM users" />  
  19.         <property name="initialSize" value="10" />  
  20.         <property name="minIdle" value="5" />  
  21.         <property name="maxIdle" value="5" />  
  22.     </bean>  
  23. <bean id="sqlSessionFactoryTestDb" class="org.mybatis.spring.SqlSessionFactoryBean">  
  24.         <property name="configLocation" value="classpath:mybatis-config.xml" />  
  25.         <property name="dataSource" ref="testDb" />  
  26.     </bean>  

    如有疑问,请查看Mybatis-spring集成 的官方文档。

三、代码生成工具

    经过前面的两章,我们已经掌握了Mybatis的映射原理,并且可以集成进入到spring中使用了。但是童鞋们肯定会感觉Mybatis的配置文件和映射类的工作也十分的巨大,并且繁琐,简直就是望而生畏。

    不过我们有强大的代码生成工具帮我们自动生成xml映射文件和java映射类,它大大减轻了我们使用Mybatis的工作负担!

 

    首先,建议在eclipse上安装Mybatis代码生成工具的插件。插件地址请点击我

    安装完毕,就可以在eclipse上自动生成Mybatis的文件了,程序员可以把自己的精力专注在业务逻辑上的开发,而不是Mybatis配置文件和映射类上面。

    Mybatis代码生成工具的原理是使用xml配置文件驱动的代码生成工具。 配置文件解决了如下问题:

  1. 如何连接数据库
  2. 生成哪些对象如何生成
  3. 哪些表要用来生成对象

    详细内容请查看官网的文档

 

    自动生成如下文件包括下面四个类型的组件:

    Module类       数据库的对象POJO(没有实现Serializable接口,如使用缓存需要添加 )
    Example           用于拼动态sql的帮助类
    XXXMapper.xml     映射文件(包括自动生成的动态sql部分)
    XXXMapper.java    与映射文件对应的DAO接口

四、缓存

    缓存技术是一种“以空间换时间”的设计理念,利用内存空间资源来提高数据检索速度的有效手段之一。
 MyBatis默认情况下是没有开启缓存的,除了局部的 session 缓存。要开启二级缓存,你需要在你的 SQL映射文件中添加一行:

Xml代码  收藏代码
  1. <cache/>  

 这样配置会开启二级缓存,并且加载缺省的缓存配置。下面的例子说明了如何更改缓存策略和配置:

Xml代码  收藏代码
  1. <cache  
  2.     eviction="FIFO"  
  3.     flushInterval="60000"  
  4.     size="512"  
  5.     readOnly="true"/>   

    这个配置创建了一个 FIFO 缓存,并每隔 60 秒刷新,存取512 个结果对象或列表的引用,而且返回的对象为只读,因此在不同线程中的调用者之间修改它们会导致冲突。

   注意:二级缓存是支持事物的,这意味着只有在SqlSession结束和提交的时候,或者当回滚结束并且插入、删除、更新操作没有配置flushCache=true,才会更新缓存内容。

    除了Mybatis自己提供的缓存,也可以使用第三方的分布式缓存。要使用第三方的缓存需要实现Mybatis的缓存接口:

 

Java代码  收藏代码
  1. public interface Cache {  
  2.   String getId();  
  3.   int getSize();  
  4.   void putObject(Object key, Object value);  
  5.   Object getObject(Object key);  
  6.   boolean hasKey(Object key);  
  7.   Object removeObject(Object key);  
  8.   void clear();  
  9.   ReadWriteLock getReadWriteLock();  
  10. }  

 然后只要在xml映射文件中,缓存配置的部分使用自己的实现类。

 

Xml代码  收藏代码
  1. <cache type="com.domain.something.MyCustomCache">  
  2.   <property name="cacheFile" value="/tmp/my-custom-cache.tmp"/>  
  3. </cache>  

 更详细的内容请直接查看官方网站的说明文档

 幸运的是,针对很多著名的第三方分布式缓存,已经有了开源的插件,已经不需要我们自己开发缓存接口的实现了。下面拿我们公司DAL使用的 Memcached为例,已经有了开源的实现。如果使用maven管理项目,可以添加如下项目到maven的配置文件中引入Mybatis- Memcached框架:

 

Xml代码  收藏代码
  1. <dependency>  
  2.     <groupId>org.mybatis.caches</groupId>  
  3.     <artifactId>mybatis-memcached</artifactId>  
  4.     <version>1.0.0-beta1</version>  
  5.   </dependency>  

 然后在xml映射文件指定定制的Memcached缓存实现类:

Xml代码  收藏代码
  1. <mapper namespace="org.acme.FooMapper">  
  2.   <cache type="org.mybatis.caches.memcached.MemcachedCache" />  
  3.   ...  
  4. </mapper>  

 具体的使用方法还请阅读Mybatis-Memcached项目文档

五、分库

现在大型网站都有自己的分布式DAL(Data access layer)层。如何在Mybatis上构建DAL,实现分库表的配置,路由规则定制都有现实的实际应用价值。下面简介一个Mybatis的分库插件。

 

shardbatis是一个由国人贡献的,Mybatis分库分表插件。Shardbatis的名称由shard(ing)+mybatis组合得到。诣在为ibatis实现数据水平切分的功能。

Shardbatis0.9是在mybatis 2.3.5代码的基础上进行一些扩展实现数据水平切分功能。 数据的水平切分包括多数据库的切分和多表的数据切分。目前shardbatis已经实现了单数据库的数据多表水平切分。

Shardbatis2.0可以以插件的方式和mybatis3.x进行整合,对mybatis的代码无侵入,不改变用户对mybatis的使用习惯。Shardbatis2.0支持的功能和Shardbatis0.9基本相同。

 

shardbatis的使用与原生的mybatis3没有区别,使用者只需要将shardbatis以Mybatis插件的方式引入进来,实现路由 策略接口,实现自己的路由策略即可,此外还需要一个shard_config.xm配置文件,定义哪些sql映射操作需要使用路由策略。

 

更详细的内容可以参考shardbatis官方文档 。以及iteye资料     

 

六、其它基于Mybatis的项目和资料

 

1.CobarClient主要针对现有网站应用中使用iBatis做数据访问层这一情况而设计开发,如果你的应用程序最初使用了Spring提供 的SqlMapClientTemplate的话, 那迁移到CobarClient实际上仅仅是稍微改一下应用程序的配置而已.

   项目地址:http://code.alibabatech.com/wiki/display/CobarClient/Home

2.http://blog.mybatis.org/

3.http://code.google.com/p/mybatis/

 

Mybatis从出生到现在已经有10岁了,最新的Mybatis项目是Mybatis for scala,相信在并行计算大行其道的今天,Mybatis一定会跟上时代的潮流,与时俱进,继续保持在ORM框架里面的霸主地位。

 http://gemantic.iteye.com/blog/1622799

分享到:
评论

相关推荐

    mybatis-3.2.8 mybatis-3.3.0-SNAPSHOT.jar

    MyBatis的两个关键版本,即mybatis-3.2.8和mybatis-3.3.0-SNAPSHOT,具有各自的特点和改进,以下将详细介绍这两个版本的知识点。 首先,mybatis-3.2.8是MyBatis的一个稳定发布版,主要关注于性能优化和一些bug修复...

    mybatis-plug.jar和 mybatis-plug的安装说明

    在本指南中,我们将详细介绍如何安装和使用mybatis-plus.jar以及相关的mybatis-plug。 首先,让我们了解一下MyBatis-Plus的核心特性: 1. **简化SQL编写**:MyBatis-Plus提供了CRUD操作的便捷方法,无需手动编写...

    mybatis-spring-1.0.0中文参考手册

    #### 第一章:介绍 1. **什么是MyBatis-Spring?** - MyBatis-Spring是一个帮助开发者无缝整合MyBatis与Spring框架的工具库。通过使用该库提供的类,Spring能够加载必要的MyBatis工厂类和会话类。 - 它简化了...

    Mybatis--SQL解析流程图

    本文将基于给定的"Mybatis--SQL解析流程图",详细介绍Mybatis中SQL解析的具体流程,包括SqlSession与Mapper动态代理对象的获取步骤,旨在帮助读者深入理解Mybatis的工作机制。 #### 二、创建SqlSessionFactory 在...

    mybatisx插件MybatisX-dev.zip

    - **文档**:详细介绍了MybatisX的各种特性和使用方法,是学习和使用MybatisX的重要参考资料。 - **构建脚本**:如Maven或Gradle的配置文件,用于构建和打包MybatisX插件。 - **示例项目**:可能包含了一些示例项目...

    Mybatis-Spring 1.3.2 API中文版

    总的来说,Mybatis-Spring 1.3.2 API中文版对于开发人员来说是一份非常实用的参考资料,它详细介绍了如何在Spring环境中有效地集成和使用Mybatis,使得开发者可以更加专注于业务逻辑,而不是繁琐的配置和适配工作。...

    SpringBoot整合MyBatis-Plus

    接下来,我们来介绍MyBatis-Plus的代码生成器。这是一个非常实用的工具,能根据数据库表信息自动生成Model、Mapper、Mapper XML以及Service等文件,极大地提高了开发效率。 首先,创建一个配置类`GeneratorConfig....

    mybatis-plus及分布式项目简介1

    Mybatis-Plus的介绍** MyBatis-Plus是一个MyBatis的增强工具,它不改变MyBatis原有的逻辑,而是提供了一套更方便的API,用于简化开发和提高效率。Mybatis-Plus提供了诸如自动CRUD操作、条件构造器、分页插件等功能...

    SpringBoot+Mybatis-Plus整合Sharding-JDBC5.1.1实现单库分表【全网最新】.doc

    本文将详细介绍如何使用SpringBoot、Mybatis-Plus以及Sharding-JDBC 5.1.1版本来实现单库分表。 #### 二、踩过的坑 在实现过程中遇到了一些常见问题,下面将逐一介绍并提供解决方案: ##### 1. 数据源问题 **...

    mybatis-generator.zip(生成代码模板)

    以下是对MyBatis Generator及其使用方法的详细介绍。 1. **MyBatis Generator概述** MyBatis Generator是MyBatis框架的一部分,它允许开发者通过简单的配置文件定义生成的代码类型和样式。MBG使用Java API与数据库...

    spring-boot-starter-mybatis-spring-boot-1.1.1.zip

    本文将详细介绍如何在Spring Boot项目中集成MyBatis,以及如何利用`spring-boot-starter-mybatis`进行快速开发。 首先,`spring-boot-starter-mybatis`是Spring Boot为MyBatis提供的一个起步依赖,它简化了MyBatis...

    mybatis-3.5.7.zip

    MyBatis的文档详细介绍了配置、映射器、动态SQL、缓存、事务控制等多个方面。 6. **示例**:如果包含示例代码,通常会提供一个快速入门的项目,展示如何配置MyBatis,创建Mapper接口,编写XML映射文件,以及如何在...

    MyBatis-3.0.3-User-Guide.pdf

    ### MyBatis 3.0.3 用户指南关键知识点总结 #### 一、关于文档代码复制的注意事项 在阅读和使用本文档时,请注意代码示例的特殊字符问题。现代文字处理工具虽然使得文本更加美观易读,但也可能对代码示例造成破坏,...

    spring-boot-starter-mybatis-spring-boot-2.0.1.zip

    本文将围绕"spring-boot-starter-mybatis-spring-boot-2.0.1.zip"这个压缩包,详细介绍如何在Spring Boot 2.0.1版本中集成MyBatis,并探讨相关的技术细节。 一、Spring Boot Starter MyBatis简介 Spring Boot ...

    spring-boot-starter-mybatis-spring-boot-2.2.1.zip

    本文将详细介绍如何在Spring Boot 2.2.1版本中集成MyBatis,帮助开发者快速构建数据访问层。 首先,集成MyBatis的关键在于引入`spring-boot-starter-mybatis`依赖。在Spring Boot的项目中,我们通常使用Gradle或...

    mybatis-plus代码生成器配置文档

    本文档详细介绍了MyBatis-Plus代码生成器的配置方法,包括数据源配置、数据库表配置、包名配置、模板配置、全局策略配置和注入配置等。 首先,我们需要了解MyBatis-Plus代码生成器的几个核心配置类: 1. ...

    mybatis-3.2.2完整类库

    - 相关的README或RELEASE NOTES文件,介绍版本特性及变更 - 示例项目或者测试代码 了解并熟练掌握MyBatis 3.2.2的这些知识点,对于进行Java Web开发,尤其是涉及到数据库操作时,能极大地提高开发效率和代码质量。

    人大金仓[应用开发及迁移][客户端编程开发框架]MyBatis-Plus指南.pdf

    本指南将详细介绍 MyBatis-Plus 的配置、使用和注意事项。 MyBatis-Plus 的配置 MyBatis-Plus 的 jar 包可以从官方网站下载,Mybatis-Plus 所使用的 JDBC 包 kingbase8-8.6.0.jar 位于 $KING-BASE_HOME/Interface/...

    MyBatis-3-User-Guide

    在《MyBatis-3-User-Guide》文档中,首先介绍了MyBatis的基本概念及其重要性。MyBatis是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果...

Global site tag (gtag.js) - Google Analytics