mapengpeng1999@163.com Mybatis全局配置文件mybatis-config.xml

本文详细介绍了MyBatis的全局配置文件设置,包括数据库连接、环境配置、SQL映射、类型处理器、对象工厂和环境切换策略。重点讲解了如何配置数据库连接池、事务管理、别名处理器和类型转换,以优化开发和数据库交互。
摘要由CSDN通过智能技术生成

全局配置文件

安装Oracle数据库

1.修改安装文件的兼容性,并退出所有的安全管家之类的软件

在这里插入图片描述

2.安装,双击即可安装,安装最好在无网络的情况下安装,勾选上空白框可执行,将其保存于一个空白目录下。

3.记住安装的全局数据库名称(默认的orcl)(service名称)和口令(ma123),并且可以更改安装位置(D:/MyAPP/Oracle

4.等待安装成功,安装过程中一切的错误提示都忽略,强制继续执行

Oracle服务器安装成功之后,会有五个服务存在:(任务管理器,服务)

在这里插入图片描述

Oracle服务一般都设置为首模式,只有需要的时候手动启动,一般情况下只需要启动红色框中的两个服务即可。

Oracle的配置文件:

在这里插入图片描述

Listener.ora:监听的配置文件,如果监听文件配置不正确,那么对应的监听服务启动会失败

Tnsnames.ora:连接配置文件,会被PLSQL自动的读取

安装PLSQLDeveloper 开发工具:(装这个PLSQL工具目录要和装中文插件目录相同)

修改兼容性

在这里插入图片描述

双击安装,注意一定安装在无空格,无中文的目录中,尽可能找个空文件目录来装,计算机名字不能为中文。

安装完成之后,桌面生成快捷方式,需要修改兼容性。

在这里插入图片描述

安装中文插件,直接双击chinese.exe,不需要修改兼容性

安装路径定位到PLSQL安装目录(装这个PLSQL工具目录要和装中文插件目录相同)

在这里插入图片描述

引入dtd文件(只有Eclipse开发工具STS中才要设置,便于快速提示)

在进行开发的时候,发现Eclipse中没有全局配置文件和SQL映射文件的联想,
引入DTD约束之后,能够在Eclipse中更加快速的开发全局配置文件和SQL映射文件。
需要引入的DTD约束,这个文件在联网的状态下可以自动下载,没有联网也没有关系,MyBatis的jar包中存在这两个文件,可以直接解压这个jar包,解压mybatis-3.4.1.jar,在这个目录org.apache.ibatis.bulider.xml,
找到mybatis-3-mapper.dtd和mybatis-3-config.dtd。

1.添加全局配置文件DTD约束:
打开Eclipse的配置,找到DTD的配置–>XML Catalog-(在window,preferences中搜索XML Catalog)

在这里插入图片描述

点击Add,出现如下界面

在这里插入图片描述

进行如图所示配置,完成全局配置文件的DTD约束的添加

2.映射文件的DTD的添加:和上面的步骤一致,有两个区别:

- 对应的URI的KEY为:http://mybatis.org/dtd/mybatis-3-mapper.dtd

- Localtion选择的文件不同:mybatis-3-mapper.dtd

注意:引入DTD之后要保存,需要关闭文件,再次打开生效。

引入外部的属性文件properties

像在Spring中,数据库连接的相关的配置都是在外部的properties文件中进行的,在MyBatis依然使用这种形式。
在类路径下添加db.properties:(普通的file文件命名为db.properties,可将db.properties放到conf目录下(conf目录就是Source Folder文件,类路径下的配置文件目录))

mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://127.0.0.1:3306/ssm?characterEncoding=utf-8&useUnicode=true
mysql.user=root
mysql.password=3306
mysql.maxSize=10
mysql.initSize=5

oracle.driver=jdbc.oracle.dirver.OracleDriver
oracle.url=jdbc:oracle:thin:@AUTOBVT-CKDOVBK:1521:orcl
oracle.user=scott
oracle.password=3306
oracle.maxSize = 10
oracle.initSize = 5

然后在MyBatis的全局配置文件中,引入外部的属性文件:

<?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 : 是引入外部属性文件的标签
			resource:表示从类路径中加载对应的属性文件
			url:表示从网络中或者磁盘中读取对应的属性文件
	-->
	<properties resource="db.properties" ></properties>
	
	<settings>
		<!-- 设置自动驼峰命名 -->
		<setting name="mapUnderscoreToCamelCase" value="true"></setting>
	</settings>
	
	<environments default="mysql">
		<environment id="mysql">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${mysql.driver}" />
				<property name="url" value="${mysql.url}" />
				<property name="username" value="${mysql.user}" />
				<property name="password" value="${mysql.password}" />
			</dataSource>
		</environment>
	</environments>
	<!-- 注册sql映射文件 -->
	<mappers>
		<mapper resource="com/wanbangee/dao/EmpDao.xml" />
	</mappers>
</configuration>

运行时行为的设置settings

在MyBatis的全局配置文件中,可以使用setting标签设置MyBatis运行时的行为,有很多可以设置的选项,
如编写HelloWorld程序的时候,我们的查询的数据列没有和实体类的JavaBean风格的属性名称对应,
所以查询的结果封装不上,后面的解决方案是设置了自动驼峰命名,就是将查询结果集的数据列映射到实体类属性映射不上的情况下,对查询结果集的数据列自动的进行驼峰命名后再进行映射。查询结果集能够正常的封装到实体类对象的属性上。
	<!-- 
		settings:Mybatis运行时行为设置,可以配置多个
			- setting :单个行为设置标签
				- name :设置项名称
				- value : 设置项的值
	 -->
	<settings>
		<!-- 设置自动驼峰命名 -->
		<setting name="mapUnderscoreToCamelCase" value="true"> </setting>
	</settings>
<?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>
<settings>
<!-- 开启延迟加载(懒加载)策略 -->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 设置自动驼峰命名 -->
<setting name="mapUnderscoreToCamelCase" value="true"></setting>
<!-- 开启二级缓存 : 虽然默认是开启的,但是确定的配置,不管默认,都需要配置 -->
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>

类型别名处理器typeAliases(开发用不到)

这个typeAliases就是类型别名处理器,可以给MyBatis中经常用到的类型起一个别名。比如说之前的sql映射文件中,
对于查询来说,都需要设置返回值类型,如下代码:
<select id="selectEmp" resultType="com.wanbangee.entities.Emp">
		select * from emp 
</select>
发现设置的resultType的名称太长,这个时候可以使用别名处理器,给对应的类型起一个别名:
<!-- 
		类型别名处理器typeAliases:可以给多个类型设置别名处理器  
			typeAlias  : 给一个类型设置一个别名
				type : 指定要起别名的类型的全类名
				alias : 指定的起的别名
		如果typeAlias 没有设置 alias属性,默认的别名就是类名,而且不区分大小写
		在项目开发中,有很多的实体类,那么一个一个的配置非常麻烦,有一种新的写法
			- package 标签:表示指定包中的所有的类都起别名
				- name :指定包名
			之后指定包中的所有类的别名就是类名,而且不区分大小写
			而且我们还可以给指定包中的类指定别名,在实体类的类声明中使用@Alias注解声明此类的别名
			@Alias("emp")
			public class Emp {
	-->
	<typeAliases>
		<!-- <typeAlias type="com.wanbangee.entities.Emp" alias="emp"/> -->
		<package name="com.wanbangee.entities"/>
	</typeAliases>
以上就是类型别名处理器的所有的配置,当然别名也有规则:
- 所有的别名不能相同,不能使用已经被定义过的别名
约定:
- 起的别名要有语义
- MyBatis已经帮我们定义好了很多常用类型的别名

在这里插入图片描述

以上即是定义好的别名,这些别名是不能再用的。当然我们在开发中,别名处理器一般不用
(除了MyBatis已经定义好的别名外),
因为使用全类名定义实际效果更好,在开发工具中使用全类名也更好的去查看这个类的源码。

类型处理器typeHandlers(开发用不到)

类型处理器作用于数据库的类型和Java的类型之间的相互转换,比如MYSQL数据库中varchar类型到Java的String类型,
比如ORacle数据库中的number类型到Java的Integer类型,等等。无论是MyBatis在预处理语句中设置的一个参数,
还是从结果集中取出一个值,都会使用类型处理器将获取的值以合适的方式转换成Java类型。

在这里插入图片描述

<!-- 
		类型处理器  typeHandlers
			typeHandler :配置单个的类型处理器
				handler : 类型处理器的全类名
					javaType : 表示Java类型
					jdbcType : 表示兼容的数据库类型
	-->	
	<!-- <typeHandlers>
		<typeHandler handler="org.apache.ibatis.type.StringTypeHandler" javaType="java.lang.String" jdbcType="varchar"/>
	</typeHandlers> -->
正常的开发中,可以不必配置类型转换器,因为MyBatis都已经定义好了,所以配不配效果一样。

objectFactory(对象工厂,了解)

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

运行环境environments

Environments表示配置多个环境,这里的环境指的是数据库环境,意味着MyBatis可以连接多个数据库。

<!-- environments:表示可以配置多个数据库环境,default 属性表示指定使用哪一种数据库环境,
- environment 表示配置单个数据库环境 ,必须存在id属性,表示的此环境的唯一标识,而且多个环境的id不能重复,
	- transactionManager :配置事务管理器,type表示设置事务管理器的类型,有两种
		- JDBC :这个配置直接使用了JDBC 的提交和回滚,它依赖从数据源获得的连接来管理事务作用域
		- MANAGED :这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。
				默认情况下它会关闭连接数据库连接,然而一些容器并不希望连接被关闭,因此需要将closeConnection属性设置为false来阻止默认的关闭行为
				<property name="closeConnection" value="false"/>
		- dataSource :配置数据源,type表示设置数据源类型,有三种:
					- POOLED : 使用连接池
					- UNPOOLED :不使用连接池
					- JNDI :表示在如EJB或者应用服务器环境中引用其他的数据源
-->
	<environments default="oracle">
		<environment id="mysql">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<property name="driver" value="${mysql.driver}" />
				<property name="url" value="${mysql.url}" />
				<property name="username" value="${mysql.user}" />
				<property name="password" value="${mysql.password}" />
			</dataSource>
		</environment>
		<environment id="oracle">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${oracle.driver}" />
				<property name="url" value="${oracle.url}" />
				<property name="username" value="${oracle.user}" />
				<property name="password" value="${oracle.password}" />
			</dataSource>
		</environment>
	</environments>
dataSource数据源是必须配置的。有三种内建的数据源类型。
type="[UNPOOLED|POOLED|JNDI]")
unpooled:这个数据源的实现只是每次被请求时打开和关闭连接。

pooled:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 
这是一种使得并发 Web 应用快速响应请求的流行处理方式。

jndi:这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用,
容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。

数据源也有很多第三方的实现,比如dbcp,c3p0,druid等等
现在在Oracle环境下,能够查询14笔数据,但不能映射为实体类的对象,因为数据表的字段名和实体类的属性名对应不上,
可以考虑给查询的数据列一个别名,使其对应上实体类的属性名,但是切换到Mysql又不成,
这个时候我们考虑在不同的数据库环境中执行不同的sql,这是最合理的,必须要配置databaseIdProvider(数据库厂商标识)。
紧挨着</environments>后面配置
<!-- 数据库厂商标识 : 实际上就是给不同的数据库起别名
			property : 给数据库厂商起别名
			name : 数据库厂商
			value : 别名
		databaseIdProvider:表示配置多数据源厂商支持,为不同的数据库厂商起一个别名
		sql语句中可以使用databaseid指定这条sql语句是在何种厂商的数据库环境下执行
		SQL映射文件中的databaseId="oracle"和全局配置文件中的value="oracle"对应上
-->
	<databaseIdProvider type="DB_VENDOR">
		<property name="MySQL" value="mysql"/>
		<property name="Oracle" value="oracle"/>
		<property name="SQL Server" value="sqlserver"/>
	</databaseIdProvider>
而后我们就可以在sql语句中指定不同的数据库执行不同的sql语句:
<!-- public List<Emp> selectEmp(); -->
	<select id="selectEmp" resultType="com.wanbangee.entities.Emp" databaseId="oracle">
		select emp_id empId,emp_name empName from emp
	</select>
	
	<select id="selectEmp" resultType="com.wanbangee.entities.Emp" databaseId="mysql">
		select * from emp
	</select>

映射注册mappers

使用mappers标签可以注册sql映射文件,将sql映射文件注册到全局配置文件中,
一个SQL映射文件对应到一个Dao[Mapper]接口
<!-- 注册sql映射文件
		mappers : 可以注册多个sql映射文件
			mapper : 注册单个sql映射文件
					1.- resource : 表示配置类路径中的sql映射文件
					<mapper resource="com/wanbangee/dao/EmpDao.xml" />
					2.- url:表示配置网络中或者硬盘中的sql映射文件
					<mapper url="file:///var/wanbangee/dao/EmpDao.xml" />
					3.- class:表示引用接口注册,要求sql映射文件和接口要同名同包
					-<mapper class="com.wanbangee.dao.EmpDao" />
					4.- 也可以不使用sql映射文件,而是在接口的方法上注解sql,这种方式不提倡,
					因为MyBatis本来就是想将sql和Java代码相分离
							@Select("select * from emp")
							public List<Emp> selectEmp();
					5.- package : 扫描此包及子包的Dao接口,一个Dao接口就存在一个sql映射文件。
            		  - 要求,sql映射文件和接口要同名同包
            		  <package name="com.wanbangee.dao"/>
-->
	<mappers>
		<package name="com.wanbangee.dao"/>
		 <!-- <mapper class="com.wanbangee.dao.EmpDao"/>  -->
	</mappers>

总结

对于全局的配置文件,在Mybatis中是一个关键的配置,当然以后如果Mybatis和Spring的整合的话,
可以不需要Mybatis的配置文件,但是依然建议保留。

MyBatis的全局配置文件必须按照顺序配置:
properties,引入外部属性文件,如db.properties
settings,设置运行时环境,如设置自动驼峰
typeAliases,别名处理器,开发用不到
typeHandlers ,类型处理器,开发用不到
objectFactory(对象工厂,了解)
plugins(插件)
environments ,配置数据库环境
databaseIdProvider ,数据库厂商标识,不同的数据库环境中执行不同的sql
mappers,映射注册放最后,<package name="com.wanbangee.dao"/>

作用域(Scope)和生命周期

Mybatis的执行过程:
在这里插入图片描述
作用域理解

1.SqlSessionFactoryBuilder 的作用在于创建 SqlSessionFactory,
创建成功后,SqlSessionFactoryBuilder 就失去了作用,
所以它只能存在于创建 SqlSessionFactory 的方法中,
而不要让其长期存在。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。
2.SqlSessionFactory 可以被认为是一个数据库连接池,它的作用是创建 SqlSession 接口对象。
因为 MyBatis 的本质就是 Java 对数据库的操作,所以 SqlSessionFactory 的生命周期存在于整个 MyBatis 的应用之中,
所以一旦创建了 SqlSessionFactory,就要长期保存它,直至不再使用 MyBatis 应用,
所以可以认为 SqlSessionFactory 的生命周期就等同于 MyBatis 的应用周期。
3.由于 SqlSessionFactory 是一个对数据库的连接池,所以它占据着数据库的连接资源。
如果创建多个 SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,
也会导致数据库连接资源被消耗光,出现系统宕机等情况,所以尽量避免发生这样的情况。
4.因此在一般的应用中我们往往希望 SqlSessionFactory 作为一个单例,让它在应用中被共享。
所以说 SqlSessionFactory 的最佳作用域是应用作用域。
5.如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个数据库连接(Connection 对象),
你可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 等方法,提交或者回滚事务。
所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,
否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try...catch...finally... 语句来保证其正确关闭。
6.所以 SqlSession 的最佳的作用域是请求或方法作用域。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值