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语句:

SqlSession session = sqlSessionFactory.openSession();
try {
  Blog blog = session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {
  session.close();
}

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

SqlSession session = sqlSessionFactory.openSession();
try {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  Blog blog = mapper.selectBlog(101);
} finally {
  session.close();
}

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

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
  <select id="selectBlog" parameterType="int" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

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

Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);

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

BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

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

 

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

二、spring的集成

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

 

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

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
</bean>

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

SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
SqlSessionFactory sessionFactory = factoryBean.getObject();

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

 

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

<context:property-placeholder location="classpath*:jdbc.properties"  ignore-unresolvable="true"/>
        
	<!-- enable component scanning (beware that this does not enable mapper scanning!) -->    
    <context:component-scan base-package="com.buybal.rxhuirr.db" />
	<!-- scan for mappers and let them be autowired -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.buybal.rxhuirr.db.data" />
    </bean>
    <!-- enable autowire -->
    <context:annotation-config />
    
    <bean id="testDb" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="${driver}" />
		<property name="url" value="jdbc:mysql://10.0.0.20:3306/mybatis_demodb?defaultBatchValue=1000" />
		<property name="username" value="reportnew" />
		<property name="password" value="reportnew" />
        <property name="validationQuery" value="SELECT count(*) FROM users" />
        <property name="initialSize" value="10" />
        <property name="minIdle" value="5" />
        <property name="maxIdle" value="5" />
	</bean>
<bean id="sqlSessionFactoryTestDb" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="configLocation" value="classpath:mybatis-config.xml" />
		<property name="dataSource" ref="testDb" />
	</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映射文件中添加一行:

<cache/>

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

<cache
    eviction="FIFO"
    flushInterval="60000"
    size="512"
    readOnly="true"/> 

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

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

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

 

public interface Cache {
  String getId();
  int getSize();
  void putObject(Object key, Object value);
  Object getObject(Object key);
  boolean hasKey(Object key);
  Object removeObject(Object key);
  void clear();
  ReadWriteLock getReadWriteLock();
}

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

 

<cache type="com.domain.something.MyCustomCache">
  <property name="cacheFile" value="/tmp/my-custom-cache.tmp"/>
</cache>

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

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

 

<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-memcached</artifactId>
    <version>1.0.0-beta1</version>
  </dependency>

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

<mapper namespace="org.acme.FooMapper">
  <cache type="org.mybatis.caches.memcached.MemcachedCache" />
  ...
</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框架里面的霸主地位。

 

 

 

你可能感兴趣的:(orm,企业应用)