美文网首页
MyBatis的结构和配置

MyBatis的结构和配置

作者: Dcl_Snow | 来源:发表于2019-10-23 11:23 被阅读0次

概述

MyBatis将用户从JDBC的访问中解放出来,用户只需要定义需要操作的SQL语句,无须关注底层的JDBC操作,就可以面向对象的方式进行持久层操作。底层数据库连接的获取、数据访问的实现、事务控制等都无须用户关心,从而将应用层从底层的JDBC API中抽取出来,通过配置文件管理JDBC的连接,使用MyBatis解决持久化访问的实现。

MyBatis的体系结构

MyBatis中常用的对象有SqlSessionFactory和SqlSession。

SqlSessionFactory

SqlSessionFactory是MyBatis的关键对象,是单个数据库映射关系经过编译后的内存镜像。该对象的实例通过SqlSessionFactoryBuilder对象来获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。
它是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在。在应用运行期间不要重复创建,建议使用单例模式。SqlSessionFactory是SqlSession的工厂,使用SqlSessionFactory.openSession()方法创建SqlSession对象(前文连接:https://www.jianshu.com/p/063a5ca8874c)。

SqlSession

SqlSession是MyBatis的关键对象,是执行持久化操作的对象,类似于JDBC中的Connection。它是应用程序与持久存储层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象。
SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行已经映射的SQL语句。每个线程都应该有自己的SqlSession实例。
SqlSession实例不能被共享,也是线程不安全的,绝对不能将SqlSession实例的引用放在任何类型的管理范围中,应该确保使用完SqlSession之后将它关闭。
SqlSession的方法见如下源码程序:

public interface SqlSession extends Closeable {
    <T> T selectOne(String var1);

    <T> T selectOne(String var1, Object var2);

    <E> List<E> selectList(String var1);

    <E> List<E> selectList(String var1, Object var2);

    <E> List<E> selectList(String var1, Object var2, RowBounds var3);

    <K, V> Map<K, V> selectMap(String var1, String var2);

    <K, V> Map<K, V> selectMap(String var1, Object var2, String var3);

    <K, V> Map<K, V> selectMap(String var1, Object var2, String var3, RowBounds var4);

    <T> Cursor<T> selectCursor(String var1);

    <T> Cursor<T> selectCursor(String var1, Object var2);

    <T> Cursor<T> selectCursor(String var1, Object var2, RowBounds var3);

    void select(String var1, Object var2, ResultHandler var3);

    void select(String var1, ResultHandler var2);

    void select(String var1, Object var2, RowBounds var3, ResultHandler var4);

    int insert(String var1);

    int insert(String var1, Object var2);

    int update(String var1);

    int update(String var1, Object var2);

    int delete(String var1);

    int delete(String var1, Object var2);

    void commit();

    void commit(boolean var1);

    void rollback();

    void rollback(boolean var1);

    List<BatchResult> flushStatements();

    void close();

    void clearCache();

    Configuration getConfiguration();

    <T> T getMapper(Class<T> var1);

    Connection getConnection();
}

具体解释,此处不做记录,使用时查询即可。
\color{red}{注意:}
实际应用中很少直接使用DriverManager来获取数据库连接,通常使用DataSource来获取数据库连接,SqlSessionFactory底层封装了DataSource。

MyBatis的配置文件

此处回顾前文的test测试类文件代码:

public class Test {
    public static void main(String[] args) throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        User user = new User("Snow","男",20);
        sqlSession.insert("com.snow.dcl.mapper.UserMapper.saveUser",user);
        sqlSession.commit();
        sqlSession.close();
    }
}

首先,读取mybatis-config.xml配合文件:

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

然后初始化mybatis,创建SqlSessionFactory的实例:

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

最后获取SqlSession对象,执行SQL语句:

SqlSession sqlSession = sqlSessionFactory.openSession();
...
sqlSession.insert("com.snow.dcl.mapper.UserMapper.saveUser",user);

由此可见,MyBatis的初始化过程要经过以下步骤:

  • 调用SqlSessionFactoryBuilder对象的build(inputStream)方法。
  • SqlSessionFactoryBuilder会根据输入流inputStream等信息创建XMLConfigBuilder对象。
  • SqlSessionFactoryBuilder调用XMLConfigBuilder对象的parse()方法。
  • XMLConfigBuilder对象解析XML配置文件返回Configuration对象。
  • SqlSessionFactoryBuilder根据Configuration对象创建一个DefaultSessionFactory对象。
  • SqlSessionFactoryBuilder返回DefaultSessionFactory对象给客户端,供客户端使用。

配置文件属性

MyBatis的配置文件包含了如下结构:

  • properties属性
    properties中的属性都是可外部配置且可动态替换的,既可以在典型的Java属性文件中配置,也可以通过properties元素的子元素来传递。
  • settings设置
    settings是MyBatis中非常重要的设置,会改变MyBatis的运行时行为,settings元素示例如下:
<settings>
    <!--指定Mybatis所用日志的具体实现,开启日志-->
    <setting name="logImpl" value="Log4J"/>
    <!--开启二级缓存-->
    <setting name="cacheEnabled" value="true"/>
</settings>

其他选项,开发项目时可以按需查询使用,下面列出部分参数:

参数 描述 有效值
cacheEnabled 该配置影响所有映射器缓存的全局开关 true/false
lazyLoadingEnabled 延迟加载的全局开关 true/false
useGenaratedKeys 允许JDBC支持自动生成主键 true/false
logImpl 指定MyBatis所用日志的具体实现,未指定时自动查找 SLF4J/LOG4J/LOG4J2等
  • tpyeAliases类型命名
    类型别名为Java类型设置一个简短的别名,只和XML配置有关,存在的意义仅在于减少类完全限定名的冗余。
<typeAliases>
    <typeAlias type="User" alias="com.snow.dcl.domain.User"/>
</typeAliases>

这样配置时,User可以用在任何使用com.snow.dcl.domain.User的地方。

<typeAliases>
    <package name="com.snow.dcl.domain"/>
</typeAliases>

这样配置时,每一个在com.snow.dcl.domain包中的Java Bean,在没有注解的情况下,会使用Bean的首字母小写的非限定类名来作为别名,例如:com.snow.dcl.domain.User别名为user。

@Alias("user")
public class User {
    ...
}

若有注解,则别名为注解值。

  • typeHandlers类型处理器
    无论是MyBatis在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成Java类型。
  • objectFactory对象工厂
    MyBatis每次创建结果对象的新实例时,都会使用一个对象工厂实例来完成。
  • plugins插件
  • environments环境
    environment环境变量
    transactionManager事务管理器
    dataSource数据源
    MyBatis的环境配置实际就是数据源的配置。MyBatis可以配置多种环境,这种机制使得MyBatis可以将SQL映射应用于多种数据库中。
    \color{red}{注意:}
    尽管可以配置多个环境,但是每个SqlSessionFactory实例只能选择一个环境。所以若想连接两个数据库,需要创建两个SqlSessionFactory实例。
    前文配置内容如下:
<!--环境配置,连接的数据库-->
<environments default="mysql">
    <environment id="mysql">
        <!--指定事务管理的类型,这里简单使用Java的JDBC的提交和回滚设置-->
        <transactionManager type="JDBC"></transactionManager>
        <!--dataSource 指连接源配置,POOLED是JDBC连接对象的数据源连接池的实现-->
        <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver"></property>
            <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&amp;characterEncoding=UTF-8"></property>
            <property name="username" value="root"></property>
            <property name="password" value="****"></property>
        </dataSource>
    </environment>
</environments>

默认的环境ID(default="mysql")。
每个environment元素定义的环境ID(id="mysql")。
事务管理器配置( type="JDBC")。
数据源的配置(type="POOLED")。
环境ID可以随意命名,默认环境ID一定要匹配定义的其中一个环境ID。

  • databaseIDProvider数据库厂商标识
  • mappers映射器
    MyBatis开着需要自己写SQL语句,mapper映射器配置告诉MyBatis到哪里去找映射文件,进而找到这些SQL语句:
<mappers>
    <!--告诉Mybatis持久化类的映射文件路径-->
    <mapper resource="mapping/UserMapper.xml"></mapper>
</mappers>

以上就是对MyBatis的结构和配置文件记录。

相关文章

  • mybatis配置文件

    配置 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下 ...

  • Springboot多模块搭建 一WEB构建

    web 项目结构 config目录 缓存配置 邮件配置 mybatis配置 redis配置 启动项 mybatis...

  • MyBatis框架简介

    MyBatis 什么是MyBatis MyBatis体系结构 MyBatis配置文件 MyBatis框架API主要...

  • Mybatis核心配置文件解析

    MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下: co...

  • MyBatis的结构和配置

    概述 MyBatis将用户从JDBC的访问中解放出来,用户只需要定义需要操作的SQL语句,无须关注底层的JDBC操...

  • SpringBoot笔记(八)MyBatis

    插件和配置 mybatis redis mysql druid 依赖 配置文件 编写程序 结构 model 数据库...

  • 3.详解MyBatis的配置文件

    MyBatis配置xml层次结构,而且必须注意其顺序。 MyBatis官网中文XML映射配置文件 1.proper...

  • MyBatis入门

    MyBatis HelloWorld 目录结构 准备数据库 jar包 使用Maven添加依赖: MyBatis配置...

  • MyBatis详解3.MyBatis配置详解

    点击进入我的博客 1 MyBatis XML配置文件层次结构 以下的图片展示了MyBatis的全部配置元素 2 p...

  • Mybatis环境搭建<0>

    mybatis官方中文文档 IDE:intellij构建工具:gradle框架:mybatis 配置好后的结构如图...

网友评论

      本文标题:MyBatis的结构和配置

      本文链接:https://www.haomeiwen.com/subject/cljhvctx.html