首页 > 代码库 > Mybatis学习---了解Mybatis

Mybatis学习---了解Mybatis


什么是Mybatis


      对MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的XML或注解用于配置和原始映射,将接口和JavaPOJO(Plain Old Java Object,普通的 Java 对象)映射成数据库中的记录。(摘自MyBatis官网)

MyBatisIbatis


       对于从事 Java EE 的开发人员来说,iBatis 是一个再熟悉不过的持久层框架了,在 HibernateJPA 这样的一站式对象 关系映射(O/R Mapping)解决方案盛行之前,iBaits 基本是持久层框架的不二选择。即使在持久层框架层出不穷的今天,iBatis 凭借着易学易用、轻巧灵活等特点,也仍然拥有一席之地。尤其对于擅长 SQL 的开发人员来说,iBatis 对 SQL 和存储过程的直接支持能够让他们在获得 iBatis 封装优势的同时而不丧失 SQL 调优的手段,这是 Hibernate/JPA 所无法比拟的。具体而言,使用 iBatis 框架的主要优势主要体现在如下几个方面:

      首先,iBatis 封装了绝大多数的 JDBC 样板代码,使得开发者只需关注 SQL 本身,而不需要花费精力去处理例如注册驱动,创建 Connection,以及确保关闭 Connection 这样繁杂的代码。

      其次,iBatis 可以算是在所有主流的持久层框架中学习成本最低,最容易上手和掌握的框架。虽说其他持久层框架也号称门槛低,容易上手,但是等到你真正使用时会发现,要想掌握并用好它是一件非常困难的事。在工作中我需要经常参与面试,我曾听到过很多位应聘者描述,他们所在的项目在技术选型时选择 Hibernate,后来发现难以驾驭,不得不将代码用 JDBC 或者 iBatis 改写。

      iBatis 自从在 Apache 软件基金会网站上发布至今,和他的明星兄弟们(Http ServerTomcatStrutsMavenAnt 等等)一起接受者万千 Java 开发者的敬仰。然而在2010年六月中旬,几乎是发布 3.0 版本的同时,iBatis 主页上的一则 “Apache iBATIS has been retired” 的声明在社区引起了一阵不小的波澜。在 Apache 寄居六年之后,iBatis 将代码托管到 Google Code。在声明中给出的主要理由是,和 Apache 相比,Google Code 更有利于开发者的协同工作,也更能适应快速发布。于此同时,iBatis 更名为 MyBatis


MyBatis几个重要的概念

       SqlSessionFactorySqlSessionFactoryBuild

      也不是说核心,其实Mybatis所以对数据库的操作都需要SqlSessionFactory这个实例(我的理解也就相当于一般JDBC连接池的作用),是通过SqlSessionFactoryBuilder这个类来创建的。在源码里面我们可以看到,他主要有以下三个方法:

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) 

public SqlSessionFactory build(Reader reader, String environment, Properties properties)

public SqlSessionFactory build(Configuration config)

 

      而其他方法基本上都是用这三个签名方法,如只是调用了build(inputStream,null,null).就可以实现public SqlSessionFactory build(InputStream inputStream).

InputStream : 一般指的是输入流,用来描述映射的一些输入流。

Environment:是指运行环境,这里不多介绍,后面涉及到多环境数据库配置时会将到。

Properties :属性是用来描述属性,如数据库连接属性。


创建SqlSessionFactory 的方式(此部分可以在官方文档里找到实例)


      1.通过XML创建

      从 XML 文件中构建 SqlSessionFactory 的实例非常简单。这里建议你使用类路径下的资 源文件来配置,但是你可以使用任意的 Reader 实例,这个实例包括由文字形式的文件路径 或 URL 形式的文件路径 file://来创建。MyBatis 包含了一些称作为资源的工具类,这些工具类包含一些方法,这些方法使得从类路径或其他位置加载资源文件更加简单。

String resource = "org/mybatis/example/mybatis-config.xml";

InputStream inputStream = Resources.getResourceAsStream(resource);

sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

XML文档实例:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration

  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

  "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

  <environments default="development">

    <environment id="development">

      <transactionManager type="JDBC"/>

      <dataSource type="POOLED">

        <property name="driver" value=http://www.mamicode.com/"${driver}"/>

        <property name="url" value=http://www.mamicode.com/"${url}"/>

        <property name="username" value=http://www.mamicode.com/"${username}"/>

        <property name="password" value=http://www.mamicode.com/"${password}"/>

      </dataSource>

    </environment>

  </environments>

  <mappers>

    <mapper resource="org/mybatis/example/BlogMapper.xml"/>

  </mappers>

</configuration>

 

   2.通过java类创建


      如果你喜欢从 Java 程序而不是 XML 文件中直接创建配置实例或创建你自己的配置构建器,MyBatis 也提供完整的配置类。

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();

TransactionFactory transactionFactory = new JdbcTransactionFactory();

Environment environment = new Environment("development", transactionFactory, dataSource);

Configuration configuration = new Configuration(environment);

configuration.addMapper(BlogMapper.class);

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

      这些配置都是从java类中获取的,一般情况下,我们都习惯用XML配置,因为我们通常要与其他框架(Spring)整合,以便于更好的管理我们的项目。

 

SqlSession


      在我的理解,一个session实例就是一次对数据库的操作的会话过程,一次事物完成了,他也就自动销毁了。我们应该从factory里面获取SqlSession,:

SqlSession session = sqlSessionFactory.openSession();

try {

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

} finally {

  session.close();

}

 

Mapper


      Mapper映射器是你创建绑定映射语句的接口。也就是你配置的对数据库操作的方法的接口。相当于DAO的概念了,但又有不同的地方。

 

它们的范围和生命周期

SqlSessionFactoryBuilder

      这个类可以被实例化,使用和丢弃。一旦你创建了 SqlSessionFactory ,这个类就不需 要存在了。 因此 SqlSessionFactoryBuilder 实例的最佳范围是方法范围 (也就是本地方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例但是最好的方式是 不需要保持它一直存在来保证所有 XML 解析资源,因为还有更重要的事情要做。

SqlSessionFactory

        一旦被创建,SqlSessionFactory 应该在你的应用执行期间都存在。没有理由来处理或重 新创建它。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次。 这样的 操作将被视为是非常糟糕的。 因此 SqlSessionFactory 的最佳范围是应用范围。 有很多方法可 以做到最简单的就是使用单例模式或者静态单例模式。

SqlSession

          每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不能被共享,也是线程 不安全的。因此最佳的范围是请求或方法范围。绝对不能将 SqlSession 实例的引用放在一个 类的静态字段甚至是实例字段中。 也绝不能将 SqlSession 实例的引用放在任何类型的管理范 围中比如 Serlvet 架构中的 HttpSession。 如果你现在正用任意的 Web 框架要考虑 SqlSession 放在一个和 HTTP 请求对象相似的范围内。换句话说,基于收到的 HTTP 请求,你可以打开 了一个 SqlSession,然后返回响应,就可以关闭它了。关闭 Session 很重要,你应该确保使 用 finally 块来关闭它。下面的示例就是一个确保 SqlSession 关闭的基本模式:

SqlSession session = sqlSessionFactory.openSession();

try {

  // do work

} finally {

  session.close();

}

              在你的代码中一贯地使用这种模式将会保证所有数据库资源都正确地关闭 (假设你没有通过你自己的连接关闭,这会给 MyBatis 造成一种迹象表明你要自己管理连接资源,造成资源的浪费

Mapper 实例

            映射器是你创建绑定映射语句的接口。映射器接口的实例可以从 SqlSession 中获得。那 么从技术上来说,当被请求时,任意映射器实例的最宽范围和 SqlSession 是相同的。然而映射器实例的最佳范围是方法范围。也就是说,它们应该在使用它们的方法中被请求,然后 就抛弃掉。它们不需要明确地关闭,那么在请求对象中保留它们也就不是什么问题了,这和 SqlSession 相似。你也许会发现,在这个水平上管理太多的资源的话会失控。保持简单,将映射器放在方法范围内。


本文部分概念摘自Mybatis官网。