MyBatis全局配置文件

xml配置文件标签的使用

properties (引入外部配置文件)

<?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"/>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <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>
    <!--将我们写好的sql映射文件一定要注册到全局配置文件中-->
    <mappers>
        <mapper resource="EmployeeMapper.xml"/>
    </mappers>
</configuration>

dbconfig.properties文件示例

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

settings (设置项)

SettingDescription(描述)Valid Values(取值范围)Default (默认值)
cacheEnabled改配置影响的所有映射器中配置的缓存的全局开关true / falsetrue
lazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。在特定的关联关系中可通过设置fetchType属性来覆盖该项开关的状态。true/falsefalse
useColumnLabel使用列标签代替列名。不同的驱动在这方面会有不同的表现,具体可以参考相关的驱动文档或通过测试这两种不同的模式来观察所用驱动的结果true / falsetrue
defaultStatementTimeout设置超时时间,它决定驱动等待数据库响应的秒数。Any positive integerNot Set (null)
mapUnderscoreToCamelCase是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名A_COLUMN到经典java属性名为aColumn的类似映射true/falseFalse

更多见mybatis官方文档中文版
使用示例:

<!--    
settings包含很多重要的设置项,所有的设置项都放在settings里面 
    setting:用来设置每一个设置项
        name:设置项的名字
        value:设置项的取值
-->
<settings>
    <!-- mapUnderscoreToCamelCase: 
    是否开启自动驼峰命名规则(camel case)映射,
    即从经典数据库列名`A_COLUMN`到经典java属性名为`aColumn`的类似映射,
    可用值为true和false,
    默认为False -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

typeAliases (别名处理器)

<!-- 
    typeAliases,别名处理器:可以为我们的java类型起别名
        别名不区分大小写 
-->
<typeAliases>
    <!-- typeAlias:为某个java类型起别名
    type:指定要起别名的类型的全类名;默认别名就是类名小写:employee
    alias:指定新的别名
    --> 
    <!--<typeAlias type="com.szm.mybatis.bean.Employee" alias="emp"/>-->
    <!-- package:为某个包下的类批量起别名
    name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名(类名小写),)
    -->    
    <package name="com.szm.mybatis.bean"/>
</typeAliases>

批量起别名会在后代包中有相同类名的类时,产生别名冲突,mybatis会在运行时报错
解决方案:可以在类前使用注解来起别名@Alias("别名")
示例:

package com.szm.mybatis.bean;

import org.apache.ibatis.type.Alias;

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

注意:@Alias("别名")注解只能在使用批量起别名也就是使用<package/>标签时使用,否则会报错


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

别名映射的类型别名映射的类型别名映射的类型
_bytebytestringStringdateDate
_longlongbyteBytedecimalBigDecimal
_shortshortlongLongbigdecimalBigDecimal
_intintshortShortobjectObject
_integerintintIntegermapMap
_doubledoubleintegerIntegerhashmapHashMap
_floatfloatdoubleDoublelistList
_booleanbooleanfloatFloatarraylistArrayList
booleanBooleancollectionCollection
iteratorIterator

typeHandlers (类型处理器)

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

类型处理器Java 类型JDBC 类型
BooleanTypeHandlerjava.lang.Boolean, boolean数据库兼容的 BOOLEAN
ByteTypeHandlerjava.lang.Byte, byte数据库兼容的 NUMERIC 或 BYTE
ShortTypeHandlerjava.lang.Short, short数据库兼容的 NUMERIC 或 SHORT INTEGER
IntegerTypeHandlerjava.lang.Integer, int数据库兼容的 NUMERIC 或 INTEGER
LongTypeHandlerjava.lang.Long, long数据库兼容的 NUMERIC 或 LONG INTEGER
FloatTypeHandlerjava.lang.Float, float数据库兼容的 NUMERIC 或 FLOAT
DoubleTypeHandlerjava.lang.Double, double数据库兼容的 NUMERIC 或 DOUBLE
BigDecimalTypeHandlerjava.math.BigDecimal数据库兼容的 NUMERIC 或 DECIMAL
StringTypeHandlerjava.lang.StringCHAR, VARCHAR

日期类型的处理

日期和时间的处理,JDK1.8以前一直是个头疼的问题。我们通常使用JSR310规范领导者Stephen Colebourne创建的Joda-Time来操作。1.8已经实现全部的JSR310规范了。
日期时间处理上,我们可以使用MyBatis基于 JSR310(Date and Time API)编写的各种日期 时间类型处理器。
MyBatis3.4以前的版本需要我们手动注册这些处 理器,以后的版本都是自动注册的。

objectFactory (对象工厂)

mybatis查出数据要封装对象的时候,要创建对象实例,就会利用对象工厂来创建
作为了解,一般情况下不会更改objectFactory的配置,使用默认即可

plugins (插件)

MyBatis允许在映射语句执行中的某些点拦截调用。
默认情况下,MyBatis允许插件拦截以下方法的调用:

  • 执行程序
  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • 参数处理程序
  • ParameterHandler (getParameterObject, setParameters)
  • 结果集处理程序
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • 声明处理程序
  • StatementHandler (prepare, parameterize, batch, update, query)

这些类中方法的细节可以通过查看每个方法的签名来发现,或者直接查看 MyBatis 发行包中的源代码。
如果你想做的不仅仅是监控方法的调用,那么你最好相当了解要重写的方法的行为。
因为在试图修改或重写已有方法的行为时,很可能会破坏 MyBatis 的核心模块。
这些都是更底层的类和方法,所以使用插件的时候要特别当心。
通过 MyBatis 提供的强大机制,使用插件是非常简单的,只需实现 Interceptor 接口,并指定想要拦截的方法签名即可。

environments (环境配置)

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

databaseIdProvider (数据库厂商标识)

<!--    
    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映射文件中使用databaseId属性来指定数据库厂商

<select id="getEmpById" resultType="emp" databaseId="mysql">
    select * from tbl_employee where id = #{id}
</select>
<select id="getEmpById" resultType="emp" databaseId="oracle">
    select * from tbl_employee where id = #{id}
</select>

mappers(sql映射注册)

<!--    
mappers:将sql映射注册到全局配置中
-->
<mappers>
    <!-- 
    mapper:注册一个sql映射
        注册配置文件
            resource:引用类路径下的sql映射文件
            mybatis/mapper/EmployeeMapper.xml 
            url:引用网络路径或者磁盘路径下的sql映射文件
            file:///var/mappers/EmployeeMapper.xml
        注册接口 
            class:引用(注册)接口 
            1、有sql映射文件,映射文件名必须和接口同名,并且放在同一目录下;
            2、没有sql映射文件,所有的sql都是利用注解写在接口上;@Select等
        推荐:比较重要的,复杂的Dao接口使用sql映射文件
                不重要的,简单的Dao接口使用注解
        注意:同一个Dao接口不能同时使用注解和映射文件的方式,
                但是同一个项目中不同的Dao接口可以同时使用注解和映射文件的方式
    -->
    <!--<mapper url="file:///var/mappers/EmployeeMapper.xml"/>-->
    <mapper resource="mybatis/mapper/EmployeeMapper.xml"/>
    <mapper class="com.szm.mybatis.dao.EmployeeMapperAnnotation"/>
    <!--    
    package:批量注册
        name:指定包名(为当前包以及下面所有的后代包的每一个接口都进行注册)
            1、有sql映射文件,映射文件名必须和接口同名,并且放在同一目录下;
            2、没有sql映射文件,所有的sql都是利用注解写在接口上;
    -->    
    <!--<package name="com.szm.mybatis.dao"/>-->
</mappers>

所有的sql都是利用注解写在接口上代码实例:

public interface EmployeeMapperAnnotation {
    @Select("select * from tbl_employee where id = #{id}")
    Employee getEmpById(Integer id);
}

以上标签在xml文件中有顺序要求

  1. properties,
  2. settings,
  3. typeAliases,
  4. typeHandlers,
  5. objectFactory,
  6. objectWrapperFactory,
  7. reflectorFactory,
  8. plugins,
  9. environments,
  10. databaseIdProvider,
  11. mappers

可以缺少某个标签,但是顺序不能打乱

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值