手把手从零开始学习入门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层编写以下功能代码:

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

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

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

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

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

  • 通过配置文件获取数据库连接相关信息
  • 通过配置信息创建SqlSessionFactory对象。一眼就可以看出这是一个工厂类,负责创建SqlSession对象实例
  • 使用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学习路程。静请期待。

作者:禹爸爸 
原文:https://blog.csdn.net/chris_mao/article/details/48803545 

原文发布于微信公众号 - 好好学java(SIHAIloveJAVA)

原文发表时间:2018-11-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏蓝天

Linux下共享库(SO)有关的几个环境变量

Linux支持共享库已经有悠久的历史了,不再是什么新概念了。大家都知道如何编译、连接以及动态加载(dlopen/dlsym/dlclose) 共享库。但是,...

17910
来自专栏JadePeng的技术博客

axios介绍与使用说明 axios中文文档

本周在做一个使用vuejs的前端项目,访问后端服务使用axios库,这里对照官方文档,简单记录下,也方便大家参考。 Axios 是一个基于 Promise 的 ...

2.9K90
来自专栏行者常至

Hibernate获取当前Session,Hibernate清空当前Session的缓存

每次update时,都要记录更新了什么字段,由什么值更新为什么值。所以使用的是Aop,在@around方法中,joinPoint.proceed()之前,运用方...

21610
来自专栏求索之路

Android数据层架构的实现 上篇

最近我们app的服务器吃不消了,所以我在为服务器增加缓存层之后,又想到在app端进行二级缓存以减少app对服务器的访问。我想很多app应该在项目的初期架构的时...

33980
来自专栏noteless

springmvc 项目完整示例04 整合mybatis mybatis所需要的jar包 mybatis配置文件 sql语句 mybatis应用

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google c...

10820
来自专栏大内老A

ASP.NET Core应用的错误处理[3]:ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”

DeveloperExceptionPageMiddleware中间件利用呈现出来的错误页面实现抛出异常和当前请求的详细信息以辅助开发人员更好地进行纠错诊断工作...

34880
来自专栏前端杂谈

vue使用Axios做ajax请求

513120
来自专栏Java帮帮-微信公众号-技术文章全总结

RabbitMQ详解解答【面试+工作】

如果安装rabbitMQ首先安装基于erlang语言支持的OTP软件,然后在下载rabbitMQ软件进行安装(安装过程都是下一步,在此不在说了)

39110
来自专栏张戈的专栏

Linux系统监控、诊断工具之top命令详解

暂时没有写作灵感,就整理一些 Linux 基础知识好了,方便自己查阅,同时也是温故而知新嘛~! 在张戈博客,同样很有用的知识性博文还有以下几篇,也许你也会比较感...

46390
来自专栏米扑专栏

Linux free命令:buffer 与 cache 区别

73790

扫码关注云+社区

领取腾讯云代金券