`
禹爸爸
  • 浏览: 79430 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Mybatis系列(一)入门

阅读更多

Mybatis入门

 

 

简介

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

安装

要使用Mybatis只需要到官网下载Mybatis的Jar包,并复制到ClassPath下即可。如果您是使用Maven来构建Java项目,那只需要在其pom.xml文件中加入Mybatis的依赖关系即可。

 

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
     <version>3.3.0</version>
 </dependency>

连接数据库

在使用Mybatis之前,我们要先确保其可以正确连接到我们要使用的目标数据库。Mybatis连接数据库也是非常的简单,和JDBC类似,只需要在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="com.mysql.jdbc.Driver"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
    <environment id="product">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
</configuration>

 

Mybatis允许我们在同一个配置文件中指定多个数据库连接信息,实际工作中也是需要这样的。开发环境,我们需要一个用于开发的数据库;测试环境,我们需要一个用于系统测试的数据库;生产环境,我们需要一个保存真实数据的生产数据库。在Mybatis中,使用enviroments标签即可定义多个环境中需要使用的数据库连接信息,并使用default关键字指示出当前使用的环境信息。

数据库连接配置写好之后,我们就可以开始编写操作数据库的Java代码了。大家可以回想一下,使用JDBC是如何操作数据库的呢?熟悉Java开发模式的同学一定知道,我们需要在DAO层编写以下功能代码:

 

  1. 加载数据库驱动类 Class.forName(“com.mysql.jdbc.driver”);
  2. 获得数据库连接 DeriverManager.getConnection(url, username, password)
  3. 执行SQL语句
  4. 获取查询结果,进行封装
  5. 返回封装后的结果

 

其中前两步,通常我们会提取出来,封装在一个专门数据与数据库连接的类DBUtils中。为什么这样做呢?因为DAO层要做的只是后面三步的工作,至于如何连接数据库、连接哪个数据库,DAO层是不关心的。她需要的是一个能够与数据库交互,交执行SQL语句的对象。在使用JDBC时,就是Connection对象。那么在Mybatis中有没有这样一个对象呢?又是如何向DAO层提供这个对象的呢?

在正式开始编写Java代码之前,我们先了解一下Mybatis的相关基础知识。

答案是肯定的,在Mybatis中向DAO层提供的这个能够与数据库交互并执行SQL语句的对象叫做SqlSession。这个是Mybatis最核心的一个对象。SqlSession完全包含了面向数据库执行SQL命令所需的全部方法。

那么如何获得这个对象呢?分为三步。

 

  1. 通过配置文件获取数据库连接相关信息
  2. 通过配置信息创建SqlSessionFactory对象。一眼就可以看出这是一个工厂类,负责创建SqlSession对象实例
  3. 使用SqlSessionFactory创建SqlSession对象,打开一个数据库会话。

 

下面的代码展示了数据库连接实践。

 

Reader reader;
SqlSessionFactory sqlSessionFactory;
try {
  //读取配置文件
    reader = Resources.getResourceAsReader("mybatis.xml");
} catch (IOException e) {
e.printStackTrace();
}
//创建SqlSessionFactory对象实例
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//获得数据库会话对象实例
SqlSession session = sqlSessionFactory.openSession();
try {
    //数据库操作
    ……
} finally {
    //关闭数据库会话
    session.close();
}

 

 

范围和生命周期

这里顺带提一下上述代码中使用到的几个主要对象的范围和生命周期。

SqlSessionFactoryBuilder

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

SqlSessionFactory

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏味道(bad smell)”。因此 SqlSessionFactory 的最佳范围是应用范围。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的范围是请求或方法范围。绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。也绝不能将 SqlSession 实例的引用放在任何类型的管理范围中,比如 Serlvet 架构中的 HttpSession。如果你现在正在使用一种 Web 框架,要考虑 SqlSession 放在一个和 HTTP 请求对象相似的范围中。换句话说,每次收到的 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,就关闭它。这个关闭操作是很重要的,你应该把这个关闭操作放到 finally 块中以确保每次都能执行关闭。

 

通过本篇的学习,我们对Mybatis有了一个大体的了解。后续我还会和大家一起分享我的Mybatis学习路程。静请期待。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics