MyBatis 的基本要素—核心对象

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 工具类
原文地址:https://www.cnblogs.com/wxdestiny/p/9743686.html