Mybatis 笔记——XML 配置

403 阅读3分钟

这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战

<!--配置-->
<configuration>
    <!--属性-->
    <properties>
    <!--设置-->
    <settings>
    <!--类型别名-->
    <typeAliases>
    <!--类型处理器-->
    <typeHandlers>
    <!--对象工厂-->
    <objectFactory>
    <!--插件-->
    <plugins>
    <!--环境配置-->
    <environments>
    <!--数据库厂商标识-->
    <databaseIdProvider>
    <!--映射器-->
    <mappers>
</configuration>
<!-- 注意元素节点的顺序!顺序不对会报错 -->

Properties

属性可以在外部文件进行配置,通过 <properties resource="jdbc.properties"/>引入外部文件

url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8
driver=com.mysql.jdbc.Driver
username=root
password=123456
<properties resource="jdbc.properties"/>

<!--环境配置-->
<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </dataSource>
    </environment>
</environments

也可以在 properties 元素的子元素中设置,并可以进行动态替换

<!--环境配置-->
<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8"/>
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
        </dataSource>
    </environment>
</environments>

Settings

常用的设置

设置名描述有效值默认值
cacheEnabled全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。true | falsetrue
lazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。true | falsefalse
logImpl指定 MyBatis 所用日志的具体实现,未指定时将自动查找。SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING未设置

一个配置完整的 settings 元素的示例如下:

<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>

TypeAliases

类型别名是为 Java 类型设置一个短的名字。它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。

  1. 扫描类使用别名

    <typeAliases>
        <typeAlias type="pojo.User" alias="User"/>
    </typeAliases>
    

    当这样配置时,User可以用在任何使用pojo.User的地方。

  2. 扫描包

    <typeAliases>
        <package name="pojo"/>
    </typeAliases>
    

    每一个在包 pojo 中的 JavaBean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。若有注解,则别名为其注解值。

  3. 在类上使用注解

    import org.apache.ibatis.type.Alias;
    
    @Alias("user")
    public class User {
    
        private int id;
        private String name;
        private String password;
    
    }
    

下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。

别名映射的类型
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
objectObject
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection
iteratorIterator

Environments

配置 MyBatis 的多套运行环境,将 SQL 映射到多个不同的数据库上,必须指定其中一个为默认运行环境(通过 default 指定),通过 id 进行区别

<!--环境配置-->
<environments default="development">
    
    <!--development环境-->
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </dataSource>
    </environment>

    <!--test-->
    <environment id="test">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </dataSource>
    </environment>
</environments>

子元素节点:environment

  1. transactionManager 事务管理器

    <!-- 语法 -->
    <transactionManager type="[ JDBC | MANAGED ]"/>
    
  2. dataSource 数据源

    使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。数据源是必须配置的。有三种内建的数据源类型:

    type="[UNPOOLED|POOLED|JNDI]")
    
    • unpooled:这个数据源的实现只是每次被请求时打开和关闭连接。
    • pooled:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
    • jndi:这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。

Mapper

Mapper 映射器告诉 MyBatis 到哪里去找映射文件

  1. 使用相对于类路径的资源引用

    <mappers>
    
        <mapper resource="mapper/UserMapper.xml"/>
    
    </mappers>
    
  2. 类名

    <!--需要配置文件名称和接口名称一致,并且位于同一目录下-->
    <mappers>
    
        <mapper class="mapper.UserMapper"/>
    
    </mappers>
    
  3. 包名

    <!--需要配置文件名称和接口名称一致,并且位于同一目录下-->
    <mappers>
    
        <package name="mapper"/>
        
    </mappers>
    

Mapper 文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="mapper.UserMapper">

    <insert id="addUser" parameterType="pojo.User">
        insert into user(id, name, password)
        values (#{id}, #{name}, #{password})
    </insert>

</mapper>
  • namespace 的命名必须跟某个接口同名

  • 接口中的方法与映射文件中sql语句id应该一一对应

  • namespace命名规则 : 包名+类名