MyBatis 三个基本要素

    ➢ 核心接口和类
   ➢ MyBatis 核心配置文件(mybatis-config.xml)
   ➢ SQL 映射文件(mapper.xml)

MyBatis 核心接口和类

      说明:

      1、每个 MyBatis 的应用程序都以一个 SqlSessionFactory 对象的实例为核心,SqlSessionFactory 对象实例可以通过 SqlSessionFactoryBuilder 对象来获得。首先获取 SqlSessionFactoryBuilder 对象,可以根据 XML 配置文件或 Configuration 类的实例构建该对象。然后获取 SqlSessionFactory 对象,有了 SqlSessionFactory 对象之后,就可以进而获取 Sqlsession 实例, Sqlsession 对象中完全包含以数据库为背景的所有执行 SQL 操作的方法。可以用该实例来直接执行已映射的 SQL 语句。

      2、根据 XML 配置文件构建 SqlSessionFactory 的实例非常简单,建议使用。

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获取 SqlSessionFactory 对象实例
SqlSession session = sqlSessionFactory.openSession(); //获取 SqlSession 对象实例 try {
//业务逻辑代码:如通过调用 session 对象的一系列 SQL 操作方法,对数据库表执行 CRUD 操作
int count=session.selectOne("com.mybatis.dao.UserMapper.count", 2); //方式 1
int count= session.getMapper(UserMapper.class).count(2); //方式 2:更简单,代码更安全,减少类型转换错误(推荐使用)
} finally {
session.close(); //关闭 SqlSession
} 说明:
1、UserMapper mapper = session.getMapper(UserMapper.class); //获取映射器实例 mapper
   2、映射器是你创建绑定映射语句的接口,映射器接口的实例可以从 SqlSession 中获得,映射器实例的最佳范围是方法范围。即它们应该在使用它们的方法中被请求,然后就抛弃掉。它们不需要明确地关闭。

SqlSessionFactoryBuilder

    1、SqlSessionFactoryBuilder 作用

  SqlSessionFactoryBuilder 负责构建 SqlSessionFactory,并且提供了多个 build() 方法的重载,由于方法参数 environment 和 Properties 都可以为 null,那么去除重复的,真正的重载方法其实只有如下三种:

build(Reader reader,String environment,Properties properties)
build(InputStream inputStream,String environment,Properties properties)
build(Configuration config)

  通过上述分析,发现配置信息可以以三种形式提供给 SqlSessionFactoryBuilder 的 build() 方法,分别是 InputStream(字节流)、 Reader(字符流)、 Configuration(类),由于字节流与字符流都属于读取配置文件的方式,所以从配置信息的来源就很容易想到构建一个 SqlSessionFactory 有两种方式:读取 XML 配置文件构造方式和编程构造方式。我们采用读取 XML 配置文件的方式来构造 SqlSessionFactory。

    2、SqlSessionFactoryBuilder 的生命周期和作用域

  SqlSessionFactoryBuilder 的最大特点是:用过即丢。一旦创建了 SqlSessionFactory 对象之后,这个类就不再需要存在了,因此 SqlSessionFactoryBuilder 的最佳范围就是存在于方法体内,也就是局部变量而已。即最佳范围是方法范围 (本地方法变量)。

SqlSessionFactory

    1、SqlSessionFactory 的作用

  SqlSessionFactory 简单的理解就是创建 SqlSession 实例的工厂。所有的 MyBatis 应用都是以 SqlSessionFactory 实例为中心, SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 对象来获得。有了它之后,顾名思义,就可以通过 SqlSessionFactory 提供的 openSession() 方法来获取 SqlSession 实例。

  

  说明: openSession() 方法的参数为 boolean 值时,若传入 true 表示关闭事务控制,自动提交; false 表示开启事务控制。若不传入参数,默认为 true。

openSession (boolean autoCommit)
openSession()//若不传入参数,默认为 true ,自动提交

    

    2、SqlSessionFactory 的生命周期和作用域

  SqlSessionFactory 对象一旦创建,就会在整个应用运行过程中始终存在。没有理由去销毁或再创建它,并且在应用运行中也不建议多次创建 SqlSessionFactory 。因此 SqlSessionFactory 的最佳作用域是 Application,即随着应用的生命周期一同存在。那么这种 “存在于整个应用运行期间,并且同时只存在一个对象实例” 的模式就是所谓的单例模式(指在应用运行期间有且仅有一个实例)。即 SqlSessionFactory 的最佳范围是应用范围。

  

SQLSession

  1、SqlSession

  SqlSession 是用于执行持久化操作的对象,类似于 JDBC 中的 Connection 。它提供了面向数据库执行 SQL 命令所需的所有方法,可以通过 SqlSession 实例直接运行已映射的 SQL 语句。

    2、SqlSession 的生命周期和作用域

  正如其名, SqlSession 对应着一次数据库会话。由于数据库会话不是永久的,因此 SqlSession 的生命周期也不应该是永久的。相反,在每次访问数据库时都需要创建它(注意:并不是说在 SqlSession 里只能执行一次 SQL,是完全可以执行多次的,但是若关闭了 SqlSession ,那么就需要重新创建它)。创建 SqlSession 的地方只有一个,那就是 SqlSessionFactory 对象的 openSession()方法。

  需要注意的是:每个线程都有自己的 SqlSession 实例, SqlSession 实例不能被共享,也不是线程安全的。因此最佳的作用域范围是请求 request 范围或者方法范围。

  关闭 SqlSession 是非常重要的。必须要确保 SqlSession 在 finally 语句块中正常关闭。可以使用下面的标准方式来关闭:

SqlSession session =sqlSessionFactory.openSession();
try{
//do work
}finally{
session.close(); //关闭 SqlSession
}

  3、SqlSession 的两种使用方式

//方式 1:通过 SQLSession 实例调用 selectList、selectOne 等方法来直接执行已映射的 SQL 语句。(不需要编写 DAO 接口)

        // MyBatis 通过 mapper 文件的 namespace 和子元素的 id 来找到相应的 SQL,从而执行查询操作
userList=sqlSession.selectList("com.smbms.dao.UserMapper.getUserList"); 说明:
1、com.smbms.dao.UserMapper.getUserList=namespace+id
2、使用方式一可以不用写接口中的方法,因为方式一直接执行映射文件的 SQL 语句。
     3、执行 CRUD 操作,有参数传递时此方式不适用,应使用方式 2。 //方式 2:基于 mapper 接口方式操作数据。(官方推荐使用) //创建绑定映射语句的接口 UserMapper.java,并提供接口方法 getUserList(),该接口称为映射器。
userList=sqlSession.getMapper(UserMapper.class).getUserList(); 说明:
1、接口的方法必须与 SQL 映射文件中 SQL 语句的 id 一一对应。
2、第二种方式是通过 SQLSession 实例调用 getMapper(Mapper.class) 执行 Mapper 接口方法来实现对数据库的查询操作。
3、第一种方式是旧版本的 MyBatis 提供的操作方式,虽然现在也可以正常工作,但是第二种方式是 MyBatis 官方所推荐使用的,其表达方式也更加直白。代码更加清晰,类型安全,也不用担心易错的字符串字面值以及强制类型转换。

获取 SqlSession 的工具类(MyBatisUtil.java)

  此 MyBatisUtil.java 文件是优化后获取 SqlSession ,关闭 SqlSession 的公用工具类

package cn.mybatis.util;

import java.io.IOException;
import java.io.InputStream; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MyBatisUtil { private static SqlSessionFactory sessionFactory; static{//在静态代码块下,sessionFactory 只会被创建一次
try {
//读取 mybatis-config.xml 文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
//利用SqlSessionFactoryBuilder对象 去构建sessionFactory工厂
sessionFactory = sessionFactoryBuilder.build(in);
} catch (IOException e) {
e.printStackTrace();
}
} //创建sqlSession
public static SqlSession getSqlSession(){
//利用sessionFactory工厂对象去生产sqlSession
SqlSession sqlSession = sessionFactory.openSession(false);//false代表不会自动提交事务,true 代表自动提交事务
return sqlSession;
} //关闭sqlSession
public static void close(SqlSession sqlSession){
if(sqlSession!=null){
sqlSession.close();
}
} }

MyBatisUtil 工具类

MyBatis 的基本要素—核心对象的更多相关文章

  1. Mybatis的基本要素--核心对象

    大家好啊,今天呢来说下Mybatis的核心对象,也就是说基本三要素. >核心接口和类. >Mybatis核心配置文件(mybatis-config.xml) >SQL映射文件 一.下 ...

  2. mybatis的两个核心对象SqlSessionFactory和SqlSession对象

    mybatis的两个核心对象SqlSessionFactory和SqlSession对象 参见:https://www.cnblogs.com/wxdestiny/p/9743686.html

  3. MyBatis的2个核心对象:SqlSessionFactory、SqlSession

    SqlSessionFactory SqlSessionFactory是单个数据库映射关系经过编译后的内存镜像,主要作用是创建SqlSession. InputStream inputStream = ...

  4. MyBatis 的基本要素—核心配置文件

    MyBatis 核心配置文件( mybatis-config.xml),该文件配置了 MyBatis 的一些全局信息,包含数据库连接信息和 MyBatis 运行时所需的各种特性,以及设置和影响 MyB ...

  5. 【MyBatis系列5】MyBatis4大核心对象SqlSessionFactoryBuiler,SqlSessionFactory,SqlSession,Mapper

    前言 前几篇篇我们简单讲解了MyBatis的简单用法,以及一对一和一对多以及多对多的相关动态sql查询标签的使用,也提到了嵌套查询引发了N+1问题,以及延迟加载相关功能,本篇文章将会从MyBatis底 ...

  6. MyBatis核心对象之StatementHandler

    MyBatis核心对象之StatementHandler StatementHandler ResultHandler ParameterHandler Executor org.apache.iba ...

  7. Asp.Net WebApi核心对象解析(下篇)

    在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...

  8. ASP.NET Core的路由[2]:路由系统的核心对象——Router

    ASP.NET Core应用中的路由机制实现在RouterMiddleware中间件中,它的目的在于通过路由解析为请求找到一个匹配的处理器,同时将请求携带的数据以路由参数的形式解析出来供后续请求处理流 ...

  9. Asp.Net WebApi核心对象解析(上篇)

    生活需要自己慢慢去体验和思考,对于知识也是如此.匆匆忙忙的生活,让人不知道自己一天到晚都在干些什么,似乎每天都在忙,但又好似不知道自己到底在忙些什么.不过也无所谓,只要我们知道最后想要什么就行.不管怎 ...

随机推荐

  1. Bing必应地图中国API入门讲座之八:显示驾车路线

    Bing必应地图中国API入门讲座之八:显示驾车路线 2011-05-24 14:47:36|  分类: Bing&Google|字号 订阅     这篇文章非常值得纪念,因为我是在Googl ...

  2. 4.4 Top-Down Parsing

    4.4 Top-Down Parsing Top-down parsing can be viewed as the problem of constructing a parse tree for ...

  3. 12. Ext.Ajax 对ajax的支持

    转自:http://www.cnblogs.com/lipan/archive/2011/12/09/2272793.html 本篇主要介绍一下ExtJs常用的几个对JS语法的扩展支持,包括Ajax封 ...

  4. va_start和va_end使用详解(转载)

    转自:http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html 本文主要介绍va_start和va_end的使用及原理. 在以前 ...

  5. printf的整型

    参 数 说  明 %d 输出数字长为变量数值的实际长度 %md 输出m位(不足补空格,大于m位时按实际长度输出) %-md m含义同上.左对齐输出 %ld l(小写字母)表示输出“长整型”数据 %m1 ...

  6. [Qt Creator 快速入门] 第2章 Qt程序编译和源码详解

    一.编写 Hello World Gui程序 Hello World程序就是让应用程序显示"Hello World"字符串.这是最简单的应用,但却包含了一个应用程序的基本要素,所以 ...

  7. 【转】Linux系统编程---dup和dup2详解

    正常的文件描述符: 在linux下,通过open打开以文件后,会返回一个文件描述符,文件描述符会指向一个文件表,文件表中的节点指针会指向节点表.看下图: 打开文件的内核数据结构 dup和dup2两个函 ...

  8. Jsp四个作用域page、request、session和application的区别

    1.简单说 page指当前页面.在一个jsp页面里有效  2.request 指从http请求到服务器处理结束,返回响应的整个过程.在这个过程中使用forward方式跳转多个jsp.在这些页面里你都可 ...

  9. SqlServer知识点-操作xml

    一.开发环境 SQL2010 二.开发过程 1.声明一个xml类型变量 DECLARE @xmlInfo XML; SET @xmlInfo = '<CompanyGroup> <C ...

  10. LN : leetcode 231 Power of Two

    lc 231 Power of Two 231 Power of Two Given an integer, write a function to determine if it is a powe ...