Mybatis之解析配置优化

核心配置文件

官方文档:

plain 复制代码
https://mybatis.org/mybatis-3/zh_CN/configuration.html
  • mybatis-config.xml
  • MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
plain 复制代码
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器) 

环境配置(environments)

environment(环境变量)

MyBatis 可以配置成适应多种环境

不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

  • 这里可以指定默认选项
  • 默认使用的环境 ID(比如:default="development")。
  • 每个 environment 元素定义的环境 ID(比如:id="development")。
  • 事务管理器的配置(比如:type="JDBC")。
  • 数据源的配置(比如:type="POOLED")。

默认环境和环境 ID 顾名思义。 环境可以随意命名,但务必保证默认的环境 ID 要匹配其中一个环境 ID。

transactionManager(事务管理器)

  • 在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):
  • Mybats默认的事务管理器就是JDBC,连接池:POOLED

dataSource(数据源)

dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。

  • 大多数 MyBatis 应用程序会按示例中的例子来配置数据源。虽然数据源配置是可选的,但如果要启用延迟加载特性,就必须配置数据源。

有三种内建的数据源类型(也就是 type="[UNPOOLED|POOLED|JNDI]"):

属性(properties)

我们可以通过properties属性来实现引用配置文件

这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。[db.properties]

  • 编辑一个配置文件db.properties
properties 复制代码
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&useSSL=false
username=root
password=123456
  • 在mybatis-config.xml引入db.properties外部配置文件
xml 复制代码
<!--放入最上面,引入外部配置文件-->
<properties resource="db.properties"/>

<!--也可以自定义添加属性,比如外部配置文件并没有username和password-->
<properties resource="org/mybatis/example/config.properties">
  <property name="username" value="root"/>
  <property name="password" value="123456"/>
</properties>
  • 可以看见环境设置里面的变量不需要再写死了,我们只需要引入外部配置文件
xml 复制代码
<?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">
<!--configuration核心配置文件-->
<configuration>
    <properties resource="db.properties"/>

    <!--环境设置,因为有s代表复数,可以配置多个环境environments-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <!--&amp;相当于原来的&符号进行了转义,因为XML中需要一些转义-->
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>

    </environments>
    <!--没有给Mapping.XML都需要在Mybatis核心配置文件中注册-->
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>

</configuration>
  • 可以直接引入外部文件
  • 可以在其中增加一些属性配置
  • 如果增加的属性配置和外部文件都有同一个字段,优先使用外部文件!

类型别名(typeAliases)

  • 类型别名可为 Java 类型设置一个缩写名字。
  • 它仅用于 XML 配置,意在降低冗余的全限定类名书写
xml 复制代码
    <typeAliases>
        <!--可以给实体类起一个别名-->
        <typeAlias type="com.cike.pojo.user" alias="user"/>
    </typeAliases>
  • 也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean
    • 扫描实体类的包,它默认别名是这个类的类名,首字母小写
xml 复制代码
    <typeAliases>
        <!--可以给实体类起一个别名-->        
        <package name="com.cike.pojo"/>
    </typeAliases>

通过注解取别名,适用于包扫描

java 复制代码
@Alias("user1")
public class user {}

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

别名 映射的类型
_byte byte
_char (since 3.5.10) char
_character (since 3.5.10) char
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
char (since 3.5.10) Character
character (since 3.5.10) Character
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
biginteger BigInteger
object Object
date[] Date[]
decimal[] BigDecimal[]
bigdecimal[] BigDecimal[]
biginteger[] BigInteger[]
object[] Object[]
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator

总结:

  • 第一种方式可以DIY别名,第二种则需要在实体类进行注解起DIIY别名、否则它扫描包的时候是实体类首字母小写的别名
  • 第一种,在实体类比较少的情况下可以使用
  • 第二种,尸体了比较多的时候可以使用

设置(settings)

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

  • 要记得:

| logImpl(日志实现)主要这个 | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | LOG4J(3.5.9 起废弃) | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | 未设置 |

| --- | --- | --- | --- |

| cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 | true | false | true |

| lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 <font style="color:rgb(221, 17, 68);background-color:rgb(247, 247, 249);">fetchType</font>

属性来覆盖该项的开关状态。 | true | false | false |

需要了解的:

设置名 描述 有效值 默认值
cacheEnabled 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 true false
lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 <font style="color:rgb(221, 17, 68);background-color:rgb(247, 247, 249);">fetchType</font> 属性来覆盖该项的开关状态。 true false
useColumnLabel 使用列标签代替列名。实际表现依赖于数据库驱动,具体可参考数据库驱动的相关文档,或通过对比测试来观察。 true false
useGeneratedKeys (自动生成主键) 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。 true false
mapUnderscoreToCamelCase 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 true false
logImpl(日志实现) 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 SLF4J LOG4J(3.5.9 起废弃)

更多的看一看官网:

plain 复制代码
https://mybatis.org/mybatis-3/zh_CN/configuration.html#settings

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

xml 复制代码
<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="aggressiveLazyLoading" 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="safeResultHandlerEnabled" value="true"/>
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <setting name="localCacheScope" value="SESSION"/>
  <setting name="jdbcTypeForNull" value="OTHER"/>
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
  <setting name="defaultScriptingLanguage" value="org.apache.ibatis.scripting.xmltags.XMLLanguageDriver"/>
  <setting name="defaultEnumTypeHandler" value="org.apache.ibatis.type.EnumTypeHandler"/>
  <setting name="callSettersOnNulls" value="false"/>
  <setting name="returnInstanceForEmptyRow" value="false"/>
  <setting name="logPrefix" value="exampleLogPreFix_"/>
  <setting name="logImpl" value="SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING"/>
  <setting name="proxyFactory" value="CGLIB | JAVASSIST"/>
  <setting name="vfsImpl" value="org.mybatis.example.YourselfVfsImpl"/>
  <setting name="useActualParamName" value="true"/>
  <setting name="configurationFactory" value="org.mybatis.example.ConfigurationFactory"/>
</settings>

其他配置

映射器

MapperRegistry:注册绑定我们的Mapper文件

一共有四种方式:

  • 使用相对于类路径的资源引用
  • 使用映射器接口实现类的完全限定类名
  • 将包内的映射器接口全部注册为映射器
  • 使用完全限定资源定位符(URL)"不推荐使用"

方式一:使用resource绑定注册【推荐使用】

xml 复制代码
    <!--使用相对于类路径的资源引用-->
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>

方式二:使用class绑定注册

xml 复制代码
    <mappers>
        <!--使用映射器接口实现类的完全限定类名-->
        <mapper class="com.cike.dao.UserMapper"/>
    </mappers>

注意点:

  • 接口和它的Mapper配置文件必须同名!
  • 接口和它的Mapper配置文件必须在同一个包下!

方式三:使用扫描包进行注入绑定

注意点:

  • 接口和它的Mapper配置文件必须同名!
  • 接口和它的Mapper配置文件必须在同一个包下!
xml 复制代码
    <mappers>
        <!--将包内的映射器接口全部注册为映射器 -->
        <package name="com.cike.dao"/>
    </mappers>
相关推荐
Jay_Franklin3 小时前
SRIM通过python计算dap
开发语言·python
是一个Bug3 小时前
Java基础50道经典面试题(四)
java·windows·python
Slow菜鸟3 小时前
Java基础架构设计(三)| 通用响应与异常处理(分布式应用通用方案)
java·开发语言
消失的旧时光-19434 小时前
401 自动刷新 Token 的完整架构设计(Dio 实战版)
开发语言·前端·javascript
wadesir4 小时前
Rust中的条件变量详解(使用Condvar的wait方法实现线程同步)
开发语言·算法·rust
我是Superman丶4 小时前
《Spring WebFlux 实战:基于 SSE 实现多类型事件流(支持聊天消息、元数据与控制指令混合传输)》
java
tap.AI4 小时前
RAG系列(二)数据准备与向量索引
开发语言·人工智能
廋到被风吹走4 小时前
【Spring】常用注解分类整理
java·后端·spring
阿蒙Amon4 小时前
C#每日面试题-重写和重载的区别
开发语言·c#