`
gemantic
  • 浏览: 335851 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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框架里面的霸主地位。

 

 

 

分享到:
评论
4 楼 zhizhi555555 2014-06-11  
  官方除了提供 JPetStore还提供了一个帮助指南,其中帮助指南中的一些javaBean比如
  Blog,Author 等,不知道哪里可以找到这些javabean,不然直接哪来测试不方便
3 楼 wangtao0501 2012-12-12  
Mybatis-Shards 这个楼主有研究过吗
2 楼 xuyao 2012-08-07  
不错,很好 lz
1 楼 javamajor 2012-08-07  
踩踩踩,留爪

相关推荐

    MyBatis介绍与下载.pdf

    MyBatis介绍与下载

    Mybatis学习笔记整合架构

    2.Mybatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。 MyBatis是一个优秀的持久层框架,它对...

    mybatis 3.1.1 官方pdf(英文)

    mybatis 3.1.1 官方pdf,英文

    深入浅出Mybatis

    深入浅出Mybatis,这是mybatis介绍最为入门的书籍,该框架介绍的书籍比较少,这个适合入门

    springmvc、struts2区别、mybatis、hibernate区别

    struts2介绍、和springmvc对比,mybatis介绍和hibernate对比

    Mybatis框架基本介绍

    大家都知道当前比较流行的框架,如Spring、SpringMVC、Hibernate、Mybatis等框架,此图文讲的就是当前比较流行的企业框架Mybatis。

    mybatis学习笔记

    1.2 MyBatis介绍 3 1.3 Mybatis架构 3 1.4 mybatis下载 4 1.5 创建mysql数据库 5 1.6 Mybatis入门程序 5 1.6.1 需求 5 1.6.2 第一步:创建java工程 6 1.6.3 第二步:加入jar包 6 1.6.4 第三步:log4j.properties 6 ...

    MyBatis-Plus入门+MyBatis-Plus文档手册 中文pdf高清版.rar

    mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中...《MyBatis-Plus入门文档》主要介绍了MyBatis-Plus入门使用,以及关于mybatis-plus的更多介绍及特性,感兴趣的可以下载学习一下

    JavaEE企业级分布式高级架构师018期 94G

    │ │ 第一章第1节: 02-mybatis介绍.mp4 │ │ 第一章第1节: 03-mybatis入门.mp4 │ │ 第一章第1节: 04-mybatis基础应用之mapper代理开发方式.mp4 │ │ 第一章第1节: 06-mybatis基础应用之全局配置...

    mybatis单表操作总结

    对于mybatis单表操作的总结 内容包含mybatis介绍 开发思路 程序搭建 核心api介绍 开发步骤 和单表操作

    MyBatis 概述与使用

    Mybatis 介绍i. 历史ii. 简介3. Mybatis 快速入门a. 主要需求b. 步骤分析c. 代码实现i. 创建 mybatis_db 数据库和 user 表ii. 创建 Java 项目,导入 Jar 包iii. 创建 User 实体类iv. 编写映射文件 UserMapper.xmlv....

    springmybatis

    MyBatis 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis ...

    《深入浅出MyBatis技术原理与实战》高清完整PDF下载

    单单在51job招聘网站中MyBatis在全国也有近万个岗位的需求,加上未在51job发布的企业,可见需求相当大,而在当今市场上却没有任何一本介绍MyBatis的书籍,为了填补这一空白本书主要介绍了Java MyBatis技术。...

    MyBatis 如何写配置文件和简单使用

    MyBatis 如何写配置文件和简单使用 MyBatis3.x 这里简单贴一下MyBatis的介绍,具体使用方法会在代码中贴出。 MyBatis的前世今生 MyBatis的前身就是iBatis,iBatis...MyBatis介绍 MyBatis是一个数据持久层(ORM)框架。把实

    Mybatis 如何防止 sql 注入?mybatis 拦截器了解过吗,应用场景是什么.详情介绍

    详情介绍Mybatis 如何防止 sql 注入?mybatis 拦截器了解过吗,应用场景是什么.详情介绍Mybatis 如何防止 sql 注入?mybatis 拦截器了解过吗,应用场景是什么.详情介绍Mybatis 如何防止 sql 注入?mybatis 拦截器...

    MyBatis入门.pdf

    MyBatis简单入门的一些介绍内容

    mybatis自定义标签.zip

    介绍了mybatis自定义标签,添加自定义标签的实现代码,通过实例代码展示给大家

    Mybatis.PDF

    和测试讲解了在 MyBatis XML 方式和注解方式中进行增、册 改、查操作的基本用法,介绍了动态 SQL 在不同方面的应用以及在使用过程中的最佳实践方案。针对 MyBatis 高级映射、存储过程和类型处理器提 供了丰富的示例...

    Mybatis批量foreach merge into的用法

    Mybatis批量foreach merge into的用法,这是介绍Mybatis批量foreach merge into的用法的文档

    mybatis官方介绍整理

    将mybatis官方网站介绍、使用方法汇总到一个文档里

Global site tag (gtag.js) - Google Analytics