MyBatis之核心对象及配置文件详解

一、MyBatis核心对象

1. SqlSessionFactory

SqlSessionFactory是MyBatis框架中十分重要的对象,它是单个数据库映射关系经过编译后的内存镜像,其主要作用是创建SqlSession。可以利用SqlSessionFactoryBuilder对象,通过XML配置文件,来构建SqlSessionFactory。

SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在。所以,在构建SqlSessionFactory实例时,建议使用单例模式。

示范代码:

package com.clzhang.mybatis.mapper;

import java.io.*;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/**
 * SqlSessionFactory应该在你的应用执行期间都存在,所以定义一个通用类,所以获取SqlSessionFactory句柄的程序都从这儿获取。
 *
 */
public class MyBatisSessionFactory {

    private static final String MYBATIS_CONFIG_FILENAME = "config/mybatis-config.xml";
    private static SqlSessionFactory sqlSessionFactory = null;

    static {
        try {
            InputStream inputStream = Resources.getResourceAsStream(MYBATIS_CONFIG_FILENAME);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            throw new RuntimeException("Get resource error:"+MYBATIS_CONFIG_FILENAME, e);
        }
    }
    
    public static SqlSessionFactory getSqlSessionFactory(){   
        return sqlSessionFactory;   
    }
}

2. SqlSession

SqlSession是MyBatis框架中另一个重要的对象,它是应用程序与持久层之间执行交互操作的一个单线程对象,其主要作用是执行持久化操作。SqlSession 对应数据库会话,它不能被共享,也不是线程安全的。

调用程序片段如下:

    @Override
    public void updateProduct(ProductBean product) {
        SqlSession session = MyBatisSessionFactory.getSqlSessionFactory().openSession();
        try {
            session.update("ProductMapper.updateProduct", product);
            session.commit();
        } finally {
            session.close();
        }
    }

SqlSession的常用方法

  • T selectOne(String statement);
  • List selectList(String statement);
  • int insert(String statement);
  • int update(String statement);
  • int delete(String statement);
  • void commit(); 
  • void rollback(); 
  • void close(); 
  • T getMapper(Class type); 
  • Connection getConnection(); 

更多方法,参考:https://tool.oschina.net/apidocs/apidoc?api=mybatis-3.1.1

 二、MyBatis配置文件,mybatis-config.xml

 configuration为最顶层节点,其余所有的属性都必须嵌套在configuration内

2.1 properties元素

properties是一个配置属性的元素,该元素通常用来将内部的配置外在化,即通过外部的配置来动态的替换内部定义的属性。例如,数据库的连接等属性,就可以通过典型的Java属性文件中的配置来替换,具体方式如下:
2.1.1 编写db.properties

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

2.1.2 在mybatis-config.xml中配置<properties… />属性

<properties resource="db.properties" />

2.1.3 在mybatis-config.xml中配置<dataSource.../>属性

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

2.2 settings元素
settings元素主要用于改变MyBatis运行时的行为,例如开启二级缓存、开启延迟加载等。这些配置通常不需要开发人员去干涉,稍作了解即可。配置参考:

 <!-- 设置 -->
 <settings>
     <setting name="cacheEnabled" value="true" />
     <setting name="lazyLoadingEnabled" value="true" />
     <setting name="multipleResultSetsEnabled" value="true" />
     <setting name="useColumnLabel" value="true" />
     <setting name="useGeneratedKeys" value="false" />
     <setting name="autoMappingBehavior" value="PARTIAL" />
</settings>

2.3 typeAliases元素
typeAliases元素用于为配置文件中的Java类型设置一个简短的名字,即设置别名。别名的设置与XML配置相关,其使用的意义在于减少全限定类名的冗余。

2.3.1 使用元素配置别名的方法如下

<typeAliases>
             <typeAlias alias="user" type="com.clzhang.mybatis.entity.User"/>
</typeAliases>

2.3.2 当POJO类过多时,可以通过自动扫描包的形式自定义别名,具体如下:

<typeAliases>
             <package name="com.clzhang.mybatis.entity"/>
</typeAliases>

注意:如果在程序中使用了注解,则别名为其注解的值。

2.4 typeHandler元素
typeHandler的作用就是将预处理语句中传入的参数从javaType(Java类型)转换为jdbcType(JDBC类型),或者从数据库取出结果时将jdbcType转换为javaType。

2.5 objectFactory元素

MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。如果想覆盖对象工厂的默认行为,则可以通过创建自己的对象工厂来实现。

2.6 plugins元素

MyBatis允许你在已映射语句执行过程中的某一点进行拦截调用。

2.7 environments元素

environments元素用于对环境进行配置。MyBatis的环境配置实际上就是数据源的配置,我们可以通过environments元素配置多种数据源,即配置多种数据库。

2.7.1 使用environments元素进行环境配置的示例如下:

    <environments default="development"> 
       <environment id="development"> 
           <transactionManager type="JDBC"/> 
           <dataSource type="POOLED"> 
              <property name="driver" value="oracle.jdbc.driver.OracleDriver"/> 
              <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/> 
              <property name="username" value="mytest"/> 
              <property name="password" value="test001"/> 
           </dataSource> 
       </environment> 
    </environments> 

2.7.2 事务管理器的配置(transactionManager)
在MyBatis中,可以配置两种类型的事务管理器,分别是JDBC和MANAGED。关于这两个事务管理器的描述如下:

  • JDBC:此配置直接使用了JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务的作用域。
  • MANAGED:此配置从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。默认情况下,它会关闭连接,但一些容器并不希望这样,为此可以将closeConnection属性设置为false来阻止它默认的关闭行为。

注意: 如果项目中使用的是Spring+ MyBatis,则没有必要在MyBatis中配置事务管理器,因为实际开发中,会使用Spring自带的管理器来实现事务管理。

2.7.3 数据源的配置(dataSource )

  • UNPOOLED 配置此数据源类型后,在每次被请求时会打开和关闭连接。它对没有性能要求的简单应用程序是一个很好的选择。
  • POOLED 此数据源利用“池”的概念将JDBC连接对象组织起来,避免了在创建新的连接实例时所需要初始化和认证的时间。这种方式使得并发Web应用可以快速的响应请求,是当前流行的处理方式。
  • JNDI 可以在EJB或应用服务器等容器中使用。容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。

2.8 databaseIdProviderf元素

MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库databaseId 属性的所有语句。

2.9 mappers元素

mappers元素用于指定MyBatis映射文件的位置,一般可以使用以下4种方法引入映射器文件,具体如下:

2.9.1 使用类路径引入

<mappers>
   <mapper resource="com/clzhang/mybatis/mapper/UserMapper.xml" />
</mappers>

2.9.2 使用本地文件路径引入

<mappers>
    <mapper url="file:///D:/com/clzhang/mybatis/mapper/UserMapper.xml"/>
</mappers>

2.9.3 使用接口类引入

<mappers>
    <mapper class="com.clzhang.mybatis.mapper.UserMapper"/>
</mappers>

2.9.4 使用包名引入

<mappers>
   <package name="com.clzhang.mybatis.mapper"/>
</mappers>

本文参考:

https://www.cnblogs.com/wxdestiny/p/9743686.html

https://blog.csdn.net/lcachang/article/details/86691237

posted @ 2021-07-28 17:32  那些年的事儿  阅读(685)  评论(0编辑  收藏  举报