`
gemantic
  • 浏览: 337944 次
  • 性别: 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是一个流行的Java持久化框架,它的设计目标是将SQL数据库访问与Java对象之间的映射关系解耦,提供了一种高效且灵活的方式来处理数据库操作。这个框架的主要特点是它的简单易用性、灵活性、对SQL的完全控制...

    mybatis3.x源码深度解析与最佳实践.pdf

    MyBatis 介绍以及框架源码的学习目标:MyBatis 是当前最流行的 Java 持久层框架之一,其通过 XML 配置的方式消除了绝大部分 JDBC 重复代码以及参数的设置,结果集的映射。 1.1 环境搭建 MyBatis 框架的环境搭建...

    Mybatis Jar包

    在文档的GettingStarted部分,Mybatis介绍了如何安装和配置Mybatis,以确保Mybatis能够正确运行。安装Mybatis很简单,只需要将mybatis-x.x.x.jar文件包含在类路径中即可。如果你使用Maven作为构建工具,那么可以添加...

    Mybatis学习笔记整合架构

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

    MyBatis3.3.0中文文档

    ### MyBatis介绍 MyBatis支持定制化SQL、存储过程以及高级映射,从而提高开发效率和数据库交互的灵活性。它避免了JDBC代码的繁琐,同时提供了对原生Map和简单XML或注解配置的支持。通过这些方式,MyBatis可以将接口...

    mybatis.docx

    1. **MyBatis 介绍**: MyBatis 提供了一个简单的 XML 或注解配置文件,用于将 Java 类与 SQL 语句绑定,这样可以大大简化 SQL 操作。MyBatis 使得 SQL 语句和 Java 代码解耦,提高了代码的可读性和可维护性。 2. ...

    mybatis 3.1.1 官方pdf(英文)

    根据给定的文件信息,以下是对MyBatis 3.1.1官方PDF文档的关键知识点的详细解析: ### MyBatis概述 MyBatis是一款顶级的持久层框架,支持自定义SQL、存储过程以及高级映射功能。它极大地简化了JDBC代码编写,避免...

    springboot+mybatis+druid.zip

    二、MyBatis介绍 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将...

    springboot+mybatis+limit代码实现分页、web前端到后台、crud、搜索关键字、完整实例项目

    ### MyBatis介绍 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将...

    创建springboot+mybatis+mysql项目的源码

    MyBatis介绍** MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将...

    深入浅出Mybatis

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

    sharding-jdbc开源分表框架整合mybatis-demo

    **MyBatis介绍** `MyBatis`是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,...

    Mybatis框架基本介绍

    Mybatis是一个流行的持久层框架,它在企业级开发中被广泛应用。它主要用于解决与数据库交互时的映射问题,是一种半ORM(对象关系映射)框架。Mybatis通过使用简单的XML或注解的方式,将对象与数据库表进行映射,从而...

    MyBatis3.2.2 用户手册中文翻译版

    ### MyBatis 介绍 MyBatis 支持普通 SQL 查询、存储过程以及高级映射,它通过简单的 XML 或注解配置,结合原始的 JDBC 操作,实现了将 Java 的普通对象(POJOs)映射到数据库记录的功能。它旨在减少手工编写 JDBC ...

    Springboot+mybatis登录注册增删改查

    **二、Mybatis介绍** Mybatis是一个优秀的Java持久层框架,它简化了SQL与Java对象之间的映射,支持自定义SQL、存储过程以及高级映射。Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Mybatis可以...

    mybatis入门的基础三天知识量

    #### MyBatis介绍 MyBatis是一种支持普通SQL查询、存储过程以及高级映射的优秀持久层框架。它消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis可以使用简单的XML或注解来进行配置和原始映射,将...

    springmvc、struts2区别、mybatis、hibernate区别

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

    springMybatis

    MyBatis介绍** MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将...

    精选MyBatis思维导图分享,超全超详细,思维导图附代码你们见过吗?高清

    一、MyBatis介绍 * MyBatis是一个半自动的ORM框架,需要手写SQL语句。 * MyBatis是Apache的一个开源项目,2010年改名为MyBatis。 * MyBatis的优点:简化了数据访问,提高了开发效率。 二、MyBatis核心对象 * ...

Global site tag (gtag.js) - Google Analytics