MyBatis学习(二):解析MyBatis配置文件的写法和使用原理

2023-11-18

MyBatis学习(一):一个简单的演示

上面就是一个很简单的MyBatis的应用实例,可以看看,对于如何如此做可能就不是很清楚了。

首先每一个MyBatis的应用程序都是以一个SqlSessionFactory对象的实例为核心。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来获得。SqlSessionFactoryBuilder对象可以从XML配置文件或是从configuration类的准备的实例中构建相应的SqlSessionFactory对象。下面是通过XML配置文件来构建SqlSessionFactory对象。由于conf.xml是直接放在src下,因此文件路径可以省,但是如果xml文件是放在包下面还要把包名称写上。

		String resource="conf.xml";
		InputStream inputStream=Resources.getResourceAsStream(resource);
		SqlSessionFactory sessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
<?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>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />

			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis002" />
				<property name="username" value="root" />
				<property name="password" value="wang314159" />
			</dataSource>

		</environment>
	</environments>
	<mappers >
		<mapper resource="User.xml"/>
	</mappers>

</configuration>


SqlSessionFactoryBuilder:

这个类可以被实例化,使用和丢弃。一旦你创建了 SqlSessionFactory 后,这个类就不需要存在了。因此 SqlSessionFactoryBuilder 实例的最佳范围是方法范围(也就是本地方法变量)。
你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但是最好的方式是
不需要保持它一直存在来保证所有 XML 解析资源,因为还有更重要的事情要做。

SqlSessionFactory:

一旦被创建,SqlSessionFactory 应该在你的应用执行期间都存在。没有理由来处理或重
新创建它。使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次。这样的
操作将被视为是非常糟糕的。因此 SqlSessionFactory 的最佳范围是应用范围。有很多方法可
以做到,最简单的就是使用单例模式或者静态单例模式。然而这两种方法都不认为是最佳实
践。这样的话,你可以考虑依赖注入容器,比如 Google Guice 或 Spring。这样的框架允许你
创建支持程序来管理单例 SqlSessionFactory 的生命周期。

SqlSession:

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不能被共享,也是线程
不安全的。因此最佳的范围是请求或方法范围。绝对不能将 SqlSession 实例的引用放在一个
类的静态字段甚至是实例字段中。也绝不能将 SqlSession 实例的引用放在任何类型的管理范
围中,比如 Serlvet 架构中的 HttpSession。如果你现在正用任意的 Web 框架,要考虑 SqlSession
放在一个和 HTTP 请求对象相似的范围内。换句话说,基于收到的 HTTP 请求,你可以打开
了一个 SqlSession,然后返回响应,就可以关闭它了。关闭 Session 很重要,你应该确保使
用 finally 块来关闭它。


XML配置文件包含对于MyBatis系统的核心设置,包含获取数据库连接实例的数据源和决定事务范围和控制的事务管理器。environment元素体中包含对事务管理和连接池的环境配置。mappers元素是包含所有mapper(映射器)的列表,这些mapper的xml文件包含SQL代码和映射定义信息。

对于使用mybatis中,需要两个xml文件,一个是xml配置文件,另外一个是SQl映射文件。首先是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>
	<properties>
	</properties>

	<settings>
		<setting name="" value="" />
	</settings>

	<typeAliases>
	</typeAliases>

	<typeHandlers>
	</typeHandlers>

	<objectFactory type="">
	</objectFactory>

	<plugins>
		<plugin interceptor=""></plugin>
	</plugins>

	<environments default="">
		<environment id="">
			<transactionManager type="">
			</transactionManager>
			<dataSource type="">
				<property name="" value="" />
			</dataSource>
		</environment>
	</environments>

	<mappers>
		<mapper resource="" />
	</mappers>

</configuration>

上面是所有的结构,但在使用过程中可能不会全部使用。

1.properties

其实这个使用的很多,我们经常会将连接数据库的信息,放在一个配置文件中,这样就可以使用这个来加载配置文件。有一个db.properties文件中的内容如下:

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

conf.xml中需要使用properties加载这个配置文件:

<properties resource="db.properties">
</properties>

当然在properties中也可以添加<property />

<properties resource="db.properties">
		<property name="name" value="root" />
		<property name="password" value="wang123456" />
	</properties>

后面的property如果与db.properties中相同名字,那么将会覆盖db.properties中的。

在下面<dataSource/>中使用就可以直接通过${}获取,如下所示,这样在更改连接的时候就会很方便,当然也起到一定的隐藏。

2.setting

这个一个很需要注意的,里面的配置会改变MyBatis的行为方式,下面的表格描述了设置信息,含义和默认值。



3.typeAliases

类型别名是为java类型命名一个短的名字,这个设置后,在sql映射的xml文件中很有使用的价值,他只是用来减少类完全限定名的多余部分。其实简单的说就是给需要的起一个别名,在sql映射文件中,需要使用到java bean,类完全限定名可能要包括包名会很长,使用起来不是很方便

<typeAliases>
		<typeAlias type="com.wpl.demo.User" alias="_User" />
</typeAliases>

上面设置,需要使用com.wpl.demo.User这个类完全限定名时候就可以使用_User来代替,这个使用起来很方便,用的也比较多。

4.typeHandlers

无论是MyBatis在预处理语句中设置一个参数,还是从结果集中取出一个值时候,类型处理器被用来将获取的值以合适的方式转化为java类型。下面的表格描述了默认类型的处理器。

 

当然我们也可以自己根据自己需要重写类型处理器或创建自己的类型处理器来处理不支持的或非标准的类型。这时候需要实现TypeHandler接口(org.mybatis.tye),然后映射新的类型处理器到java类型,还有可选的一个JDBC类型。但是很多情况下,我们不会自己做,因此默认已经做的很好了。

 

5.objectFactory

MyBatis每次创建结果对象新的实例时候,它使用一个ObjectFactory实例来完成。如果参数映射存在,默认的ObjectFactory不比使用默认构造方法或是带参数的构造方法实例化目标类做的工作多。如果你想重写默认的ObjectFactory,你可以创建你自己的。

 

6.plugins

MyBatis允许你在某一点拦截已映射语句执行的调用。在默认情况下,MyBatis允许使用插件来拦截方法调用。

这个用到的很少,如果你确实有使用到相关的操作,可以自己更加深入的学习。

7.environments

MyBatis可以配置多种环境。这会帮助你将SQL映射应用到多种数据库之中。例如,你也许为开发设置不同的配置,测试和生产环境。或者你可能有多种生产数据库但是共享相同的模式,所以你会想对不同数据库使用相同的SQL映射。

一个很重要的问题需要记住:你可以配置多种环境,但是你只能为每个SqlSessionFactory实例选择一个。所以如果你想连接两个数据库,那么你需要创建两个SqlSessionFactory实例,每一个数据库对应一个。如果是三个数据库,你需要三个实例,以此类推。

每一个数据库对应一个SqlSessionFactory,为了明确创建哪种环境,你可以选择将他作为参数传递给SqlSessionFactoryBuilder

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment);
SqlSessionFactory  factory  =  sqlSessionFactoryBuilder.build(reader,
environment,properties);

如果环境被忽略,没那么环境将会被加载,如下运行

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties);

8.transactionManager

mybatis中有两个事务管理器类型(type=[JDBC|MANAGED]

(1).JDBC:这个配置直接简单使用了JDBC的提交和回滚设置。它依赖于从数据源得到连接来管理事务范围。

(2).MANAGED:这个配置几乎没有做什么。他从来不提交或是回滚一个连接。而他会让容器来管理事务的整个周期。默认情况下他会关闭连接。然而一些容器并不希望这样,因此如果你需要从连接中停止他,将closeConnection属性设置为false

<transactionManager type="MANAGED">
<property name="closeConnection" value="false"/>
</transactionManager>

9.dataSource

dataSource 元素使用基本的 JDBC 数据源接口来配置 JDBC 连接对象的资源。

Ø  许多 MyBatis 的应用程序将会按示例中的例子来配置数据源。然而它并不是必须的。

要知道为了方便使用延迟加载,数据源才是必须的。

有三种内建的数据源类型(也就是 type=???”):

(1)UNPOOLED – 这个数据源的实现是每次被请求时简单打开和关闭连接。它有一点慢,

这是对简单应用程序的一个很好的选择,因为它不需要及时的可用连接。不同的数据库对这

个的表现也是不一样的,所以对某些数据库来说配置数据源并不重要,这个配置也是闲置的。

UNPOOLED 类型的数据源仅仅用来配置以下 4 种属性:

 driver – 这是 JDBC 驱动的 Java 类的完全限定名(如果你的驱动包含,它也不是

数据源类)。

 url – 这是数据库的 JDBC URL 地址。

 username – 登录数据库的用户名。

    password – 登录数据库的密码。

 defaultTransactionIsolationLevel – 默认的连接事务隔离级别。

作为可选项,你可以传递数据库驱动的属性。要这样做,属性的前缀是以driver.”开

头的,例如:

 driver.encoding=UTF8

UTF8 ” 来 传 递 属 性 “ encoding ”, 它 是 通 过

DriverManager.getConnection(url,driverProperties)方法传递给数据库驱动。

(2)POOLED – 这是 JDBC 连接对象的数据源连接池的实现,用来避免创建新的连接实例

时必要的初始连接和认证时间。这是一种当前 Web 应用程序用来快速响应请求很流行的方

法。

除了上述(UNPOOLED)的属性之外,还有很多属性可以用来配置 POOLED 数据源:

 poolMaximumActiveConnections – 在任意时间存在的活动(也就是正在使用)连

接的数量。默认值:10

 poolMaximumIdleConnections – 任意时间存在的空闲连接数。

  poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检查的时间。默认

值:20000 毫秒(也就是 20 秒)

 poolTimeToWait – 这是给连接池一个打印日志状态机会的低层次设置,还有重新

尝试获得连接,这些情况下往往需要很长时间(为了避免连接池没有配置时静默失

败)。默认值:20000 毫秒(也就是 20 秒)

 poolPingQuery – 发送到数据的侦测查询,用来验证连接是否正常工作,并且准备

接受请求。默认是NO PING QUERY SET”,这会引起许多数据库驱动连接由一

个错误信息而导致失败。

  poolPingEnabled – 这是开启或禁用侦测查询。如果开启,你必须用一个合法的

SQL 语句(最好是很快速的)设置 poolPingQuery 属性。默认值:false

 poolPingConnectionsNotUsedFor – 这是用来配置 poolPingQuery 多次时间被用一

次。这可以被设置匹配标准的数据库连接超时时间,来避免不必要的侦测。默认值:

0(也就是所有连接每一时刻都被侦测-但仅仅当 poolPingEnabled true 时适用)。

(3)JNDI – 这个数据源的实现是为了使用如 Spring 或应用服务器这类的容器,容器可以集

中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。这个数据源配置只需要两个属

性:

 initial_context – 这 个 属 性 用 来 从 初 始 上 下 文 中 寻 找 环 境 ( 也 就 是

initialContext.lookupinitial——context))。这是个可选属性,如果被忽略,那么

data_source 属性将会直接以 initialContext 为背景再次寻找。

 data_source – 这是引用数据源实例位置的上下文的路径。它会以由 initial_context

查询返回的环境为背景来查找,如果 initial_context 没有返回结果时,直接以初始

上下文为环境来查找。

和其他数据源配置相似,它也可以通过名为env.”的前缀直接向初始上下文发送属性。

比如:

 env.encoding=UTF8

在初始化之后,这就会以值UTF8”向初始上下文的构造方法传递名为“encoding

的属性。

10.mapper

这个就是SQl映射文件在这里加载。






本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis学习(二):解析MyBatis配置文件的写法和使用原理 的相关文章

随机推荐

  • linux 快速安装最新稳定版nginx(CentOS8.1 64位)

    目录 CentOS8 1 安装完成已具备 yum 指令操作 低版本缺少yum 指令自行安装 启动nginx遇到错误 nginx emerg bind to 0 0 0 0 7070 failed 13 Permission denied 配
  • 不用看网课就能学到python的文章(第五天)

    目录 类 对象 实例 类中的成员 面向对象 变量 不用看网课就能学到python的文章 第二天 Why does it work的博客 CSDN博客 不用看网课就能学到python的文章 第三天 Why does it work的博客 CS
  • 自己编写DLL文件——注册——VB工程引用——标准EXE调用(含例子)

    VB6 0的 工程 引用 中有很多控件供用户使用 但有时需要自己编写dll文件以实现某些功能 本文介绍如何自己编写一个简单的dll文件 然后在win7 64位下使用regsvr32注册 并在VB6 0中引用 最后在标准EXE中调用实现某些功
  • ES 版本,及重要特性

    参考 https www cnblogs com flyrock ES release 地址 https www elastic co cn downloads past releases elasticsearch ES版本 发布日期 版
  • 熊啸锋:精准营销及推广的四个步骤,倍增你的利润

    哈喽 我是熊啸锋老师 今天分享的主题是精准营销及推广的四个步骤 作为营销人 企业老板 项目负责人 市场开发人员等 你会经常面临 如何开发客户 如何获得大量的潜在客户名单 等很多的问题 还经常有人抱怨说 我们获取的潜在客户名单不精准 成交率非
  • Linux中清空文件的方法

    Linux中清空文件的方法 平时工作过程中 经常会遇到需要清空linux中某个日志文件的方法 下面总结一下几个常用的方法 以下待清空的文件名统一使用 test txt 表示 方法1 vi 中使用 d 1 输入 vi test txt 回车
  • word添加gif

    word添加gif动图最简单的方法 无需链接无需插件 X to Y的博客 CSDN博客 word插入动图 原文链接 https blog csdn net X To Y article details 124415532 文章目录 word
  • c++ Graphics 实现俄罗斯方块

    俄罗斯方块 一 游戏规则 1 方块种类 2 操作规则 玩家可以通过 按键 功能 a 向左一格 d 向右一格 s 顺时针旋转90度 w 逆时针旋转90度 3 积分规则 玩家根据消除的行列数量获取得分 数量 得分 1行 10分 2行 30分 3
  • Vue中的import中@的作用

    这是webpack的路径别名 相关代码定义在配置文件webpack base config里 resolve 自动补全的扩展名 extensions js vue json 默认路径代理 例如 import Vue from vue 会自动
  • UVA-10603 倒水问题 题解答案代码 算法竞赛入门经典第二版

    GitHub jzplp aoapc UVA Answer 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 使用广度优先搜索和优先队列 如果找到最小的点则退出 找不到就遍历所有的情况 include
  • 在vue中引入高德地图

    既然要用到高德地图首先要申请成为高德地图开发者 并申请使用高德地图的key这两点在这篇文章就不过多赘述 有需要的小伙伴可以查查资料 或者去高德地图api官网都有很详细的介绍 高德地图官网 简单提一下申请秘钥流程 web端 控制台 gt 应用
  • Android中的关于MDM中的几个方法举例

    首先介绍一下MDM是什么的缩写 MDM是什么 MDM 是 Mobile Device Management 的缩写 中文翻译过来就是移动设备管理 随着移动设备计算能力地增强 移动设备携带越来越方便 移动化办公已经成为一种潮流 一种趋势 企业
  • MATLAB_第二篇神经网络学习_BP神经网络

    非常感谢博主wishes61的分享 这篇博客只是为了记录下第一个神经网络的训练 BP神经网络代码实现 1 BP神经网络的简介和结构参数 1 1 BP神经网络的结构组成 1 2 神经元结构示意图 1 3 BP神经网络训练界面的参数解读 2 B
  • 【华为OD机试】战场索敌(C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 题目描述 有一个大小是N M的战场地图 被墙壁 分隔成大小不同的区域 上下左右四个方向相邻的空地 属于
  • 蓝牙协议规范--L2CAP

    L2CAP 分析 记住一点 软件和硬件分开理解 数据经由物理通道交互 上层通道由各层协议打通 L2CAP 全称为逻辑链路控制与适配协议 Logical Link Control and Adaptation Protocol 位于基带层之上
  • 聚簇索引与非聚簇索引(也叫二级索引)

    索引 索引 是 存储引擎 用于快速找到记录的一种 数据结构 MYSQL中索引在存储引擎层实现 而非服务器层 索引类型 聚簇索引 非聚簇索引 二级索引 主键索引 辅助索引 复合索引 前缀索引 唯一索引 压缩索引 全文索引 Hash索引 列索引
  • Redis学习笔记2:了解 Redis 入门

    1 Redis是什么 Remote Dictionary Server 远程字典服务 Redis是现在最受欢迎的NoSQL数据库之一 Redis是一个使用ANSI C编写的开源 包含多种数据结构 支持网络 基于内存 可选持久性的键值对存储数
  • 如何的pycharm远程连接服务器Ftp

    话不多说 我们直接开始上图操作 以上就是整体的配置过程
  • ElasticSearch入门

    文章目录 一 ElasticSearch简介 1 什么是ElasticSearch 2 ElasticSearch使用案例 3 ElasticSearch对 Solr 二 ElasticSearch相关概念 术语 1 概述 2 索引 ind
  • MyBatis学习(二):解析MyBatis配置文件的写法和使用原理

    MyBatis学习 一 一个简单的演示 上面就是一个很简单的MyBatis的应用实例 可以看看 对于如何如此做可能就不是很清楚了 首先每一个MyBatis的应用程序都是以一个SqlSessionFactory对象的实例为核心 SqlSess