(六)mybatis之构建SqlSessionFactory
构建SqlSessionFactory
每个mybatis应用都是以SqlSessionFactory的实例为中心的。SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得。以下是SqlSessionFactory的源码:

我们可以看到,SqlSessionFactory是一个工厂接口,而不是一个实现类。它的任务就是创建SqlSession。SqlSession类似于一个JDBC的Connection对象。
Mybatis提供了两种模式去创建SqlSessionFactory:一种是XML配置的方式;另一种是代码的方式。此处推荐用XML配置的方式,因为这种方式可以避免硬编码,也方便日后配置人员的修改,避免重复编译代码。
Configuration:Mybatis中的Configuration类,将存在于整个Mybatis应用的生命周期中,以便重复读取和运用。我们可以解析一次配置的XML文件保存到Configuration类对象中,方便我们从这个对象中读取配置信息。性能高,单例占用空间小,基本不占用存储空间,而且还可以反复使用。Configuration类对象保存着我们配置在MyBatis中的信息。
SqlSession的实现类:分别是DefaultSessionFactory和SqlSessionManager。


他们之间的关系图是:

1、 使用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>
<typeAlias alias="user" type="com.entity.User"/>
</typeAliases>
<!-- 定义数据库信息,默认使用development数据库构建环境 -->
<environments default="development">
<environment id="development">
<!-- 采用jdbc事务管理 -->
<transactionManager type="JDBC"/>
<!-- 配置数据库链接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
<!-- 定义映射器 -->
<mappers>
<!-- 映射到,pojo的映射文件中去,就像是,输入账号密码正确了,就可以开始操纵数据了 -->
<mapper resource="com/mapper/userMapper.xml"/>
</mappers>
</configuration>
上面是一个简易的XML,包含
① 获取数据库连接实例的数据源(DataSource):
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</dataSource>
② 决定事务范围和控制方式的事务管理器(TransactionManager):
<transactionManager type="JDBC"/>
③ 映射器(SQL Mapper):
<mappers>
<mapper resource="com/mapper/userMapper.xml"/>
</mappers>
也就是说,①这里配置了一个别名叫“user”,它代表“com.entity.User”;②我们配置了环境内容,它默认使用id是development的环境配置,包含的内容有:采用JDBC的事务管理模式、数据库的连接信息和配置映射器。
这里引入了一个XML,它的作用是提供SQL和SQL对POJO的映射规则定义。Mybatis将解析这个XML,来为我们生成映射器。
String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = null; sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
我们创建了一个XML文件输入流,用SqlSessionFactoryBuilder读取XML的信息来创建SqlSessionFactory的对象。
Mybatis的解析程序会将mybaits-config.xml文件配置的信息解析到Configuration类对象里面去,然后利用SqlSessionFactoryBuilder读取这个对象为我们创建SqlSessionFactory。
2、 使用代码方式构建
首先构建Configuration类对象。然后往对象里面注册我们构建SqlSessionFactory所需要的信息即可。
//构建数据连接池
PooledDataSource dataSource = new PooledDataSource();
dataSource.setDriver("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
dataSource.setUsername("root");
dataSource.setPassword("");
//构建数据库事务方式
TransactionFactory transactionFactory = new JdbcTransactionFactory();
//创建了数据库运行环境
Environment environment = new Environment("development",transactionFactory,dataSource);
//构建Configuration对象
Configuration configuration = new Configuration(environment);
//注册一个Mybatis上下文别名
configuration.getTypeAliasRegistry().registerAlias("user",User.class);
//加入一个映射器
configuration.addMapper(UserMapper.class);
//使用SqlSessionFactoryBuilder构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
return sqlSessionFactory;
① 初始化了一个数据库连接池。
② 定义了JDBC的数据库事务管理方式。
③ 用数据库连接池和事务管理方式创建了一个数据库运行环境,并命名为development。
④ 创建了一个Configuration类对象,并把数据库运行环境注册给它。
⑤ 注册一个user的别名。
⑥ 加入一个映射器。
⑦ 用SqlSessionFactoryBuilder通过Configuration对象创建SqlSessionFactory。
(六)mybatis之构建SqlSessionFactory的更多相关文章
- Java框架篇---Mybatis 构建SqlSessionFactory
从 XML 中构建 SqlSessionFactory 基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的.SqlSessionFactory 的实例可以通过 ...
- mybatis源码探索笔记-1(构建SqlSessionFactory)
前言 mybatis是目前进行java开发 dao层较为流行的框架,其较为轻量级的特性,避免了类似hibernate的重量级封装.同时将sql的查询与与实现分离,实现了sql的解耦.学习成本较hibe ...
- 构建SqlSessionFactory 的过程
1 SqlSessionFactory 的核心功能是创建 SqlSession 接口,而 SqlSessionFactory 是通过 SqlSessionFactoryBuilder 去构建. 构建步 ...
- 两种方式(xml+代码)构建SqlSessionFactory+完整实现
首先创建类.接口.数据库: entity包下Admin类: package com.wbg.springJavaConfig.entity; public class Admin { private ...
- (转)MyBatis框架的学习(六)——MyBatis整合Spring
http://blog.csdn.net/yerenyuan_pku/article/details/71904315 本文将手把手教你如何使用MyBatis整合Spring,这儿,我本人使用的MyB ...
- 【转载】Gradle学习 第六章:构建脚本基础
转载地址:http://ask.android-studio.org/?/article/11 6.1. Projects and tasks 项目和任务Everything in Gradle si ...
- Docker学习(六)Dockerfile构建自定义镜像
Docker学习(六)Dockerfile构建自定义镜像 前言 通过前面一篇文章可以知道怎么去使用一个镜像搭建服务,但是,如何构造自己的一个镜像呢,docker提供了dockerfile可以让我们自己 ...
- mybatis学习(一)不使用 XML 构建 SqlSessionFactory
如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中: <dependency> <groupId>org.mybatis&l ...
- MyBatis框架原理1:构建SqlSessionFactory的过程
SqlSessionFactoryBuilder 首先创建了一个SqlSessionFactoryBuilder对象,然后调用该对象的build方法加载全局XML配置的流文件构建出一个SqlSessi ...
随机推荐
- c/c++面试45-50之字符串
45 使用库函数将数字转换为字符串,下面是常用库函数 (1) itoa():将整型转换为字符串 (2)ltoa():将长整形转换为字符串 (3)gcvt():将浮点转换为字符串 46 不使用库函数将整 ...
- springboot2 -广播式WebSocket
1.WebSocket,STOMP,SockJS含义 WebSocket:WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. SockJS:SockJS 是 We ...
- 洛谷 - P2551 - 华夏60战斗机 - 简单dp
https://www.luogu.org/problemnew/show/P2551 首先这道题没有给Hm的最大值,很坑,只能随便开一个100没想到还过了. 观察题目,发现虽然高度可以变化,但是速度 ...
- 51nod 1416【DFS】
思路: 暴力整个图,以这个为起点,然后看一下有没有找到一条路是会指向自己且元素个数>=4: #include <bits/stdc++.h> using namespace std; ...
- uoj#282. 长度测量鸡(构造)
传送门 打表题--只有\(n\leq 3\)有解否则无解→_→ 或者严格证明的话是这样,因为算上端点一共\(n+1\)个点,共\(\frac{n(n+1)}{2}\)个点对,所以点对之间两两距离不相等 ...
- P5175 数列(矩阵加速)
//minamoto #include<bits/stdc++.h> #define R register #define ll long long #define fp(i,a,b) f ...
- spark sql 的metastore 对接 postgresql
本教程记录 spark 1.3.1 版本的thriftserver 的metastore 对接 postgresql postgresql 的编译,参考:http://www.cnblogs.com/ ...
- 【UVA - 10815】Andy's First Dictionary (set)
Andy's First Dictionary Description 不提英文了 直接上中文大意吧 XY学长刚刚立下了再不过CET就直播xx的flag,为了不真的开启直播模式,XY学长决定好好学习英 ...
- JAVA实训总结 :String
String是特殊的类,与其他基本类型并不相同,是被java封装的类型 String底层组成对象为数组与字典(字符集编码表) String 类型的字符串是存储在JVM特别开辟的字符串常量池中 创建 ...
- java面试基础问题
1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 2.Java有 ...