> 文档中心 > 【MyBatis基础教学一】-入门

【MyBatis基础教学一】-入门


什么是 MyBatis ?

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


入门

每一个 MyBatis 的应 用程序 都以一 个 SqlSessionFactory 对象的 实例为 核心。
SqlSessionFactory 对 象 的 实 例 可 以 通 过 SqlSessionFactoryBuilder 对 象 来 获 得 。
SqlSessionFactoryBuilder 对象可以通过 XML 配置文件,或从以往使用惯例中准备好的
Configuration 类实例中来构建 SqlSessionFactory 对象。


一、从 XML 中构建 SqlSessionFactory

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

  1. String resource = “org/mybatis/example/Configuration.xml”; Reader

  2. reader = Resources.getResourceAsReader(resource); sqlMapper = new

  3. SqlSessionFactoryBuilder().build(reader);

XML 配置文件包含对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源和决定事务范围和控制的事务管理器。关于 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="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers></configuration>

当然,在XML配置文件中还有很多可以配置的,上面的示例指出的则是最关键的部分。要注意 XML 头部的声明,需要用来验证 XML 文档正确性。environment 元素体中包含对事务管理和连接池的环境配置。mappers 元素是包含所有 mapper (映射器)的列表,这些 mapper的 XML 文件包含 SQL 代码和映射定义信息。



二、不使用 XML 构建 SqlSessionFactory

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

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();TransactionFactory transactionFactory = newJdbcTransactionFactory();Environment environment =new Environment("development", transactionFactory, dataSource);Configuration configuration = new Configuration(environment);configuration.addMapper(BlogMapper.class);SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(configuration);

注意这种情况下配置是添加映射器类。映射器类是 Java 类,这些类包含 SQL 映射语句的注解从而避免了 XML 文件的依赖,XML 映射仍然在大多数高级映射(比如:嵌套 Join映射)时需要。出于这样的原因,如果存在 XML 配置文件的话,MyBatis 将会自动查找和加载一个对等的 XML 文件(这种情况下,基于类路径下的 BlogMapper.class 类的类名,那么 BlogMapper.xml 将会被加载)。后面我们会了解更多。


三、从 从 SqlSessionFactory 中获取 SqlSession

现在,我们已经知道如何获取 SqlSessionFactory 对象了,基于同样的启示,我们就可以获得 SqlSession 的实例了。SqlSession 对象完全包含以数据库为背景的所有执行 SQL 操作的方法。你可以用 SqlSession 实例来直接执行已映射的 SQL 语句。例如:

SqlSession session = sqlMapper.openSession();try {Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);} finally {session.close();}

这种方法起到的作用,和我们使用之前的 MyBatis 版本是相似的,现在有一种更简洁的方法。使用合理描述参数和 SQL 语句返回值的接口(比如 BlogMapper.class),这样现在就可以执行更简单,更安全的代码,没有容易发生的字符串文字和转换的错误。
例如:

SqlSession session = sqlSessionFactory.openSession();try {BlogMapper mapper = session.getMapper(BlogMapper.class);Blog blog = mapper.selectBlog(101);} finally {session.close();}}

现在我们来探究一下这里到底执行了什么。


四、探究 已映射的 SQL 语句

这里你也许想知道通过 SqlSession 和 Mapper 对象到底执行了什么操作。已映射的 SQL语句是一个很大的主题,而且这个主题会贯穿本文档的大部分内容。为了给出一个宏观的概念,这里有一些示例。上面提到的任何一个示例,语句是通过 XML 或注解定义的。我们先来看看 XML。使用基于 XML 的映射语言,在过去的几年中使得 MyBatis 非常流行,它为 MyBatis 提供所有的特性设置。如果你以前用过 MyBatis,这个概念就应该很熟悉了,但是 XML 映射文件也
有很多的改进,后面我们会详细来说。这里给出一个基于 XML 映射语句的示例,这些语句应该可以满足上述示例中 SqlSession 对象的调用。

<?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>

这个简单的例子中看起来有很多额外的东西,但是也相当简洁了。如果你喜欢,你可以在一个单独的 XML 映射文件中定义很多的映射语句,除 XML 头部和文档类型声明之外,你可以得 到很 多方便 之处。 在文件 的剩 余部分 是很好 的自我 解释 。在命 名空间“com.mybatis.example.BlogMapper”中,它定义了一个名为“selectBlog”的映射语句,这样它允许你使用完全限定名“org.mybatis.example.BlogMapper.selectBlog”来调用映射语句,我们下面示例中所有的写法也是这样的。

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

要注意这个使用完全限定名调用 Java 对象的方法是相似的,这样做是有原因的。这个命名可以直接映射相同命名空间下的映射器类,使用一个名称,参数和返回值和已映射的查询语句都一样的方法即可。这就允许你非常容易地调用映射器接口中的方法,这和你前面看到的是一样的,下面这个示例中它又出现了。

BlogMapper mapper = session.getMapper(BlogMapper.class);Blog blog = mapper.selectBlog(101);

第二种方式有很多的优点,首先它不是基于文字的,那就更安全了。第二,如果你的IDE 有代码补全功能,那么你可以利用它来操纵已映射的 SQL 语句。第三,不需要强制类型转换,同时 BlogMapper 接口可以保持简洁,返回值类型很安全(参数类型也很安全)。

4.1 命名空间的一点注释

在这里插入图片描述
对 BlogMapper 这样的映射器类来说,还有一个妙招。它们中间映射的语句可以不需要在 XML 中来写,而可以使用 Java 注解来替换。比如,上面的 XML 示例可以如下来替换:

package org.mybatis.example;public interface BlogMapper {@Select("SELECT * FROM blog WHERE id = #{id}")Blog selectBlog(int id);}

对于简单语句来说,使用注解代码会更加清晰,然而 Java 注解对于复杂语句来说就会混乱,应该限制使用。因此,如果你不得不做复杂的事情,那么最好使用 XML 来映射语句。当然这也取决于你和你的项目团队的决定,看哪种更适合你来使用,还有以长久方式来使用映射语句的重要性。也就是说,不要将自己局限在一种方式中。你可以轻松地将注解换成 XML 映射语句,反之亦然。


五、范围和生命周期

理解我们目前已经讨论过的不同范围和生命周期类是很重要的。不正确的使用它们会导致严重的并发问题。

5.1 SqlSessionFactoryBuilder

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

5.2 SqlSessionFactory

一旦被创建,SqlSessionFactory 实例应该在你的应用程序执行期间都存在。没有理由来处理或重新创建它。使用 SqlSessionFactory 的最佳实践是在应用程序运行期间不要重复创建多次。这样的操作将被视为是非常糟糕的。因此 SqlSessionFactory 的最佳范围是应用范围。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。然而这两种方法都不认为是最佳实践。这样的话,你可以考虑依赖注入容器,比如 Google Guice 或 Spring。这样的框架允许你创建支持程序来管理单例 SqlSessionFactory 的生命周期。

5.3 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 造成一种迹象表明你要自己管理连接资源)。

5.4 映射器 实例

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

SqlSession session = sqlSessionFactory.openSession();try {BlogMapper mapper = session.getMapper(BlogMapper.class);// do work} finally {session.close();}

下一章为大家带来【MyBatis基础教学二】- XML 映射配置文件。谢谢各位同学,一键三联~