MyBatis 学习(三):MyBatis的核心组件

一、常用对象

MyBatis 中的常用对象有 SqlSessionFactirySqlSession

  • SqlSessionFactoryBuilder(构造器):它会根据配置或者代码来生成 SqlSessionFactory,采用的是分步构建的 Builder 模式
  • SqlSessionFactory(工厂接口):依靠它来生成 SqlSession,使用的是工厂模式
  • SqlSession(会话):一个既可以发送 SQL 执行返回结果,也可以获取 Mapper 的接口。在现有的技术中,一般我们会让其在业务逻辑代码中“消失”,而使用的是 MyBatis 提供的 SQL Mapper 接口编程技术,它能提高代码的可读性和可维护性。
  • SQL Mapper(映射器):MyBatis 新设计存在的组件,它由一个 Java 接口和 XML 文件(或注解)构成,需要给出对应的 SQL 和映射规则。它负责发送 SQL 去执行,并返回结果。

二、SqlSessionFactory 对象

SqlSessionFactory 是 MyBatis 的关键对象。它是单个数据库映射关系经过编译后的内存镜像。

SqlSessionFactory 对象的实例可通过 SqlSessionFactoryBuilder 通过读取配置的XML文件或一个预先定制的Configuration 的实例构建。

每一个Mybatis 的应用程序都以一个SqlSessionFactory 对象的实例为核心,其也是线程安全的。

生命周期: SqlSessionFactory 一旦被创建,应该再应用程序执行期间都存在。在应用程序运行期间不要重复创建多次,建议使用单例模式。

SqlSessionFactory 是创建 SqlSession 的工厂。其常用方法如下:

  • SqlSession openSession(); 创建 SqlSession 对象。

2.1 SqlSessionFactory 的创建方式

使用 MyBatis 首先是使用配置或者代码去生产 SqlSessionFactory,而 MyBatis 提供了构造器 SqlSessionFactoryBuilder

它提供了一个类 org.apache.ibatis.session.Configuration 作为引导,采用的是 Builder 模式

在 MyBatis 中,既可以通过读取配置的 XML 文件的形式生成 SqlSessionFactory,也可以通过 Java 代码的形式去生成 SqlSessionFactory。

SqlSessionFactory 是一个接口,在MyBatis 中它存在两个实现类:SqlSessionManagerDefaultSqlSessionFactory。一般而言,具体是由 DefaultSqlSessionFactory 去实现的,而 SqlSessionManager 使用在多线程的环境中。

  • 使用 XML 构建 SqlSessionFactory
    首先,在 MyBatis 中的 XML 分为两类,一类是基础配置文件,通常只有一个,主要是配置一些最基本的上下文参数和运行环境;另一类是映射文件,它可以配置映射关系、SQL、参数等信息。

    先看一份简易的基础配置文件,我们把它命名为 mybatis-config.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>
        <typeAliases><!--别名-->
            <typeAliases alias="user" type="com.zhang.pojo.User"/>
        </typeAliases>
        <!-- 数据库环境 -->
        <environments default="development">
            <environment id="development">
                <!-- 使用JDBC的事务管理 -->
                <transactionManager type="JDBC" />
                <dataSource type="POOLED">
                    <!-- MySQL数据库驱动 -->
                    <property name="driver" value="com.mysql.jdbc.Driver" />
                    <!-- 连接数据库的URL -->
                    <property name="url"
                        value="jdbc:mysql://localhost:3306/ssm?characterEncoding=utf8" />
                    <property name="username" value="root" />
                    <property name="password" value="123456" />
                </dataSource>
            </environment>
        </environments>
        <!-- 将mapper文件加入到配置文件中 -->
        <mappers>
            <mapper resource="com/zhang/mapper/UserMapper.xml" />
        </mappers>
    </configuration>
    

    有了基础配置文件,就可以用一段很简短的代码来生成 SqlSessionFactory 了,如下所示。

    SqlSessionFactory factory = null;
    String resource = "mybatis-config.xml";
    try {
        InputStream inputStream = Resources.getResourceAsStream(resource);
        factory = new SqlSessionFactoryBuilder().build(inputStream);
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    采用 XML 创建的形式,信息在配置文件中,有利于我们日后的维护和修改,避免了重新编译代码。

三、SqlSession 对象

SqlSession 是MyBatis 的关键对象,是执行持久操作的对象,类似于JDBC 中的 Connection。它是应用程序与持久存储层之间执行交互操作的一个 单线程对象

SqlSession 实例可以直接执行已映射的SQL语句。

每个线程都应该拥有它自己的 SqlSession 实例,SqlSession 的实例不能被共享,也是线程不安全的。

使用完 SqlSession 之后关闭 Session 很重要,应该确保使用finally快来关闭它。

SqlSession 常用方法如下:

方法名方法描述
int insert(String statement)插入方法,参数 statement 是在配置文件中定义的< insert/>元素的 id,返回执行SQL语句所影响的行数
int insert(String statement,Object parameter)插入方法,参数 statement 是在配置文件中定义的< insert/>元素的 id,paraneter 是插入所需的参数,通常是对象或者 Map,返回执行SQL语句所影响的行数
int update(String statement)更新方法,参数 statement 是在配置文件中定义的< update/>元素的 id,返回执行SQL语句所影响的行数
int update(String statement,Object parameter)更新方法,参数 statement 是在配置文件中定义的< update/>元素的 id,paraneter 是更新所需的参数,通常是对象或者 Map,返回执行SQL语句所影响的行数
int delete(String statement)删除方法,参数 statement 是在配置文件中定义的< delete/>元素的 id,返回执行SQL语句所影响的行数
int delete(String statement,Object parameter)删除方法,参数 statement 是在配置文件中定义的< delete/>元素的 id,paraneter 是删除所需的参数,通常是对象或者 Map,返回执行SQL语句所影响的行数
< T > T selectOne(String statement)查询方法,参数 statement 是在配置文件中定义的< select/>元素的id。返回执行SQL语句查询结果的泛型对象,通常查询结果只有一天数据时才使用。
< T > T selectOne(String statement,Object parameter)查询方法,参数 statement 是在配置文件中定义的< select/>元素的id,parameter 是查询所需的参数,通常是对象或者 Map。返回执行SQL语句查询结果的泛型对象,通常查询结果只有一天数据时才使用。
< E >List< E > selectList(String statement)查询方法,参数 statement 是在配置文件中定义的< select/>元素的id。返回执行SQL语句查询结果的泛型对象的集合
< E >List< E > selectList(String statement,Object parameter)查询方法,参数 statement 是在配置文件中定义的< select/>元素的id,parameter 是查询所需的参数,通常是对象或者 Map。返回执行SQL语句查询结果的泛型对象的集合
void commit()提交事务
void rollback()回滚事务
void close()关闭 SqlSession 对象
Connection getConnection()获得JDBC的数据库连接对象

3.1 SqlSession 的创建过程

在 MyBatis 中,SqlSession 是其核心接口。在 MyBatis 中有两个实现类,DefaultSqlSessionSqlSessionManager

DefaultSqlSession单线程使用的,而 SqlSessionManager多线程环境下使用。SqlSession 的作用类似于一个 JDBC 中的 Connection 对象,代表着一个连接资源的启用。具体而言,它的作用有 3 个:

  • 获取 Mapper 接口。
  • 发送 SQL 给数据库。
  • 控制数据库事务。

先来掌握它的创建方法,有了 SqlSessionFactory 创建的 SqlSession 就十分简单了,如下所示。

SqlSession sqlSession = SqlSessionFactory.openSession();

SqlSession 控制数据库事务的方法,如下所示。

//定义 SqlSession
SqlSession sqlSession = null;
try {
    // 打开 SqlSession 会话
    sqlSession = SqlSessionFactory.openSession();
    // some code...
    sqlSession.commit();    // 提交事务
} catch (IOException e) {
    sqlSession.rollback();  // 回滚事务
}finally{
    // 在 finally 语句中确保资源被顺利关闭
    if(sqlSession != null){
        sqlSession.close();
    }
}

这里使用 commit 方法提交事务,或者使用 rollback 方法回滚事务。因为它代表着一个数据库的连接资源,使用后要及时关闭它,如果不关闭,那么数据库的连接资源就会很快被耗费光,整个系统就会陷入瘫痪状态,所以用 finally 语句保证其顺利关闭。

参考文章:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值