Mybatis配置文件入门

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> ,内部结构如下:

  • configuration (配置)
    • properties (属性)
    • settings (设置)
    • typeAliases (类型别名)
    • typeHandlers (类型处理器)
    • objectFactory (对象工厂)
    • plugins (插件)
    • environments (环境配置)
      • environment (环境变量)
        • transactionManager (事务管理器)
        • datasource (数据源)
    • databaseIdProvider (数据库厂商标识)
    • mappers (映射器)

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 | falsetrue
lazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。true | falsefalse
aggressiveLazyLoading开启时,任一方法的调用都会加载该对象的所有延迟加载属性。 否则,每个延迟加载属性会按需加载(参考 lazyLoadTriggerMethods)。true | falsefalse (在 3.4.1 及之前的版本中默认为 true)
useGeneratedKeys允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。true | falseFalse
autoMappingBehavior指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。 FULL 会自动映射任何复杂的结果集(无论是否嵌套)。NONE, PARTIAL, FULLPARTIAL
defaultStatementTimeout设置超时时间,它决定数据库驱动等待数据库响应的秒数。任意正整数未设置 (null)
mapUnderscoreToCamelCase是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。true | falseFalse
returnInstanceForEmptyRow当返回行的所有列都是空时,MyBatis默认返回 null。 当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集(如集合或关联)。(新增于 3.4.2)true | falsefalse
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允许在执行过程中对一些方法进行拦截,默认可通过插件进行拦截的方法有

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

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

  • JDBC:使用了JDBC的提交和回滚机制来管理事务。基本都用这个

  • MANAGED:把事务交给容器来管理,从不提交或回滚一个连接。几乎不用

datasource (数据源)

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

  • UNPOOLED:每次请求是都会打开和关闭连接,效率相对较低。

  • POOLED:使用”池“的概念来管理连接,复用空闲连接来提升效率。(常用)

  • JNDI: 这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的数据源引用。

POOLED可以设置的属性有:

  • driver – JDBC 驱动的 Java 类全限定名。(常用)

  • url – 数据库的 JDBC URL 地址。(常用)

  • username – 数据库用户名。(常用)

  • password – 数据库密码。(常用)

  • defaultTransactionIsolationLevel – 默认的连接事务隔离级别。

  • defaultNetworkTimeout – 等待数据库操作完成的默认网络超时时间(单位:毫秒)。

  • driver.encoding=UTF8 – 给数据库驱动设置编码.

  • poolMaximumActiveConnections – 最大活跃连接数,默认值:10

  • poolMaximumIdleConnections – 最大空闲连接数。

  • poolMaximumCheckoutTime – 在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)

  • poolTimeToWait – 从连接池中获取连接的等待时间,默认值:20000 毫秒(即 20 秒)。

  • poolMaximumLocalBadConnectionTolerance – 最大坏连接容忍度。 如果获取到的是一个坏的连接,那么数据源允许尝试重新获取一个新的连接,但是这个重新尝试的次数不应该超过 poolMaximumIdleConnectionspoolMaximumLocalBadConnectionTolerance 之和。 默认值:3(新增于 3.4.5)

  • poolPingQuery – 发送到数据库的侦测查询。默认是“NO PING QUERY SET”。

  • poolPingEnabled – 是否启用侦测查询,默认值:false。

  • poolPingConnectionsNotUsedFor – 配置 poolPingQuery 的频率,默认值:0(即所有连接每一时刻都被侦测 )。

实际开发中很少会使用默认的数据库连接池,比如常用阿里的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方式基本不会用到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bright1st

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值