MyBatis-全局配置文件

MyBatis 的配置文件包含了影响 MyBatis 行为甚深的 设置(settings)和属性(properties)信息。文档的 顶层结构如下:
MyBatis_配置文件

properties属性

mybatis可以使用properties来引入外部properties配置文件的内容;

  • resource:引入类路径下的资源
  • url:引入网络路径或者磁盘路径下的资源
     
<properties resource="dbconfig.properties"></properties>

注: dbconfig.properties 在项目的根目录下,如果是 maven 项目  dbconfig.properties 在resources 目录下。

如果属性在不只一个地方进行了配置,那么 MyBatis 将按 照下面的顺序来加载:

  1. 在 properties 元素体内指定的属性首先被读取。
  2. 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
  3. 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。

dbconfig.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123456

orcl.driver=oracle.jdbc.OracleDriver
orcl.url=jdbc:oracle:thin:@localhost:1521:orcl
orcl.username=scott
orcl.password=123456

读取 

<environments default="dev_mysql">
    <environment id="dev_mysql">
        <transactionManager type="JDBC"></transactionManager>
        <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>

    <environment id="dev_oracle">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${orcl.driver}"/>
            <property name="url" value="${orcl.url}"/>
            <property name="username" value="${orcl.username}"/>
            <property name="password" value="${orcl.password}"/>
        </dataSource>
    </environment>
</environments>

settings设置

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 

settings包含很多重要的设置项

  • setting:用来设置每一个设置项
  • name:设置项名
  • value:设置项取值
<settings>
	<setting name="cacheEnabled" value="true"/>
	<setting name="lazyLoadingEnabled" value="true"/>
	<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="mapUnderscoreToCamelCase" value="false"/>
	<setting name="localCacheScope" value="SESSION"/>
	<setting name="jdbcTypeForNull" value="OTHER"/>
	<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

 

如下是一个开启驼峰命令法: 

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

MyBatis_配置文件MyBatis_配置文件

如果不开启驼峰命令这个设置,select * from tbl_employee where id = #{id} 是无法映射 lastName 的,需要给查询出来的 last_name 取别名为lastName,select id,last_name lastName,email,gender from tbl_employee where id = #{id}

MyBatis_配置文件


typeAliases别名处理器

类型别名是为 Java 类型设置一个短的名字,可以方便我们 引用某个类。 

typeAliases:别名处理器:可以为我们的java类型起别名,别名不区分大小写

1、typeAlias:为某个java类型起别名

  • type:指定要起别名的类型全类名;默认别名就是类名小写;employee
  • alias:指定新的别名
<typeAliases>
     <typeAlias type="com.atguigu.Employee" alias="emp"/> 
</typeAliases>

 2、package:为某个包下的所有类批量起别名

类很多的情况下,可以批量设置别名这个包下的每一个类 创建一个默认的别名,就是简单类名小写。

  • name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名(类名小写),)
<typeAliases>
    <package name="com.atguigu.mybatis.bean"/>
</typeAliases>

3、批量起别名的情况下,使用@Alias注解为某个类型指定新的别名

第二种方法由于每个类的别名都是类名小写的,就存在同名的别名,这个时候用第三种方法就可以区别。

 benn对象

@Alias("emp")
public class Employee {
    .....省略......
}

注意:MyBatis已经为许多常见的 Java 类型内建 了相应的类型别名。它们都是大小写不敏感的,我们在起 别名的时候千万不要占用已有的别名。
MyBatis_配置文件

 


typeHandlers类型处理器

无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。 

MyBatis_配置文件

 


environments环境

MyBatis可以配置多种环境,比如开发、测试和生产环境需要有不同的配置,每种环境使用一个environment标签进行配置并指定唯一标识符,可以通过environments标签中的default属性指定 一个环境的标识符来快速的切换环境

environment-指定具体环境

  • id:指定当前环境的唯一标识
  • transactionManager、和dataSource都必须有 
<environments default="dev_mysql">
	<environment id="dev_mysql">
		<transactionManager type="JDBC"></transactionManager>
		<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>

	<environment id="dev_oracle">
		<transactionManager type="JDBC" />
		<dataSource type="POOLED">
			<property name="driver" value="${orcl.driver}" />
			<property name="url" value="${orcl.url}" />
			<property name="username" value="${orcl.username}" />
			<property name="password" value="${orcl.password}" />
		</dataSource>
	</environment>
</environments>

databaseIdProvider

MyBatis 可以根据不同的数据库厂商执行不同的语句

  • TypeDB_VENDOR    使用MyBatis提供的VendorDatabaseIdProvider解析数据库 厂商标识。也可以实现DatabaseIdProvider接口来自定义。
  • Property-name:数据库厂商标识
  • Property-value:为标识起一个别名,方便SQL语句使用 databaseId属性引用
     

DB_VENDOR

会通过 DatabaseMetaData#getDatabaseProductName() 返回的字符 串进行设置。由于通常情况下这个字符串都非常长而且相同产品的不 同版本会返回不同的值,所以最好通过设置属性别名来使其变短

@Test
public void test() throws ClassNotFoundException, SQLException {
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis","root","123456");
    DatabaseMetaData metaData = conn.getMetaData();
    String databaseProductName = metaData.getDatabaseProductName();
    System.out.println(databaseProductName);
}
//MySQL

 MyBatis匹配规则如下:

  1. 如果没有配置databaseIdProvider标签,那么databaseId=null
  2. 如果配置了databaseIdProvider标签,使用标签配置的name去匹配数据库信息,匹配上设置databaseId=配置指定的值,否则依旧为 null
  3. 如果databaseId不为null,他只会找到配置databaseId的sql语句
  4. MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。 
<!-- 5、databaseIdProvider:支持多数据库厂商的;
	 type="DB_VENDOR":VendorDatabaseIdProvider
		作用就是得到数据库厂商的标识(驱动getDatabaseProductName()),mybatis就能根据数据库厂商标识来执行不同的sql;
		MySQL,Oracle,SQL Server,xxxx
  -->
<databaseIdProvider type="DB_VENDOR">
	<!-- 为不同的数据库厂商起别名 -->
	<property name="MySQL" value="mysql"/>
	<property name="Oracle" value="oracle"/>
	<property name="SQL Server" value="sqlserver"/>
</databaseIdProvider>

 根据不同环境执行不同的 sql 语句:

<select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
	select * from tbl_employee where id = #{id}
</select>

<select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee"
	databaseId="mysql">
	select * from tbl_employee where id = #{id}
</select>

<select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee"
	databaseId="oracle">
	select EMPLOYEE_ID id,LAST_NAME	lastName,EMAIL email 
	from employees where EMPLOYEE_ID=#{id}
</select>

mapper

1、mapper逐个注册SQL映射文件

MyBatis_配置文件

2、使用批量注册

这种方式要求SQL映射文件名必须和接口名相同并且在同一目录下,第一种方式中通过class来配置的也是一样。

MyBatis_配置文件

 普通的java项目

MyBatis_配置文件

为了好看,我们可以在视觉上区分,下面的 conf 文件下的东西都会被打包到项目bin 目录。 

 MyBatis_配置文件

src(源码文件夹)和 conf 文件夹下所有的类容都会被合并到类路径下(bin 目录是类路径的开始)

 MyBatis_配置文件

 MyBatis_配置文件

MyBatis_配置文件

Maven Gradle 项目

MyBatis_配置文件

 


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>
    <!--
        1、mybatis可以使用properties来引入外部properties配置文件的内容;
        resource:引入类路径下的资源
        url:引入网络路径或者磁盘路径下的资源
      -->
    <properties resource="dbconfig.properties"></properties>


    <!-- 
        2、settings包含很多重要的设置项
        setting:用来设置每一个设置项
            name:设置项名
            value:设置项取值
     -->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>


    <!-- 3、typeAliases:别名处理器:可以为我们的java类型起别名 
            别名不区分大小写
    -->
    <typeAliases>
        <!-- 1、typeAlias:为某个java类型起别名
                type:指定要起别名的类型全类名;默认别名就是类名小写;employee
                alias:指定新的别名
         -->
        <!-- <typeAlias type="com.atguigu.Employee" alias="emp"/> -->

        <!-- 2、package:为某个包下的所有类批量起别名 
                name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名(类名小写),)
        -->
        <package name="com.atguigu.mybatis.bean"/>

        <!-- 3、批量起别名的情况下,使用@Alias注解为某个类型指定新的别名 -->
    </typeAliases>

    <!-- 
        4、environments:环境们,mybatis可以配置多种环境 ,default指定使用某种环境。可以达到快速切换环境。
            environment:配置一个具体的环境信息;必须有两个标签;id代表当前环境的唯一标识
                transactionManager:事务管理器;
                    type:事务管理器的类型;JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory)
                        自定义事务管理器:实现TransactionFactory接口.type指定为全类名
                
                dataSource:数据源;
                    type:数据源类型;UNPOOLED(UnpooledDataSourceFactory)
                                |POOLED(PooledDataSourceFactory)
                                |JNDI(JndiDataSourceFactory)
                    自定义数据源:实现DataSourceFactory接口,type是全类名
         -->


    <environments default="dev_mysql">
        <environment id="dev_mysql">
            <transactionManager type="JDBC"></transactionManager>
            <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>

        <environment id="dev_oracle">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${orcl.driver}"/>
                <property name="url" value="${orcl.url}"/>
                <property name="username" value="${orcl.username}"/>
                <property name="password" value="${orcl.password}"/>
            </dataSource>
        </environment>
    </environments>


    <!-- 5、databaseIdProvider:支持多数据库厂商的;
         type="DB_VENDOR":VendorDatabaseIdProvider
             作用就是得到数据库厂商的标识(驱动getDatabaseProductName()),mybatis就能根据数据库厂商标识来执行不同的sql;
             MySQL,Oracle,SQL Server,xxxx
      -->
    <databaseIdProvider type="DB_VENDOR">
        <!-- 为不同的数据库厂商起别名 -->
        <property name="MySQL" value="mysql"/>
        <property name="Oracle" value="oracle"/>
        <property name="SQL Server" value="sqlserver"/>
    </databaseIdProvider>


    <!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
    <!-- 6、mappers:将sql映射注册到全局配置中 -->
    <mappers>
        <!-- 
            mapper:注册一个sql映射 
                注册配置文件
                resource:引用类路径下的sql映射文件
                    mybatis/mapper/EmployeeMapper.xml
                url:引用网路路径或者磁盘路径下的sql映射文件
                    file:///var/mappers/AuthorMapper.xml
                    
                注册接口
                class:引用(注册)接口,
                    1、有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;
                    2、没有sql映射文件,所有的sql都是利用注解写在接口上;
                    推荐:
                        比较重要的,复杂的Dao接口我们来写sql映射文件
                        不重要,简单的Dao接口为了开发快速可以使用注解;
        -->
        <!-- <mapper resource="mybatis/mapper/EmployeeMapper.xml"/> -->
        <!--<mapper class="com.atguigu.mybatis.dao.EmployeeMapper"/>-->

        <!-- 批量注册: -->
        <package name="com.atguigu.mybatis.dao"/>
    </mappers>
</configuration>

 

相关文章:

  • 2021-10-04
  • 2021-11-15
  • 2021-09-06
  • 2021-08-12
  • 2021-12-15
  • 2021-05-28
猜你喜欢
  • 2021-10-11
  • 2022-12-23
  • 2021-12-02
  • 2022-12-23
  • 2022-02-23
  • 2022-01-02
  • 2022-12-23
相关资源
相似解决方案