MyBatis的核心配置文件 SqlMapConfig.xml(五)

本文深入探讨MyBatis核心配置文件SqlMapConfig.xml的详细内容,包括属性配置、环境设置、别名定义等关键部分,帮助理解MyBatis的工作原理。

这篇文章的开头,写给我的兄弟: 在程序的世界,只有实践才会得到自己想要的答案。 再高明的计算机,再高明的工具,都无法将空的代码执行成最美的秘密。

上一章简单介绍了MyBatis的几个重要类和生命周期(四),如果没有看过,请观看上一章

一.核心配置文件 SqlMapConfig.xml

有的叫 SqlMapConfig.xml, 也有的叫 mybatis-config.xml, 这里习惯用 SqlMapConfig.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/> <!--配置属性信息--->

  <setting/>      <!--设置-mybatis 运行参数-->

  <typeAliases /><!--类型命名 别名-->

  <typeHandlers/><!--类型处理器--->

  <objectFactory/><!--对象工厂-->

  <plugins/>          <!--插件--->

  <environments>  <!--配置环境-->

    <environment><!--环境变量-->

      <transactionManager/><!--事务管理器-->

        <dataSource /><!--数据源-->

    </environment>

  </environments>

  <databaseIdProvider/><!--数据库厂商标识-->

  <mappers/><!--映射器-->
</configuration>

这里,只讲一些常见的使用方式,如<properties>属性,<setting> <typeAliases> <environments> <mappers> 其余的暂时不讲。

二. properties 属性

可以引用配置文件,或者提前设置属性,来进行引用属性。 常见的就是关于数据库的配置。

以前的写法:

<!-- 开发环境  development -->
	<environments default="development">
		<environment id="development">
			<!-- 事务管理 -->
			<transactionManager type="JDBC"></transactionManager>
			<!-- 数据源 ,为pooled 连接池 -->
			<dataSource type="pooled">
				<!-- 直接硬编码在dataSource 资源里面 -->
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8"/>
				<property name="username" value="root"/>
				<property name="password" value="abc123"/>
			</dataSource>	
		</environment>
	</environments>

二.一 子元素设置

<!-- 子元素设置 -->
	<properties>
		<!-- 先设置一些属性,为了避免username和password重复,前面用jdbc. 前缀 -->
		<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
		<property name="jdbc.url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8"/>
		<property name="jdbc.username" value="root"/>
		<property name="jdbc.password" value="abc123"/>
	</properties>

然后在 datasource 数据库资源中配置:

<!-- 数据源 ,为pooled 连接池 -->
	<dataSource type="pooled">
				<!-- 直接硬编码在dataSource 资源里面 -->
				<property name="driver" value="${jdbc.driver}"/>
				<property name="url" value="${jdbc.url}"/>
				<property name="username" value="${jdbc.username}"/>
				<property name="password" value="${jdbc.password}"/>
</dataSource>	

调用测试方法 findAllTest 可以正常的查询。

二.二 配置文件

在src 源文件下创建jdbc.properties 配置文件,里面设置属性,进行相应的引用。
在这里插入图片描述

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8
jdbc.username=root
jdbc.password=abc123

SqlMapConfig.xml 中引入配置文件

	<!--配置文件引入  url为网络资源, 只能引入一个文件-->
	<properties resource="jdbc.properties"></properties>

相应的数据源配置为:

<!-- 数据源 ,为pooled 连接池 -->
			<dataSource type="pooled">
				<!-- 直接硬编码在dataSource 资源里面 -->
				<property name="driver" value="${jdbc.driver}"/>
				<property name="url" value="${jdbc.url}"/>
				<property name="username" value="${jdbc.username}"/>
				<property name="password" value="${jdbc.password}"/>
			</dataSource>

二.三 程序参数传递

如数据库开发时, 数据库的用户名和密码,生产数据库的用户名和密码应该对开发者是保密的,运维人员需要对其进行相应的加密,所以配置文件中的信息通常是加密后的信息。
代码形式为:

/**
	 * 单例模式 获取实例
	 * @author 两个蝴蝶飞
	 * @return
	 */
	public static SqlSessionFactory getInstance(){
		synchronized(SqlSessionFactoryUtils.class){
			if(sqlSessionFactory==null){
				InputStream input=null;
				// Mybatis 核心配置文件名
				String resource_name="SqlMapConfig.xml";
				
				//关于属性文件
				InputStream proStream=null;
				Reader propReader=null;
				Properties properties=null;
				try {
					input=Resources.getResourceAsStream(resource_name);
					proStream=Resources.getResourceAsStream("jdbc.properties");
					propReader=new InputStreamReader(proStream);
					properties=new Properties();
					properties.load(propReader);
					//重新编码用户名和密码 ,开发者定义好的的decode encode() 的加密和解密规则。
					properties.setProperty("username",decode(properties.getProperty("jdbc.username")));
					properties.setProperty("password",decode(properties.getProperty("jdbc.password")));
					sqlSessionFactory=new SqlSessionFactoryBuilder().build(input,properties);
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return sqlSessionFactory;
	}

二.四 优先级

程序参数传递的优先级最高, 配置文件resource/url 的次之,properties 属性中指定的属性优先级最低。
建议:

  1. 最好不要混用,只用一种方式即可。
  2. 最好选用 属性文件的方式进行配置。

三. setting 配置

setting 配置属性,会改变mybatis的运行时的行为,即使不配置setting,程序也会正常的运行。
setting 配置的各项参数有:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

上面的这些配置不需要全部都配置,只需要配置常用的一些属性即可。
常用的开发中,需要配置的属性:

<settings>
		<!-- 设置配置文件 -->
		<!-- 开启二级缓存 -->
		<setting name="cacheEnabled" value="true"/>
		<!-- 控制懒加载的 -->
		<setting name="lazyLoadingEnabled" value="true"/>
		<setting name="aggressiveLazyLoading" value="false"/>
		<setting name="multipleResultSetsEnabled" value="true"/>
		<setting name="useColumnLabel" value="true"/>
		<setting name="useGeneratedKeys" value="false"/>
		<setting name="autoMappingBehavior" value="PARTIAL"/>
		<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
		<setting name="defaultExecutorType" value="SIMPLE"/>
		<setting name="defaultStatementTimeout" value="25"/>
		<setting name="defaultFetchSize" value="100"/>
		<setting name="safeRowBoundsEnabled" value="false"/>
		<setting name="localCacheScope" value="SESSION"/>
		<setting name="jdbcTypeForNull" value="OTHER"/>
		<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
		<!-- 设置日志为 log4j -->
		<setting name="logImpl" value="LOG4J"/>
	</settings>

四.别名 typealiases

实体类的全限定名称过长,需要使用一个短的名称来代替它,可以在Mybatis整个上下文生命周期中使用。 可以分为 系统定义别名和自定义别名,其中 别名是不区分大小写的, 别名User 与别名user 是同样的意思。 一个typealiases 的实体是在解析配置文件的时候生成的,长期保存在Configuration 对象之中,当我们使用它时,再把它拿出来,而不是每一次使用时,都重新生成。

四.一 MyBatis 系统定义别名

在这里插入图片描述在这里插入图片描述

支持数组的,只要加个 [] 就可以,如 byte[] 为_byte[] 。

系统定义的别名,在 org.apache.ibatis.type.TypeAliasRegistry 类中进行定义。

public TypeAliasRegistry() {
    registerAlias("string", String.class);
    registerAlias("byte", Byte.class);
    registerAlias("long", Long.class);
    registerAlias("short", Short.class);
    registerAlias("int", Integer.class);
    registerAlias("integer", Integer.class);
    registerAlias("double", Double.class);
    registerAlias("float", Float.class);
    registerAlias("boolean", Boolean.class);
    
    registerAlias("byte[]", Byte[].class);
    registerAlias("long[]", Long[].class);
    registerAlias("short[]", Short[].class);
    registerAlias("int[]", Integer[].class);
    registerAlias("integer[]", Integer[].class);
    registerAlias("double[]", Double[].class);
    registerAlias("float[]", Float[].class);
    registerAlias("boolean[]", Boolean[].class);
    
    registerAlias("_byte", Byte.TYPE);
    registerAlias("_long", Long.TYPE);
    registerAlias("_short", Short.TYPE);
    registerAlias("_int", Integer.TYPE);
    registerAlias("_integer", Integer.TYPE);
    registerAlias("_double", Double.TYPE);
    registerAlias("_float", Float.TYPE);
    registerAlias("_boolean", Boolean.TYPE);
    
    registerAlias("_byte[]", byte[].class);
    registerAlias("_long[]", long[].class);
    registerAlias("_short[]", short[].class);
    registerAlias("_int[]", int[].class);
    registerAlias("_integer[]", int[].class);
    registerAlias("_double[]", double[].class);
    registerAlias("_float[]", float[].class);
    registerAlias("_boolean[]", boolean[].class);
    
    registerAlias("date", Date.class);
    registerAlias("decimal", BigDecimal.class);
    registerAlias("bigdecimal", BigDecimal.class);
    registerAlias("biginteger", BigInteger.class);
    registerAlias("object", Object.class);
    
    registerAlias("date[]", Date[].class);
    registerAlias("decimal[]", BigDecimal[].class);
    registerAlias("bigdecimal[]", BigDecimal[].class);
    registerAlias("biginteger[]", BigInteger[].class);
    registerAlias("object[]", Object[].class);
    
    registerAlias("map", Map.class);
    registerAlias("hashmap", HashMap.class);
    registerAlias("list", List.class);
    registerAlias("arraylist", ArrayList.class);
    registerAlias("collection", Collection.class);
    registerAlias("iterator", Iterator.class);
    
    registerAlias("ResultSet", ResultSet.class);
  }

上面是Mybatis 系统已经定义好的,不需要我们重复定义,直接使用即可。
但常常使用开发都自定义的别名。

四.二 自定义别名

如 我们前面所使用的 com.yjl.pojo.User 类,当多次使用时,如 insert ,update 和select 时,不必要重复性定义,只定义别名即可 user .

<select id="getById"  parameterType="int" resultType="user">
		select * from user where id=#{id}
	</select>

只需要写成 resultType=“user” 即可,不需要 resultType=“com.yjl.pojo.User”

四.三 XML 形式定义别名

  1. 可以单个类定义
<!-- 配置别名 -->
	<typeAliases>
		<!--type指类的全限定名称, alias 为 别名-->
		<typeAlias type="com.yjl.pojo.User" alias="user"/>
	</typeAliases>
  1. 如果类过多的话,那么可以用包。
<!-- 配置别名 -->
	<typeAliases>
		<!-- 定义包的形式 ,可以多个-->
		<package name="com.yjl.pojo"/>
		<package name="com.yjl.pojo2"/>
	</typeAliases>

四.四 注解定义 @Alias

@Alias(value ="user")
public class User {
	
}

这样就可以直接使用 user 别名了。

五. 环境设置 environments

<!-- 开发环境  development 环境为开发环境 -->
	<environments default="development">
		<environment id="development">
			<!-- 事务管理 -->
			<transactionManager type="JDBC"></transactionManager>
			<!-- 数据源 ,为pooled 连接池 -->
			<dataSource type="pooled">
				<!-- 定义数据库连接属性-->
				<property name="driver" value="${jdbc.driver}"/>
				<property name="url" value="${jdbc.url}"/>
				<property name="username" value="${jdbc.username}"/>
				<property name="password" value="${jdbc.password}"/>
			</dataSource>	
		</environment>
	</environments>

环境 default 默认为development 开发环境。 其中, id 为默认的开发环境。

transactionManager 事务管理的类型有三种:

  1. jdbc 使用jdbc的形式管理事务,在独立编码,不引用其他数据库框架时使用
  2. managed 采用容器方式管理事务,在JNDI 中常常使用。
  3. 自定义 使用者自己定义,常常用于特殊的环境中。

datasource 的类型有四种:

  1. pooled 连接池数据库
  2. unpooled 非连接池数据库
  3. JNDI JNDI 数据源
  4. 自定义数据源

六 引入映射文件 mapper

六.一 文件路径方式

	<mappers>
		<!-- 引入文件资源,可依次写多个-->
		<mapper resource="com/yjl/mapper/UserMapper.xml"/>
	</mappers>

采用的是 文件路径 / 的方式。

六.二 包名引入 (多个时)

<mappers>
		<!-- 包名引入,用. -->
		<package name="com.yjl.mapper"/>
	</mappers>

六.三 类注册引入

<mappers>
		<!--类注册引入,用class属性 -->
		<mapper class="com.yjl.mapper.UserMapper"/>
	</mappers>

建议使用 package, 可引入包。

谢谢!!!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两个蝴蝶飞

你的鼓励,是老蝴蝶更努力写作的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值