04- Mybatis SqlSessionFactory
Posted zhaoqiang-lab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了04- Mybatis SqlSessionFactory相关的知识,希望对你有一定的参考价值。
Mybatis SqlSessionFactory
一、前言
-
使用Mybatis 首先是使用配置文件或者代码区生产SqlSessionFactory, 而Mybatis 提供了构造器SqlSessionFactoryBuilder。
-
它提供了一个类Configuration 作为引导,采用的是Builder 模式。具体的分步则是在Configuration 中完成的。
-
在Mybatis 中既可以通过读取配置文件的XML 文件的形式生成SqlSessionFactory,也可以通过Java 代码的形式去生成SqlSessionFactory。
建议使用XML 的方式。因为代码的方式在需要修改的时候会比较麻烦。当配置了XML或者提供代码后,Mybatis 会读取配置文件,通过Configuration 类对象构建整个Mybatis 上下文。
-
一般而言。具体是由DefaultSqlSessionFactory 去实现的,而SqlSessionManager使用在多线程环境中,它具体实现依靠DefaultSqlSessionFactory,他们之间的关系如下图所示。
-
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的,而 SqlSessionFactory 唯一的作用就是生产 MyBatis 的核心接口对象 SqlSession,所以它的责任是唯一的。我们往往会采用单例模式处理它,下面讨论使用配置文件和 Java 代码两种形式去生成 SqlSessionFactory 的方法
二、SqlSessionFactory 的两种创建方式
1) XML 文件形式
-
使用 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.mybatis.po.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/mybatis?characterEncoding=utf8" /> <property name="username" value="root" /> <property name="password" value="1128" /> </dataSource> </environment> </environments> <!-- 将mapper文件加入到配置文件中 --> <mappers> <mapper resource="com/mybatis/mapper/UserMapper.xml" /> </mappers> </configuration>
我们描述一下 MyBatis 的基础配置文件:
元素定义了一个别名 user,它代表着 com.mybatis.po.User 这个类。这样定义后,在 MyBatis 上下文中就可以使用别名去代替全限定名了。 元素的定义,这里描述的是数据库。它里面的 元素是配置事务管理器,这里采用的是 MyBatis 的 JDBC 管理器方式。 元素配置数据库,其中属性 type="POOLED" 代表采用 MyBatis 内部提供的连接池方式,最后定义一些关于 JDBC 的属性信息。 元素代表引入的那些映射器,在谈到映射器时会详细讨论它。
-
有了基础配置,我们就可以使用一段很简短的代码来生成SqlSessionFactory 了,如下:
SqlSessionFactory factory = null; String resource = "mybatis-config.xml"; InputStream is; try { InputStream is = Resources.getResourceAsStream(resource); factory = new SqlSessionFactoryBuilder().build(is); } catch (IOException e) { e.printStackTrace(); }
首先读取 mybatis-config.xml,然后通过 SqlSessionFactoryBuilder 的 Builder 方法去创建 SqlSessionFactory。整个过程比较简单,而里面的步骤还是比较烦琐的,只是 MyBatis 采用了 Builder 模式为开发者隐藏了这些细节。这样一个 SqlSessionFactory 就被创建出来了。
2) java 代码方式(不推荐,但还是要学习如何使用)
-
// 数据库连接池信息 PooledDataSource dataSource = new PooledDataSource(); dataSource.setDriver("com.mysql.jdbc.Driver"); dataSource.setUsername("root"); dataSource.setPassword ("1128"); dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis"); dataSource.setDefeultAutoCommit(false); // 采用 MyBatis 的 JDBC 事务方式 TransactionFactory transactionFactory = new JdbcTransactionFactory(); Environment environment = new Environment ("development", transactionFactory, dataSource); // 创建 Configuration 对象 Configuration configuration = new Configuration(environment); // 注册一个 MyBatis 上下文别名 configuration.getTypeAliasRegistry().registerAlias("role", Role.class); // 加入一个映射器 configuration.addMapper(RoleMapper.class); //使用 SqlSessionFactoryBuilder 构建 SqlSessionFactory SqlSessionFactory SqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); return SqlSessionFactory;
注意代码中的注释,它和 XML 方式实现的功能是一致的,只是方式不太一样而已。但是代码冗长,如果发生系统修改,那么有可能需要重新编译代码才能继续,所以这不是一个很好的方式。
除非有特殊的需要,比如在配置文件中,需要配置加密过的数据库用户名和密码,需要我们在生成 SqlSessionFactory 前解密为明文的时候,才会考虑使用这样的方式
以上是关于04- Mybatis SqlSessionFactory的主要内容,如果未能解决你的问题,请参考以下文章
Mybatis -- Mybatis相应API(SqlSessionFactoryBuilderSqlSessionFactory(可以设置自动提交事务)SqlSession)