MyBatis的前身就是iBatis,iBatis本是apache的一个开源项目,2010年这个项目由apahce sofeware foundation 迁移到了google code,并且改名为MyBatis。
iBATIS 一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO),同时还提供一个利用这个框架开发的 JPetStore实例。(来源于百度)
总体来说 MyBatis 主要完成两件事情
- 根据 JDBC 规范建立与数据库的连接;
- 通过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配置文件驱动的代码生成工具。 配置文件解决了如下问题:
- 如何连接数据库
- 生成哪些对象如何生成
- 哪些表要用来生成对象
详细内容请查看官网的文档 。
自动生成如下文件包括下面四个类型的组件:
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框架里面的霸主地位。
http://gemantic.iteye.com/blog/1622799
相关推荐
MyBatis的两个关键版本,即mybatis-3.2.8和mybatis-3.3.0-SNAPSHOT,具有各自的特点和改进,以下将详细介绍这两个版本的知识点。 首先,mybatis-3.2.8是MyBatis的一个稳定发布版,主要关注于性能优化和一些bug修复...
在本指南中,我们将详细介绍如何安装和使用mybatis-plus.jar以及相关的mybatis-plug。 首先,让我们了解一下MyBatis-Plus的核心特性: 1. **简化SQL编写**:MyBatis-Plus提供了CRUD操作的便捷方法,无需手动编写...
#### 第一章:介绍 1. **什么是MyBatis-Spring?** - MyBatis-Spring是一个帮助开发者无缝整合MyBatis与Spring框架的工具库。通过使用该库提供的类,Spring能够加载必要的MyBatis工厂类和会话类。 - 它简化了...
本文将基于给定的"Mybatis--SQL解析流程图",详细介绍Mybatis中SQL解析的具体流程,包括SqlSession与Mapper动态代理对象的获取步骤,旨在帮助读者深入理解Mybatis的工作机制。 #### 二、创建SqlSessionFactory 在...
- **文档**:详细介绍了MybatisX的各种特性和使用方法,是学习和使用MybatisX的重要参考资料。 - **构建脚本**:如Maven或Gradle的配置文件,用于构建和打包MybatisX插件。 - **示例项目**:可能包含了一些示例项目...
总的来说,Mybatis-Spring 1.3.2 API中文版对于开发人员来说是一份非常实用的参考资料,它详细介绍了如何在Spring环境中有效地集成和使用Mybatis,使得开发者可以更加专注于业务逻辑,而不是繁琐的配置和适配工作。...
接下来,我们来介绍MyBatis-Plus的代码生成器。这是一个非常实用的工具,能根据数据库表信息自动生成Model、Mapper、Mapper XML以及Service等文件,极大地提高了开发效率。 首先,创建一个配置类`GeneratorConfig....
Mybatis-Plus的介绍** MyBatis-Plus是一个MyBatis的增强工具,它不改变MyBatis原有的逻辑,而是提供了一套更方便的API,用于简化开发和提高效率。Mybatis-Plus提供了诸如自动CRUD操作、条件构造器、分页插件等功能...
本文将详细介绍如何使用SpringBoot、Mybatis-Plus以及Sharding-JDBC 5.1.1版本来实现单库分表。 #### 二、踩过的坑 在实现过程中遇到了一些常见问题,下面将逐一介绍并提供解决方案: ##### 1. 数据源问题 **...
以下是对MyBatis Generator及其使用方法的详细介绍。 1. **MyBatis Generator概述** MyBatis Generator是MyBatis框架的一部分,它允许开发者通过简单的配置文件定义生成的代码类型和样式。MBG使用Java API与数据库...
本文将详细介绍如何在Spring Boot项目中集成MyBatis,以及如何利用`spring-boot-starter-mybatis`进行快速开发。 首先,`spring-boot-starter-mybatis`是Spring Boot为MyBatis提供的一个起步依赖,它简化了MyBatis...
MyBatis的文档详细介绍了配置、映射器、动态SQL、缓存、事务控制等多个方面。 6. **示例**:如果包含示例代码,通常会提供一个快速入门的项目,展示如何配置MyBatis,创建Mapper接口,编写XML映射文件,以及如何在...
### MyBatis 3.0.3 用户指南关键知识点总结 #### 一、关于文档代码复制的注意事项 在阅读和使用本文档时,请注意代码示例的特殊字符问题。现代文字处理工具虽然使得文本更加美观易读,但也可能对代码示例造成破坏,...
本文将围绕"spring-boot-starter-mybatis-spring-boot-2.0.1.zip"这个压缩包,详细介绍如何在Spring Boot 2.0.1版本中集成MyBatis,并探讨相关的技术细节。 一、Spring Boot Starter MyBatis简介 Spring Boot ...
本文将详细介绍如何在Spring Boot 2.2.1版本中集成MyBatis,帮助开发者快速构建数据访问层。 首先,集成MyBatis的关键在于引入`spring-boot-starter-mybatis`依赖。在Spring Boot的项目中,我们通常使用Gradle或...
本文档详细介绍了MyBatis-Plus代码生成器的配置方法,包括数据源配置、数据库表配置、包名配置、模板配置、全局策略配置和注入配置等。 首先,我们需要了解MyBatis-Plus代码生成器的几个核心配置类: 1. ...
- 相关的README或RELEASE NOTES文件,介绍版本特性及变更 - 示例项目或者测试代码 了解并熟练掌握MyBatis 3.2.2的这些知识点,对于进行Java Web开发,尤其是涉及到数据库操作时,能极大地提高开发效率和代码质量。
本指南将详细介绍 MyBatis-Plus 的配置、使用和注意事项。 MyBatis-Plus 的配置 MyBatis-Plus 的 jar 包可以从官方网站下载,Mybatis-Plus 所使用的 JDBC 包 kingbase8-8.6.0.jar 位于 $KING-BASE_HOME/Interface/...
在《MyBatis-3-User-Guide》文档中,首先介绍了MyBatis的基本概念及其重要性。MyBatis是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果...