Mybatis 笔记——XML 配置

这是我参与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 | false true
lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 true | false false
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 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。

别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator

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命名规则 : 包名+类名


猜你喜欢

转载自juejin.im/post/7034408558053556254