MyBatis的核心配置

Posted 莫道长安花看尽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis的核心配置相关的知识,希望对你有一定的参考价值。

1.1MyBatis的核心对象

在使用MyBatis框架时,主要涉及两个核心对象:SqlSessionFactory和SqlSession,它们在MyBatis框架中起着至关重要的作用。本节将对这两个对象进行详细讲解。

1.1.1SqlSessionFactory

SqlSessionFactory是MyBatis框架中十分重要的对象,它是单个数据库映射关系经过编译后的内存镜像,

其主要作用是创建SqlSession。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来构建,

而SqlSessionFactoryBuilder则可以通过XML配置文件或一个预先定义好的Configuration实例构建出SqlSessionFactory的实例。

本书所讲解的就是通过XML配置文件构建出的SqlSessionFactory实例,其实现代码如下

//1.读取配置文件
    String resource="mybatis-config.xml";
    InputStream inputStream=
        Resources.getResourceAsStream(resource);
    //2.根据配置文件构建sqlSessionFactory
    SqlSessionFactory sqlSessionFactory=
            new SqlSessionFactoryBuilder().build(inputStream);

SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在。

如果我们多次地创建同一个数据库的SqlSessionFactory,那么此数据库的资源将很容易被耗尽。

为了解决此问题,通常每一个数据库都会只对应一个SqlSessionFactory,所以在构建SqlSessionFactory实例时,建议使用单列模式。

 

1.1.2SqlSession

SqlSession是MyBatis框架中另一个重要的对象,它是应用程序与持久层之间执行交互操作的一个单线程对象,其主要作用是执行持久化操作。

SqlSession对象包含了数据库中所有执行SQL操作的方法,由于其底层封装了JDBC连接,所以可以直接使用其实例来执行已映射的SQL语句。

每一个线程都应该有一个自己的SqlSession实例,并且该实例是不能被共享的。

同时,SqlSession实例也是线程不安全的,因此其使用范围最好在一次请求或一个方法中,绝不能将其放在一个类的静态字段、

实例字段或任何类型的管理范围(如Servlet的HttpSession)中使用。使用完SqlSession对象之后,要及时地关闭它,通常可以将其放在finally块中关闭,代码如下所示。

SqlSession对象中包含了很多方法,其常用方法如下所示。·

<T> T selectOne(String statement);

查询方法。参数statement是在配置文件中定义的<select>元素的id。使用该方法后,会返回执行SQL语句查询结果的一条泛型对象。

 

· <T> T selectOne(String statement, Object parameter);

查询方法。参数statement是在配置文件中定义的<select>元素的id, parameter是查询所需的参数。使用该方法后,会返回执行SQL语句查询结果的一条泛型对象。

 

· <E> List<E> selectList(String statement);

查询方法。参数statement是在配置文件中定义的<select>元素的id。使用该方法后,会返回执行SQL语句查询结果的泛型对象的集合。·

 

<E> List<E> selectList(String statement, Object parameter);

查询方法。参数statement是在配置文件中定义的<select>元素的id, parameter是查询所需的参数。使用该方法后,会返回执行SQL语句查询结果的泛型对象的集合。

·

<E> List<E> selectList(String statement, Object parameter, RowBoundsrowBounds);

查询方法。参数statement是在配置文件中定义的<select>元素的id, parameter是查询所需的参数,rowBounds是用于分页的参数对象。使用该方法后,会返回执行SQL语句查询结果的泛型对象的集合。

 

· void select(String statement, Object parameter, ResultHandler handler);

查询方法。参数statement是在配置文件中定义的<select>元素的id, parameter是查询所需的参数,ResultHandler对象用于处理查询返回的复杂结果集,通常用于多表查询。

 

· int insert(String statement);

插入方法。参数statement是在配置文件中定义的<insert>元素的id。使用该方法后,会返回执行SQL语句所影响的行数。

 

· int insert(String statement, Object parameter);

插入方法。参数statement是在配置文件中定义的<insert>元素的id, parameter是插入所需的参数。使用该方法后,会返回执行SQL语句所影响的行数。

 

· int update(String statement);

更新方法。参数statement是在配置文件中定义的<update>元素的id。使用该方法后,会返回执行SQL语句所影响的行数。

 

· int update(String statement, Object parameter);

更新方法。参数statement是在配置文件中定义的<update>元素的id, parameter是更新所需的参数。使用该方法后,会返回执行SQL语句所影响的行数。

 

· int delete(String statement);

删除方法。参数statement是在配置文件中定义的<delete>元素的id。使用该方法后,会返回执行SQL语句所影响的行数。

 

· int delete(String statement, Object parameter);

删除方法。参数statement是在配置文件中定义的<delete>元素的id, parameter是删除所需的参数。使用该方法后,会返回执行SQL语句所影响的行数。

 

· void commit();

提交事务的方法。

 

· void rollback();

回滚事务的方法。

 

 void close();

关闭SqlSession对象。

 

· <T> T getMapper(Class<T> type);

该方法会返回Mapper接口的代理对象,该对象关联了SqlSession对象,开发人员可以使用该对象直接调用方法操作数据库。参数type是Mapper的接口类型。MyBatis官方推荐通过Mapper对象访问MyBatis。

 

· Connection getConnection();

获取JDBC数据库连接对象的方法。

 

多学一招:使用工具类创建SqlSession在上一章的入门案例中,每个方法执行时都需要读取配置文件,并根据配置文件的信息构建SqlSessionFactory对象,

然后创建SqlSession对象,这导致了大量的重复代码。为了简化开发,我们可以将上述重复代码封装到一个工具类中,然后通过工具类来创建SqlSession,如文件所示。

import java.io.Reader;
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 MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory = null;
    // 初始化SqlSessionFactory对象
    static {
        try {
            // 使用MyBatis提供的Resources类加载MyBatis的配置文件
            Reader reader =
                   Resources.getResourceAsReader("mybatis-config.xml");
            // 构建SqlSessionFactory工厂
             sqlSessionFactory =
                   new SqlSessionFactoryBuilder().build(reader);
           } catch (Exception e) {
                e.printStackTrace();
             }
        }
        // 获取SqlSession对象的静态方法
        public static SqlSession getSession() {
            return sqlSessionFactory.openSession();
        }
}

 

 

1.2配置文件

MyBatis的核心配置文件中,包含了很多影响MyBatis行为的重要信息。这些信息通常在一个项目中只会在一个配置文件中编写,并且编写后也不会轻易改动。

虽然在实际项目中需要开发人员编写或者修改的配置文件不多,但是熟悉配置文件中各个元素的功能还是十分重要的。接下来的几个小节中,将对MyBatis配置文件中的元素进行详细的讲解。

1.2.1主要元素

在MyBatis框架的核心配置文件中,<configuration>元素是配置文件的根元素,其他元素都要在<configuration>元素内配置。

在上一章的入门案例中,我们在配置文件内只使用了<environments>和<mapper>等几个元素,但在实际开发时,通常还会对其他一些元素进行配置。

1.2.2 <properties>元素

<properties>是一个配置属性的元素,该元素通常用于将内部的配置外在化,即通过外部的配置来动态地替换内部定义的属性。

例如,数据库的连接等属性,就可以通过典型的Java属性文件中的配置来替换,具体方式如下。

(1)在项目的src目录下,添加一个全名为db.properties的配置文件,编辑后的代码如下所示。

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root

(2)在MyBatis配置文件mybatis-config.xml中配置<properties... />属性,具体如下。

<properties resource="db.properties">

(3)修改配置文件中数据库连接的信息,具体如下。

<!-- 数据库连接池 -->
       <dataSource type="POOLED">
          <!-- 数据库驱动 -->
           <property name="driver" value="${jdbc.driver}"></property>
          <!-- 连接数据库 -->
          <property name="url" value="${jdbc.url}"></property>
          <!-- 连接数据库的用户名 -->
          <property name="username" value="${jdbc.username}"></property>
          <!-- 连接数据库的密码 -->
         <property name="password" value="${jdbc.password}"></property>
       </dataSource>

以上是关于MyBatis的核心配置的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis-应用分析和最佳实践-核心配置

Mybatis学习之核心原理代码详解

MyBatis框架UserMapperTest类的改进及核心配置文件

MyBatis高级特性

MyBatis框架—动态 SQL配置文件事务

03-Mybatis 核心组件