Mybatis配置文件入门

2023-11-07

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 | 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允许在执行过程中对一些方法进行拦截,默认可通过插件进行拦截的方法有

  • 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方式基本不会用到

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis配置文件入门 的相关文章

  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • MySQL 追加字符串

    How can I append a string to the end of an existing table value Let s say I have the table below And let s say that Mari
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 随机组合 MySQL 数据库中的两个单词

    我有一个包含名词和形容词的数据库 例如 id type word 1 noun apple 2 noun ball 3 adj clammy 4 noun keyboard 5 adj bloody ect 我想创建一个查询 它将抓取 10
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • SQL 最近日期

    我需要在 php 中获取诸如 2010 04 27 之类的日期作为字符串 并在表中找到最近的 5 个日期 表中的日期保存为日期类型 您可以使用DATEDIFF http dev mysql com doc refman 5 1 en dat
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • MySQL 转储未知选项“-no-beep”

    在旧服务器上我使用了mysql转储命令来备份 MySQL 数据库 在新服务器上 MySQL 版本为 5 6 相同的命令给出了错误 unknown option no beep 无论它插入什么 我也在互联网上搜索过 但找不到任何帮助 在 my
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db

随机推荐

  • No toolchains found in the NDK toolchains folder for ABI with prefix: arm-linux-androideabi

    产生背景 最近把Android Studio更新到3 0 更新之后出现了build错误 No toolchains found in the NDK toolchains folder for ABI with prefix arm lin
  • MATLAB线性规划——2019/7/4,7/5

    线性规划问题 MATLAB中规定线性规划的标准形式为 min x f T
  • 华为OD机试真题 Java 实现【找数字】【2023Q2 100分】

    目录 专栏导读 一 题目描述 输入数组nums为 输出 二 输入描述 三 输出描述 四 补充说明 五 解题思路 六 Java算法源码 七 效果展示 1 输入 2 输出 3 说明 华为OD机试 2023B卷题库疯狂收录中 刷题点这里 专栏导读
  • PAT1033 旧键盘打字 (20 分)

    题目描述 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及坏掉的那些键 打出的结果文字会是怎样 输入格式 输入在 2 行中分别给出坏掉的那些键 以及应该输入的文字 其中对应英文字母的坏键以大
  • chatgpt赋能python:Python学习:如何建立一个空集合?

    Python学习 如何建立一个空集合 作为一门流行的编程语言 Python在数据处理 机器学习和Web应用开发等领域广泛应用 其中 集合是Python中常用的数据类型之一 它是由不同元素组成的无序集合 其中每个元素都是唯一的 当需要处理一些
  • Git&TortoiseGit安装和配置

    前言 日常开发提交代码的过程中 Git工具是必不可少的 有些小伙伴喜欢可视化界面 TortoiseGit工具就是不二之选了 下面提供纯Git配置和Git TortoiseGit两种方式 1 纯Git安装与配置 下载 Git官网 下载安装完成
  • Python Email应用的中文乱码问题解决方法

    或者是对python的unicode理解得不透彻 时常遇到各种各样的中文乱码问题 今天 在email应用中 中文乱码又出来捣乱了 经过一段时间的误打误撞 搞出了一个解决方法 coding utf 8 Created on 2010 6 21
  • [docker]笔记-存储管理

    1 docker数据存储分为非永久性存储和永久性存储 非永久性存储 容器创建会默认创建非永久性存储 该存储从属于容器 生命周期与容器相同 会随着容器的关闭而消失 可理解为内存中数据 会随关机而消失 多用来保存不需要存储的数据 永久性存储 创
  • eclipse中注释模板的修改

    window gt preferences gt java gt code style gt code template gt comments code 手机扫一扫 关注程序员技能成长
  • Android 取主色逻辑

    Palette是Google官方提供的一个类 用于帮助开发者提取图片的主色 1 生成 Palette 根据bitmap生成 Palette 同步方法 应该在子线程中使用 Palette p Palette generate bitmap 异
  • date时间格式化 只想要年月日

    传进来的时间是String类型 DateTimeFormatter format DateTimeFormat forPattern yyyy MM dd HH mm ss DateTime paraDate DateTime parse
  • ssm(spring+springMVC+Mybatis)框架 集成Quartz(定时任务框架)

    1 ssm框架基础jar 包 aopalliance jar aspectjrt jar aspectjweaver jar commons beanutils 1 9 2 jar commons codec 1 9 jar commons
  • Python基础--入门基础和数据类型测试题(一)

    Made By Zly All Right Reversed 上一篇 篇三 Python 入门基础和数据类型测试题 一 1 在Python语言中 不能作为变量名的是 A P B Temp C 3p D fg 2 以下关于Python缩进的描
  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • Java 生成测试字符串的库:Java Faker

    一 背景 Java的单元测试经常需要构造各种测试数据 其中一项就是构造测试的字符串 如果手动创建非常麻烦 也有一些框架支持创建指定长度的随机字符串 但是并不是我们想要的效果 我们想要的是人名 地名等 那么有一个库叫java fake可以实现
  • 从MCU上电启动流程出发编写bootloader(上)

    配置开发板的BOOT 从EFLASH 即片内Flash存储器 启动 在KEIL中也需要进行相应的设置 将接下来要编写的bootloader烧写至EFLASH bootloader段需要设置从0x8000000开始 空间根据bootloade
  • 50个热门语义分割数据集免费、高速下载资源分享,涵盖通用视觉、遥感、自动驾驶、医疗等多种场景题

    小伙伴们期待已久的数据集资源盘点系列又来啦 本期将分享50个语义分割任务相关的热门公开数据集资源 粗略分了4类 通用视觉类 智慧遥感类 自动驾驶类 其他 快来看看有没有你想要的吧 如果觉得不错的话 记得收藏 一 通用视觉类 No 1 PAS
  • 【java筑基】IO流基础之文件的常见操作

    前 言 作者简介 半旧518 长跑型选手 立志坚持写10年博客 专注于java后端 专栏简介 深入 全面 系统的介绍java的基础知识 文章简介 本文将深入全面介绍IO流知识 建议收藏备用 创作不易 敬请三连哦 大厂真题 大厂面试真题大全
  • Linux 对函数库的理解

    一 前言 我们的C程序中 并没有定义 printf 的函数实现 且在预编译中包含的 stdio h 中也只有该函数的声明 而没有定义函数的实现 那么 是在哪里实 printf 函数的呢 最后的答案是 系统把这些函数实现都被做到名为 libc
  • Mybatis配置文件入门

    mybatis config xml