手机版
你好,游客 登录 注册
阅读内容

Java数据持久层框架 MyBatis

运行环境:
授权方式:BSD
软件大小:M
下载量:
更新日期:2014-08-03
来源地址:
联系作者:Linux

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

本文永久更新链接地址http://www.linuxidc.com/Linux/2014-08/105041.htm

linux
相关资讯       MyBatis 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款