Mybatis配置文件入门

2020-05-02  本文已影响0人  郝嗨森

mybatis-config.xml

<?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>
</configuration>

configuration

Mybatis 配置文件的最外层节点为 <configuration></configuration> ,内部结构如下:

properties (属性)

属性设置有三种方式,按加载顺序依次为:子元素外部属性文件方法参数,后加载的属性会覆盖先加载的同名属性

子元素

通过 properties 的子元素 property 进行设置

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

设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值。比如常用的数据源配置:

<dataSource type="POOLED">
  <property name="driver" value="${driver}"/>
  <property name="url" value="${url}"/>
  <property name="username" value="${username}"/>
  <property name="password" value="${password}"/>
</dataSource>

外部属性文件

resources 目录下建一个 properties 文件 db.properties

db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
db.username=root
db.password=root123

properties 标签中通过 resourcesurl 属性引入

<properties resource="db.properties" />
或
<properties url="db.properties" />

方法参数

Mybatis的配置文件是通过 SqlSessionFactoryBuilder的build() 方法加载的,这个方法还可以传入一个 Properties 类型的参数用来加载属性

// 方法名
public SqlSessionFactory build(InputStream inputStream, Properties properties)

// 使用 
String configPath = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(configPath)
String propPath = "db.properties";
Properties properties = new Properties();
properties.load(Resources.getResourceAsStream(propPath));
// 传入属性对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, properties);

默认值

MyBatis 3.4.2 开始,可以为占位符指定一个默认值,这个特性是默认关闭的,需要手动开启

<properties>
    <!-- 开启默认值特性 -->
    <property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> 
</properties>

<dataSource type="POOLED">
    <!-- 如果没有配置 username 属性,就会使用 root -->
    <property name="username" value="${username:root}"/> 
</dataSource>

设置默认值的分隔符默认是 : ,如果属性名称中使用了 : (如:db:username),或使用了带有 : 的表达式(如三元表达式 ${username != null ? username : 'root'}),就需要修改默认的分隔符

<properties>
    <!-- 修改默认值的分隔符 -->
    <property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/> 
</properties>

这样就可以使用 ?: 来作为分隔符了

<dataSource type="POOLED">
    <property name="username" value="${db:username?:root}"/> 
</dataSource>

settings (设置)

设置是配置文件中极为重要的部分,关系到 Mybatis 运行时的行为,这里只选取部分常用的设置,完整版请移步Mybatis官网

cacheEnabled 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 true | false true
lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 true | false false
aggressiveLazyLoading 开启时,任一方法的调用都会加载该对象的所有延迟加载属性。 否则,每个延迟加载属性会按需加载(参考 lazyLoadTriggerMethods)。 true | false false (在 3.4.1 及之前的版本中默认为 true)
useGeneratedKeys 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。 true | false False
autoMappingBehavior 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。 FULL 会自动映射任何复杂的结果集(无论是否嵌套)。 NONE, PARTIAL, FULL PARTIAL
defaultStatementTimeout 设置超时时间,它决定数据库驱动等待数据库响应的秒数。 任意正整数 未设置 (null)
mapUnderscoreToCamelCase 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 true | false False
returnInstanceForEmptyRow 当返回行的所有列都是空时,MyBatis默认返回 null。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集(如集合或关联)。(新增于 3.4.2) true | false false
logPrefix 指定 MyBatis 增加到日志名称的前缀。 任何字符串 未设置
logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING 未设置

typeAliases (类型别名)

在设置类型时需要使用类的全限定名,名称比较长,typeAliases可以为Java类型设置缩写,

<typeAliases>
    <!-- 为User类设置别名 -->
    <typeAlias type="com.entity.User" alias="user"/>
</typeAliases>
    
// UserMapper.xml
<select id="findUserById" resultType="user">
    select * from tb_user where id = #{id}
</select>

也可以指定包名来对包下的所有Java Bean设置别名,默认是使用类名首字母小写作为别名

<typeAliases>
  <package name="com.entity"/>
</typeAliases>

如果类上使用了注解设置别名,则会使用注解中的别名

@Alias("myUser")
public class User {}  

typeHandlers (类型处理器)

在对SQL语句设置参数或从结果集中取字段时,typeHandlers 可以 处理Java类型和SQL类型之间的转换。

objectFactory (对象工厂)

在将结果集映射成对象时,都会使用objectFactory 进行实例化工作。

plugins (插件)

Mybatis允许在执行过程中对一些方法进行拦截,默认可通过插件进行拦截的方法有

environments (环境配置)

Mybatis可以设置多个环境,但是在运行时只能选择一种环境

<!-- 默认使用dev环境 -->
<environments default="dev">
    <!-- dev环境配置 -->
    <environment id="prod">
        <transactionManager type="JDBC"></transactionManager>
        <dataSource type="POOLED"></dataSource>
    </environment>
    <!-- test环境配置 -->
    <environment id="test">
        <transactionManager type="JDBC"></transactionManager>
        <dataSource type="POOLED"></dataSource>
    </environment>
</environments>

environment (环境变量)

environment配置具体的环境信息,包括 transactionManager(事务管理器)datasource(数据源)

<environment id="prod">
    <!-- 事务管理器 -->
    <transactionManager type="JDBC"></transactionManager>
    <!-- 数据源 -->
    <dataSource type="POOLED"></dataSource>
</environment>
transactionManager (事务管理器)

transactionManager 有两种:JDBCMANAGED

datasource (数据源)

datasource有三种:UNPOOLEDPOOLEDJNDI,这里只对常用的POOLED进行具体说明。

POOLED可以设置的属性有:

实际开发中很少会使用默认的数据库连接池,比如常用阿里的druid连接池,所以只做简单了解即可。

databaseIdProvider (数据库厂商标识)

MyBatis 可以根据不同的数据库厂商执行不同的语句(没用过)

<databaseIdProvider type="DB_VENDOR">
  <property name="SQL Server" value="sqlserver"/>
  <property name="DB2" value="db2"/>
  <property name="Oracle" value="oracle" />
</databaseIdProvider>

mappers (映射器)

通过mappers来引入映射文件,引入方式有四种:resource、url、class、package

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>
方式 标签样式 mapper文件类型 路径类型
resource <mapper resource=""/> xml 类路径相对路径
url <mapper url=""/> xml 本地文件路径
class <mapper class=""/> 接口 实现类的完全限定类名
package <package name=""/> 接口 包名

实际开发中由于mapper文件一般会有很多,所以常用策略是都放在一个包下,然后通过package方式进行引入。resourceclass适合mapper文件较少的情况,url方式基本不会用到

上一篇下一篇

猜你喜欢

热点阅读