Mybatis3-配置文件详解

139 阅读1分钟

Mybatis配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--就是DOCTYPE后面对应的根节点-->
<configuration>
<!--    引入外部资源文件  通过${}引用 -->
    <properties resource="mysql.config.properties">

    </properties>



<!--    -->
    <settings>
<!-- 是否允许在SQL使用别名   默认是true       -->
        <setting name="useColumnLabel" value="true"/>
<!--默认是FALSE  允许JDBC支持自动生成主键  一般Oracle中使用-->
        <setting name="useGeneratedKeys" value="false"/>
<!-- 指定发现自动映射目标未知列的行为  当字段名和属性名不匹配时发生的
NONE 不做任何反映
WARNING 输出警告日志
FAILING 映射失败
-->
        <setting name="autoMappingUnknownColumnBehavior" value="NONE"/>
<!--defaultExecutorType
配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(PreparedStatement); BATCH 执行器不仅重用语句还会执行批量更新。
-->
        <setting name="defaultExecutorType" value="SIMPLE"/>
<!--设置超时时间-->
<!--        <setting name="defaultStatementTimeout" value=""/>-->

<!--     是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。      -->
        <setting name="mapUnderscoreToCamelCase" value="false"/>
<!--        当没有为参数指定特定的 JDBC 类型时,空值的默认 JDBC 类型。 某些数据库驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。-->
<!--       当向数据库中插入数据某个值为null时   映射到数据库的类型
            OTHER mysql 是可以识别出other 类型
            NULL  如果是 Oracle一定设置为nullORACLE识别不出 OTHER类型
            VARCHAR  当属性值为空时   为数据库设置一个空字符串

-->
        <setting name="jdbcTypeForNull" value="OTHER"/>

<!--   指定 MyBatis 所用日志的具体实现,未指定时将自动查找  。   SLF4J | LOG4J(3.5.9 起废弃) | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING    -->
<!--        <setting name="logImpl" value=""/>-->
    </settings>
    
<!--类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。例如:-->
    <typeAliases>
<!--        会将类的名字作为别名(忽略大小写)-->
<!--        类单独设置别名  可以直接在类里面@Alias-->
<!--        -->
        <package name="com.kdy.pojo" />
    </typeAliases>

<!--    插件  可以理解成MyBatis的拦截器  可以拦截4大对象 Executor ParameterHandler ResultSetHandler StatementHandler 可以拦截SQL  给SQL添加一些公共的功能 -->
<!--    <plugins>-->
<!--        <plugin interceptor="org.mybatis.example.ExamplePlugin">-->
<!--            <property name="someProperty" value="100"/>-->
<!--        </plugin>-->
<!--    </plugins>-->


<!--    数据库环境   复数  可以多个环境  可以通过default快速切换 -->
    <environments default="development">
<!--        配置数据库环境  id指定当前数据库环境唯一标识  会被父节点default所设置-->
        <environment id="development">
<!--            事务管理器 -->
<!--            JDBC – 这个配置直接使用了 JDBC 的提交和回滚功能,它依赖从数据源获得的连接来管理事务作用域。-->
<!--            MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)-->
            <transactionManager type="JDBC"/>
<!--            数据源
UNPOOLED– 这个数据源的实现会每次请求时打开和关闭连接。虽然有点慢,但对那些数据库连接可用性要求不高的简单应用程序来说,是一个很好的选择。 性能表现则依赖于使用的数据库,对某些数据库来说,使用连接池并不重要,这个配置就很适合这种情形。
POOLED– Mybatis自带的连接池 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这种处理方式很流行,能使并发 Web 应用快速响应请求。
JNDI – 可以在Tomcat中使用 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。这种数据源配置只需要两个属性:

对应实现类可以在 Configuration.java中查看



-->
            <dataSource type="POOLED">
                                <property name="driver" value="${driver}"/>
<!--                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>-->
                                <property name="url" value="${url}"/>
<!--                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>-->


                                <property name="username" value="${username}"/>

<!--                <property name="username" value="root"/>-->
                                <property name="password" value="${password}"/>
<!--                <property name="password" value="root"/>-->

            </dataSource>
        </environment>

        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">

                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_test"/>

                <property name="username" value="root"/>
                <property name="password" value="root"/>

            </dataSource>
        </environment>
    </environments>
    <!--type="DB_VENDOR" 利用数据库的厂商名称来区分  用于跨数据库平台-->
<!--    步骤1、为需要跨数据库设置不同的厂商名称
        2、编写不同的SQL  databaseID 必须设置厂商的value
-->

    <databaseIdProvider type="DB_VENDOR">
        <!--        <property name="SQL Server" value="sqlserver"/>-->
        <!--        <property name="DB2" value="db2"/>-->
        <property name="Oracle" value="oracle" />
        <property name="MySQL" value="mysql"/>
    </databaseIdProvider>
<!--    <select id="selectEmp" resultType="Emp" databaseId="mysql">   在mapper.xml中 设置databaseId="mysql"-->
<!--    设置映射器 有4种映射方式
mapper的三种
1、resource 设置MapperXML 适用根据statementid进行操作
2、class 设置Mapper接口  这种方式适用接口绑定方式
3、url  使用磁盘的 绝对路径几乎不用

package
4、name 根据包名设置接口   将包内的映射器接口全部注册为映射器


-->
    <mappers>
        <!--        <mapper resource="EmpMapper.xml"/>-->
        <mapper class="com.kdy.mapper.EmpMapper"></mapper>
    </mappers>


</configuration>

2、XML映射器

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--XML 映射器-->
<!--Mybatis 真正强大 在于它的语句映射  MyBatis致力于减少使用成本,让用户能专注于SQL代码  -->
<!--根节点 -->
<!--namesapce属性   命名空间   一般 一个Mapper对应不同的一个命名空间 利于后期管理维护
    默认情况下可以随意输入  但是如果使用接口绑定方式  必须输入对应的接口的完整限定名



-->
<mapper namespace="com.kdy.mapper.EmpMapper">
    <select id="selectEmp" resultType="Emp" databaseId="mysql">
        SELECT id,username as uname  FROM emp WhERE id=#{id}
    </select>
</mapper>

3、@Alias 注解

package com.kdy.pojo;

import org.apache.ibatis.type.Alias;

//@Alias("Emp2")
public class Emp {

Configuration.java 中 别名对应实现类

public Configuration() {
  typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class);
  typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class);

  typeAliasRegistry.registerAlias("JNDI", JndiDataSourceFactory.class);
  typeAliasRegistry.registerAlias("POOLED", PooledDataSourceFactory.class);
  typeAliasRegistry.registerAlias("UNPOOLED", UnpooledDataSourceFactory.class);

  typeAliasRegistry.registerAlias("PERPETUAL", PerpetualCache.class);
  typeAliasRegistry.registerAlias("FIFO", FifoCache.class);
  typeAliasRegistry.registerAlias("LRU", LruCache.class);
  typeAliasRegistry.registerAlias("SOFT", SoftCache.class);
  typeAliasRegistry.registerAlias("WEAK", WeakCache.class);

  typeAliasRegistry.registerAlias("DB_VENDOR", VendorDatabaseIdProvider.class);

  typeAliasRegistry.registerAlias("XML", XMLLanguageDriver.class);
  typeAliasRegistry.registerAlias("RAW", RawLanguageDriver.class);

  typeAliasRegistry.registerAlias("SLF4J", Slf4jImpl.class);
  typeAliasRegistry.registerAlias("COMMONS_LOGGING", JakartaCommonsLoggingImpl.class);
  typeAliasRegistry.registerAlias("LOG4J", Log4jImpl.class);
  typeAliasRegistry.registerAlias("LOG4J2", Log4j2Impl.class);
  typeAliasRegistry.registerAlias("JDK_LOGGING", Jdk14LoggingImpl.class);
  typeAliasRegistry.registerAlias("STDOUT_LOGGING", StdOutImpl.class);
  typeAliasRegistry.registerAlias("NO_LOGGING", NoLoggingImpl.class);

  typeAliasRegistry.registerAlias("CGLIB", CglibProxyFactory.class);
  typeAliasRegistry.registerAlias("JAVASSIST", JavassistProxyFactory.class);

  languageRegistry.setDefaultDriverClass(XMLLanguageDriver.class);
  languageRegistry.register(RawLanguageDriver.class);
}