MyBatis:配置文件

news2025/4/8 14:53:56

MyBatis

  • 前言
  • 全局配置文件
  • 映射配置文件

在这里插入图片描述

前言

在 MyBatis 中,配置文件分为 全局配置文件(核心配置文件)映射配置文件 。通过这两个配置文件,MyBatis 可以根据需要动态地生成 SQL 语句并执行,同时将结果集转换成 Java 对象,使得在 Java 程序中操作数据库变得更加方便和灵活。

全局配置文件

全局配置文件(Core Configuration File),是 MyBatis 的核心配置文件,通常命名为 mybatis-config.xml 。这个文件包含 MyBatis 运行时所需的核心配置信息,如数据库连接信息、事务管理器、别名、映射文件等。

全局配置文件通常的结构

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

常见全局配置标签

标签说明
configuration配置文件的根标签。包含其他所有的配置标签
properties设置外部配置且可动态替换的标签。一般用于读取外部的 properties 属性文件
settings配置 MyBatis 运行时行为的标签。一般情况下使用默认值即可
typeAliases设置别名的标签。可以简化类型名称的书写,如可以用一个别名代替一个类全名
typeHandlers指定处理 Java 类型的 TypeHandler 的标签。通过配置 typeHandlers,可以在全局范围内注册自定义的 TypeHandler,使得在所有的 SQL 语句中都可以使用该 TypeHandler 来处理特定的 Java 类型
objectFactory指定对象工厂的标签。通过配置 objectFactory ,可以在全局范围内指定一个自定义的对象工厂,用于创建所有映射器文件中需要的对象实例
plugins注册插件的标签。通过配置 plugins ,可以在全局范围内注册自定义的插件,使得插件可以拦截目标方法,并在目标方法执行前后添加额外的逻辑,如日志记录、权限校验、缓存控制等
environments配置环境的标签。如开发环境、测试环境和生产环境等。每个环境(environment)可以设置一个事务管理器(Transaction Manager)和一个数据源(DataSource)
databaseIdProvider指定数据库标识提供者的标签。MyBatis 可以根据不同的数据库厂商执行不同的 SQL 语句
mappers指定映射文件路径的标签。MyBatis 会加载这些文件并将其应用于相应的数据库操作

settings 标签中的属性

属性说明
cacheEnabled默认值为 true ,全局开关所有映射器配置文件中已配置的任何缓存
lazyLoadingEnabled默认值为 false ,延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态
aggressiveLazyLoading默认值为 false ,当开启时,任何方法的调用都会加载该对象的所有延迟加载属性。反之,每个延迟加载属性将会按需加载
multipleResultSetsEnabled默认值为 true ,是否允许单个语句返回多结果集(需要数据库驱动支持)
useColumnLabel默认值为 true ,使用列标签代替列名。实际表现依赖于数据库驱动,具体可参考数据库驱动的相关文档
useGeneratedKeys默认值为 false ,允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)
autoMappingBehavior默认值为 PARTIAL ,指定 MyBatis 应如何自动映射列到字段或属性。NONE 表示关闭自动映射;PARTIAL 表示只会自动映射没有定义嵌套结果映射的字段;FULL 表示会自动映射任何复杂的结果集(无论是否嵌套)
autoMappingUnknownColumnBehavior默认值为 none(不处理),指定发现自动映射目标未知列(或未知属性类型)的行为
defaultExecutorType默认值为 simple ,配置默认的执行器。SIMPLE 是普通执行器;REUSE 执行器会重用预处理语句(PreparedStatement); BATCH 执行器不仅重用语句还会执行批量更新
defaultStatementTimeout默认值为 null ,设置超时时间,它决定数据库驱动等待数据库响应的秒数
defaultFetchSize默认值为 null ,为驱动的结果集获取数量(fetchSize)设置一个建议值。此参数只可以在查询设置中被覆盖
defaultResultSetType默认值为 null ,指定语句默认的滚动策略
safeRowBoundsEnabled默认值为 false ,是否允许在嵌套语句中使用分页(RowBounds)。如果允许使用设置为 false
safeResultHandlerEnabled默认值为 true ,是否允许在嵌套语句中使用结果处理器(ResultHandler)。如果允许使用设置为 false
mapUnderscoreToCamelCase默认值为 false ,是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn
localCacheScope默认值为 SESSION,会缓存一个会话中执行的所有查询。 若设置值为 STATEMENT ,本地缓存将仅用于执行语句,对相同 SqlSession 的不同查询将不会进行缓存。MyBatis 利用本地缓存机制(Local Cache)防止循环引用和加速重复的嵌套查询
jdbcTypeForNull当没有为参数指定特定的 JDBC 类型时,空值的默认 JDBC 类型。 某些数据库驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,如 NULL、VARCHAR 或 OTHER
lazyLoadTriggerMethods指定对象的哪些方法触发一次延迟加载
defaultScriptingLanguage指定动态 SQL 生成使用的默认脚本语言
defaultEnumTypeHandler指定 Enum 使用的默认 TypeHandler
callSettersOnNulls默认值为 false ,指定当结果集中值为 null 时,是否调用映射对象的 setter(map 对象时为 put)方法,这依赖于 Map.keySet() 或 null 值进行初始化时比较有用。注意基本类型(int、boolean 等)是不能设置成 null 的
returnInstanceForEmptyRow默认值为 false ,当返回行的所有列都是空时,MyBatis 默认返回 null 。 当开启这个设置时,MyBatis会返回一个空实例。 注意:它也适用于嵌套的结果集(如集合或关联)
logPrefix指定 MyBatis 增加到日志名称的前缀
logImpl指定 MyBatis 所用日志的具体实现,未指定时将自动查找
proxyFactory指定 Mybatis 创建可延迟加载对象所用到的代理工具
vfsImpl指定 VFS 的实现
useActualParamName默认值为 true ,允许使用方法签名中的名称作为语句参数名称。 为了使用该特性,项目中必须采用 Java 8 编译并加上 -parameters 选项
configurationFactory指定一个提供 Configuration 实例的类。 这个被返回的 Configuration 实例用来加载被反序列化对象的延迟加载属性值。 这个类必须包含一个签名为 static Configuration getConfiguration() 的方法
shrinkWhitespacesInSql默认值为 false ,从 SQL 中删除多余的空格字符。注意:这也会影响 SQL 中的文字字符串
defaultSqlProviderType指定一个拥有 provider 方法的 sql provider 类 。 这个类适用于指定 sql provider 注解上的 type(或 value) 属性(当这些属性在注解中被忽略时),如 @SelectProvider
nullableOnForEach默认值为 false ,为 foreach 标签的 nullable 属性指定默认值
argNameBasedConstructorAutoMapping默认值为 false ,当应用构造器自动映射时,参数名称被用来搜索要映射的列,而不再依赖列的顺序

简单示例:
在Java持久层框架:MyBatis介绍文章的案例基础上

1.typeAliases 标签:设置别名的标签。可以简化类型名称的书写,如可以用一个别名代替一个类全名

首先,在 mybatis.xml 配置文件中配置以下内容

<!-- typeAliases:设置别名,简化类型名称的书写。用一个别名代替一个类全名 -->
<typeAliases>
    <!-- 即 user 名称可以替代 cn.edu.MyBatisDemo.model.User 类全名 -->

    <!-- 设置单个别名的方式 -->
    <!-- <typeAlias type="cn.edu.MyBatisDemo.model.User" alias="user" /> -->

    <!-- 设置多个别名的方式,别名默认为类名(首字母为小写) -->
    <!-- 可以使用 @Alias() 注解在实体类的上方设置自定义的别名 -->
    <package name="cn.edu.MyBatisDemo.model" />
</typeAliases>

接着,在其他配置文件(如 UserMapper.xml )中使用到 cn.edu.MyBatisDemo.model.User 的类全名都可以写成 user 名称
在这里插入图片描述
在这里插入图片描述

最后,测试结果
结果如图:
在这里插入图片描述

2.mappers 标签:指定映射文件路径的标签。MyBatis 会加载这些文件并将其应用于相应的数据库操作

首先,在 mybatis.xml 配置文件中配置以下内容

<!-- POJO对象与数据表的映射配置 -->
<mappers>
    <!-- 1.类路径 -->
    <!-- <mapper resource="cn/edu/MyBatisDemo/model/UserMapper.xml" /> -->

    <!-- 2.包全名(注:映射文件与接口必须在同一个包和相同的文件名)-->
    <package name="cn.edu.MyBatisDemo.mapper" />
</mappers>

接着,查看映射文件与接口是否在同一个包里和相同的文件名
在这里插入图片描述

最后,测试结果
结果如图:
在这里插入图片描述

映射配置文件

映射配置文件(Mapping Configuration File),用于定义 SQL 语句和结果集的映射关系。每个映射配置文件都对应于数据库中的一个表或一个存储过程。映射配置文件通常会以 .xml 格式保存,并且命名方式通常是 [实体名] Map.xml 或者 [表名] Map.xml 。

常见映射配置标签

标签说明
mapper映射文件的根元素,包含了其他的映射定义
cache开启缓存以及配置属性来定制缓存的行为
cache-ref引用另一个命名空间的缓存配置,允许在多个命名空间之间共享缓存配置
resultMap定义一个结果集的映射关系,用于将数据库中的结果集转换成 Java 对象
select定义一个 SQL 查询语句,用于从数据库中获取数据
insert定义一个 SQL 插入语句,用于向数据库中插入数据
update定义一个 SQL 更新语句,用于更新数据库中的数据
delete定义一个 SQL 删除语句,用于从数据库中删除数据

简单示例:
在上面的案例基础上,再实现用户的增删改功能

首先,在接口 UserMapper 上声明增删改的方法

public void insert(User user); // 新增用户
public void update(User user); // 修改用户信息
public void delete(int id); // 删除指定用户

接着,在 UserMapper.xml 映射文件中添加对应的标签来实现

<!-- 通过 useGeneratedKeys 和 keyProperty 属性获取 MySQL 自增的主键 id 值 -->
<!-- useGeneratedKeys:开启添加记录后返回其 id 值 -->
<!-- keyProperty:设置返回的值放到对象指定的属性值上 -->
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO `user` (`name`,`password`,`date`,`state`) VALUES (#{name},#{password},#{date},#{state})
</insert>

<update id="update" >
    UPDATE `user` SET `name`=#{name},`password`=#{password},`date`=#{date},`state`=#{state} WHERE `id`=#{id}
</update>

<delete id="delete" >
    DELETE FROM `user` WHERE `id`=#{id}
</delete>

最后,测试结果

package cn.edu.MyBatisDemo.test;

import cn.edu.MyBatisDemo.mapper.UserMapper;
import cn.edu.MyBatisDemo.model.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;

public class MyBatisTest {
    @Test
    public void test() throws IOException {
        //1.根据配置文件创建数据库连接会话的工厂类
        InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
        //获取工厂类
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.通过工厂类获取数据库连接的会话
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3.通过 sqlSession 操作数据库
        try {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            //新增用户信息
            User insertUser = new User("诸葛亮","ccc",new Date(),1); // 在实体类中添加对应的参数构造方法
            userMapper.insert(insertUser);

            //获取新增用户的 id 值
            int id = insertUser.getId();

            //查看指定用户
            User selectUser = userMapper.selectUserById(id);
            System.out.println(selectUser);

            /**
             *  //修改指定用户
             *  User updateUser = new User("曹操","ccc",new Date(),1);
             *  updateUser.setId(20230815);
             *  userMapper.update(updateUser);
             *
             *  //删除指定用户
             *  userMapper.delete(20230815);
             */

            sqlSession.commit();
        } finally {
            sqlSession.close();
        }
    }
}

结果如图:
在这里插入图片描述

  • 参数数量
    在案例的 selectUserById 方法中,只传递一个 id 值作为参数(单个参数),在 UserMapper.xml 映射文件中通过 #{id} 来接收。通常情况下,使用相同名字输入在 #{} 内,也可以使用任意字符串输入在 #{} 内。
    在这里插入图片描述
    在这里插入图片描述
    但是,在多个参数的情况下,MyBatis 会把参数封装成 Map 对象,#{} 内将从 Map 对象中获取对应值,其获取方式分为三种:
    在这里插入图片描述
    书写格式1:参数1—param1,参数2—param2 …
    在这里插入图片描述
    书写格式2:参数1—arg0,参数2—arg1 …
    在这里插入图片描述
    书写格式3:在接口方法的参数上使用 @Param() 注解指定名字
    在这里插入图片描述
    在这里插入图片描述
    另外,也可以将多个参数封装成 POJO 对象,通过 #{ POJO 对象属性} 形式获取传递的值
    在这里插入图片描述
    在这里插入图片描述

  • 参数类型
    接口方法上的参数类型集合数组时,同样 MyBatis 也是将参数封装成 Map 对象,然后分别通过 #{collection}#{array} 方式获取参数值。另外,List 集合可以通过 #{list} 方式获取。
    书写格式1:参数1—#{collection[0]},参数2—#{collection[1]} …
    书写格式2:参数1—#{array[0]},参数2—#{array[1]} …
    书写格式3:参数1—#{list[0]},参数2—#{list[1]} …

  • 参数符号
    在映射文件中,获取参数所使用的参数符号分为两种:#{}${}
    #{}:PreparedStatement 对象来执行的 SQL 语句(预编译,基本情况下使用该参数符号)
    ${}:Statement 对象来执行的 SQL 语句 (拼接成 SQL 语句,存在注入攻击风险。一般用于传入数据库对象,如表名、order by 排序字段)

  • select 标签属性
    resultType 属性
    1.当返回结果为 List 集合类型时,resultType 属性值为类全名或设置的别名
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    2.当返回结果为 Map 集合类型时,resultType 属性值为已设定的别名 map
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    resultMap 属性
    1.自定义数据库字段与对象属性的对应名字
    在这里插入图片描述
    2.实现关联查询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1126741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入探索:AbstractQueuedSynchronizer 同步器的神秘面纱

文章目录 &#x1f31f; 一、AQS的底层实现原理&#x1f34a; 1. AQS的概述&#x1f34a; 2. AQS的数据结构&#x1f389; (1) 同步状态&#x1f389; (2) 等待队列 &#x1f34a; 3. AQS的锁请求和释放过程&#x1f389; (1) 独占模式&#x1f389; (2) 共享模式 &#x1f34a…

Electron 学习

Electron基本简介 如果你可以建一个网站&#xff0c;你就可以建一个桌面应用程序。Eletron 是一个使用 JavaScript, HTML和 CSS等Web 技术创建原生程序的框架&#xff0c;它负责比较难搞的部分&#xff0c;你只需把精力放在你的应用的核心上即可。 Electron 可以让你使用纯 Jav…

s27.linux运维面试题分享

第一章 计算机基础和Linux安装 1.冯诺依曼体系结构组成部分 计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成。2.Linux哲学思想(或Liunx基本原则、思想、规则) 一切都是一个文件&#xff08;包括硬件&#xff09;。小型&#xff0c;单一用途的程序。连…

分享一个月份连续的MSSA插值的GRACE level03数据集

1. 背景介绍 我们通常使用的GRACE数据包含球谐数据和mascon数据。而不管是球谐产品还是mascon产品&#xff0c;都存在月份数据的缺失&#xff0c;如下图所示&#xff08;Yi and Sneeuw, 2021&#xff09;。本专栏分享了一个利用多通道奇异谱分析&#xff08;MSSA&#…

PostgreSQL 插件 CREATE EXTENSION 原理

PostgreSQL 提供了丰富的数据库内核编程接口&#xff0c;允许开发者在不修改任何 Postgres 核心代码的情况下以插件的形式将自己的代码融入内核&#xff0c;扩展数据库功能。本文探究了 PostgreSQL 插件的一般源码组成&#xff0c;梳理插件的源码内容和实现方式&#xff1b;并介…

Apache Doris (四十七): Doris表结构变更-Schema变更

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

报错解决:libcudart.so和libprotobuf.so链接库未找到

报错解决&#xff1a;libcudart.so和libprotobuf.so链接库未找到 libcudart.so链接库未找到原因解决方法 libprotobuf.so链接库未找到原因解决方法 此博客介绍了博主在编译软件包时遇到的两个报错&#xff0c;主要是libcudart和libprotobuf两个动态链接库未找到的问题&#xff…

频繁full GC排查

场景&#xff1a;通过prometheus去拉取通过actuator组件暴露的端点中的JVM相关指标。通过告警规则&#xff0c;检测线上服务出现频繁full gc。 ((jvm_gc_pause_seconds_count{action"end of major GC",cause!"Heap Dump Initiated GC"}- jvm_gc_pause_sec…

显示屏没有信号monitor no signal from device

双屏幕总是有个屏幕连接不上&#xff0c;显示没有信号。 环境 win11 Dell dual monitor双屏 解决方法 检查电源有没有插好&#xff0c;HDMI或DP线有没有插好。如果仍然出现这个情况&#xff0c;试着更新一下驱动。 如果还是点不亮&#xff0c;那么关掉亮的那个显示屏。用…

前端开发技术栈(工具篇):详细介绍npm、pnpm和cnpm分别是什么,使用方法以及之间有哪些关系

目录 npm、pnpm和cnpm分别是什么 npm pnpm cnpm NPM包管理器 使用npm管理&#xff0c;创建/初始化项目 修改npm镜像&#xff08;npm源设置&#xff09; 基本命令 安装依赖项 下载特定版本的依赖 下载开发依赖 下载全局依赖&#xff08;全局安装&#xff09; 升级依…

redis分布式锁的应用

redis 作为分布式锁的东西 分布式锁的应用 redis,zk,数据库这些都可以实现分布式锁 我们今天主要基于redis实现的分布式锁&#xff0c;而且要求性能要好 基于一个小的业务场景来说&#xff0c;就比如说秒杀中的减库存&#xff0c;防止超卖这种代码就会有并发问题,比方说3个线程…

C++动态规划算法的应用:得到 K 个半回文串的最少修改次数 原理源码测试用例

本文涉及的基础知识点 动态规划 题目 得到 K 个半回文串的最少修改次数 给你一个字符串 s 和一个整数 k &#xff0c;请你将 s 分成 k 个 子字符串 &#xff0c;使得每个 子字符串 变成 半回文串 需要修改的字符数目最少。 请你返回一个整数&#xff0c;表示需要修改的 最少…

VS Code打造Julia IDE

文章目录 运行和调试Workspace绘图选项卡代码编辑 搜索并下载Julia插件后&#xff0c;左侧工具栏会出现Julia的三圆图标&#xff0c;点进去之后分为Workspace, Documentation以及Plot navigator三个子窗。 运行和调试 打开.jl文件后&#xff0c;其右上角会出现一个三角形的符…

【洛谷算法题】P3954-成绩【入门1顺序结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P3954-成绩【入门1顺序结构】&#x1f30f;题目背景&#x1f30f;题目描述&#…

【1++的Linux】之文件(三)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;磁盘结构二&#xff0c;磁盘的抽象结构三&#xff0c;文件系统四&#xff0c;文件的增删查改五&#xff0c;软硬链接六&#xff0c;动静态库1. **动态库和静…

Socket实现服务器搭建

一、前言&#xff1a; Socket上篇文章已经介绍过了 他是实现网络编程的基础 。 在服务器模型中通常都是多个客户端一个服务器端&#xff0c;那么服务器是如何处理多个客户端的请求&#xff1f; 1.顺序处理 依次处理--效率低下 2.并发处理 2.1 多线程并发&#xff08;线程池…

《向量数据库》——Zilliz X Dify.AI ,快速打造知识库 AI 应用

Zilliz 大模型生态矩阵再迎新伙伴!近日,Zilliz 和 Dify.AI 达成合作,Zilliz 旗下的产品 Zilliz Cloud、Milvus 与开源 LLMOps 平台 Dify 社区版进行了深度集成。 01. Zilliz Cloud v.s. Dify Dify 作为开源的 LLMs App 技术栈,在此前已支持丰富多元的大型语言模型的接入,…

解密Java中神奇的Synchronized关键字

文章目录 &#x1f389; 定义&#x1f389; JDK6以前&#x1f389; 偏向锁和轻量级锁&#x1f4dd; 偏向锁&#x1f4dd; 轻量级锁&#x1f4dd; 自旋锁&#x1f4dd; 重量级锁&#x1f525; 1. 加锁&#x1f525; 2. 等待&#x1f525; 3. 撤销 &#x1f389; 锁优化&#x1f…

将字符串中的数据按指定分隔符分割依次存入一维数组中 numpy.fromstring()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将字符串中的数据 按指定分隔符分割 依次存入一维数组中 numpy.fromstring() [太阳]选择题 请问以下代码中执行语句输出结果依次是&#xff1f; import numpy as np str1 "1.0 2.0 3.…

力扣第55题 跳跃游戏 c++ 贪心 + 覆盖 加暴力超时参考

题目 55. 跳跃游戏 中等 相关标签 贪心 数组 动态规划 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &…