【MyBatis持久层框架】核心配置文件详细解读

news2024/12/28 20:57:00

文章目录

  • 1. 前言
  • 2. 多环境配置
  • 3. 类型别名
  • 4. 对象工厂
  • 5. 总结

1. 前言

前面我们在使用 MyBatis 开发时,编写核心配置文件替换 JDBC 中的连接信息,解决了 JDBC 硬编码的问题。其实,MyBatis 核心配置文件中还可以配置很多的内容。

image-20230126224012568

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。配置文档的顶层结构如下:

image-20230129134802206

今天这篇文章一起来探讨 MyBatis 的核心配置文件中一些基本问题,具体的信息和使用教程参考 MyBatis 官网。

2. 多环境配置

我们把数据库的连接信息配置在 XML 核心配置文件中,这个解决了 JDBC 硬编码的问题。在核心配置文件的 <enviroments> 标签中使用 default='环境id' 属性指定使用哪一段 <enviroment> 配置,id 是这一段 <enviroment> 的唯一标识。

示例:

<environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--数据库连接信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/blog?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="abc123"/>
            </dataSource>
        </environment>

        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--数据库连接信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/blog?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="abc123"/>
            </dataSource>
        </environment>
    </environments>

注意:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。 所以,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,以此类推。

3. 类型别名

前面入门文章中说到,在映射配置文件中的 resultType 属性需要配置类的全限定名,例如:

<mapper namespace="org.chengzi.mapper.UserMapper">
    <select id="selectAll" resultType="org.chengzi.pojo.Student">
        select * from tb_user;
    </select>
</mapper>

但是这样的书写方式是麻烦的,不方便的。所以 MyBatis 提供了 typeAliases 类型别名的方式简化这部分的书写。

要使用类型别名的方式,只需要在核心配置文件中添加以下内容:

<typeAliases>
      <package name="org.chengzi.pojo"/>
</typeAliases>

此操作相当于给 pojo 包中的所有类起别名,这个别名就是小写字母开头的类名,例如上面的 pojo 。此方法适用于在没有使用注解的情况下,如果使用了注解,别名就是其注解值,如下:

@Alias("author")
public class Author {
    ...
}

当然你还可以使用下面的方式给 Java 类设置一个别名,仅适用于 XML 配置文件,目的是降低冗余的全限定类名的书写。例如:

<typeAliases>
    <tyoeAlias alias="Student" type="org.chengzi.pojo"/>
</typeAliases>

4. 对象工厂

每次 MyBatis 创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现。比如:

// ExampleObjectFactory.java
public class ExampleObjectFactory extends DefaultObjectFactory {
  @Override
  public <T> T create(Class<T> type) {
    return super.create(type);
  }

  @Override
  public <T> T create(Class<T> type, List<Class<?>> constructorArgTypes,   List<Object> constructorArgs) {
    return super.create(type, constructorArgTypes, constructorArgs);
  }

  @Override
  public void setProperties(Properties properties) {
    super.setProperties(properties);
  }

  @Override
  public <T> boolean isCollection(Class<T> type) {
    return Collection.class.isAssignableFrom(type);
  }
}
<!-- mybatis-config.xml -->
<objectFactory type="org.mybatis.example.ExampleObjectFactory">
  <property name="someProperty" value="100"/>
</objectFactory>

ObjectFactory 接口很简单,它包含两个创建实例用的方法,一个是处理默认无参构造方法的,另外一个是处理带参数的构造方法的。另外,setProperties 方法可以被用来配置 ObjectFactory,在初始化你的 ObjectFactory 实例后, objectFactory 元素体中定义的属性会被传递给 setProperties 方法。

5. 总结

这里只是 MyBatis 核心配置文件中的“冰山一角”,具体信息可以阅读官方文档,但是需要注意的 MyBatis 配置文件中各项配置有其顺序,不可以书写混乱的配置文件。如图:

image-20230129134802206

下期见。

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

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

相关文章

微信小程序java+nodejs+vue校园美食点餐评论餐饮配送系统

开发语言&#xff1a;Java 小程序前端框架&#xff1a;uniapp 小程序运行软件&#xff1a;微信开发者 后端技术:Ssm(SpringSpringMVCMyBatis)vue.js 后端开发环境:idea/eclipse 数据库:mysql 基于校园餐饮配送小程序的设计基于现有的手机&#xff0c;可以实现首页、个人中心、学…

[JavaWeb]JS

目录1.JavaScript特点2. script 标签写JS代码2.1 script 标签中写JS代码2.2 使用 script 标签引入 JS 文件2.3 使用 js 的两种方式,是二选一,不能混用3. 查看 JS 错误信息3.1 chrome 浏览器查看错误信息3.2 Microsoft Edge浏览器查看错误信息4.JS变量4.1 var定义变量4.2 JavaSc…

Go 基础Interface

Go Interface 今天学习下Golang语言中Interface基本语法与使用&#xff0c;通过代码示例了解Go编程中的接口及其实现。跟Java语言类似&#xff0c;在Go编程中&#xff0c;开发者可以使用接口来存储一组没有实现的方法。也就是说&#xff0c;接口的方法不会有方法体。 接口定义…

谷歌正开发苹果AirTag的竞品,但苹果Find My需求强劲

据安卓爆料专家 Mishaal Rahman 的消息&#xff0c;谷歌似乎正在开发苹果 AirTag 的竞品。 从图中可以看到&#xff0c;谷歌 Fast Pair 蓝牙快速配对中&#xff0c;出现了一个名为“Locator tag&#xff08;定位器标签&#xff09;”的分类&#xff0c;这一类别此前没有出现过…

RXXW300/汇川MD500变频器MODBUS通信应用指导手册

本篇博客属于工具文档篇,方便大家查询通信相关的参数和MODBUS地址,有关PLC的MODBUS通信大家可以参看下面的文章链接: PLC MODBUS通信优化、提高通信效率避免权限冲突(程序+算法描述)_RXXW_Dor的博客-CSDN博客_modbus读写冲突MODBUS通讯非常简单、应用也非常广泛,有些老生…

51单片机多路电压检测数码管显示( proteus仿真+程序+报告+讲解视频)

51单片机多路电压检测数码管显示演示视频1.主要功能&#xff1a;2.仿真3. 程序4.设计报告系统需求及方案设计5. 设计资料内容清单51单片机多路电压检测数码管显示( proteus仿真程序报告讲解视频&#xff09;仿真图proteus 7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程…

MySQL从入门到精通(第二篇):MySQL的底层原理及其结构,结合多篇文章

Mysql进阶一、事务ACIDAUTOCOMMIT二、并发一致性问题1. 修改丢失三、封锁1. 封锁粒度2. 封锁类型读写锁意向锁3. 封锁协议1. 一级封锁协议2. 二级封锁协议3. 三级封锁协议4. 两段锁协议a. 概念b. 例子c. 两段锁是可串行化的充分条件d. 两段锁与死锁四、MySQL系统变量1. 查看系统…

苏嵌实训——day18

文章目录一 wirkeshark 抓包工具1.1 软件介绍1.2 软件安装1.3 wireshark工具的使用1.4 TCP三次握手和四次挥手二 TCP循环服务器2.1 IO多路复用2.2 使用select实现IO多路复用2.3 epoll一 wirkeshark 抓包工具 1.1 软件介绍 wireshark用于抓取经过我当前主机网卡的所有的数据包…

ffmpeg解封、解码实战

1 概述 2 解封装相关函数接口 avformat_alloc_context();负责申请一个AVFormatContext结构的内存,并进行简单初始化 avformat_free_context();释放该结构里的所有东西以及该结构本身 avformat_close_input();关闭解复用器。 avformat_open_input();打开输入视频文件 avformat_…

在elasticsearch中简单的使用script_fields

文章目录1、背景2、准备数据2.1 mapping2.2 插入数据3、案例3.1 格式化性别 1-男 2-女 -1-未知 如果不存在sex字段&#xff0c;则显示-- 其余的显示 **3.1.1 dsl3.1.2 java代码3.1.3 运行结果3.2 判断用户是否有某个爱好3.2.1 dsl3.2.2 java代码3.2.3 运行结果3.3 统计湖北的用…

Oracle 程序被编译后自动增加了AUTHID CURRENT_USER授权

目录 背景 原因&#xff1a; 解决方法 背景 今天遇到一个大坑&#xff0c;新建的一个数据库用户调用apps下的程序包&#xff0c;程序反馈未授权无法使用。 但是DBA确认已经给了授权。 查询授权表也是有正确授权的&#xff0c;但就是显示无效授权。 后来debug进去&#x…

外汇k线图经典图解:穿头破脚

从事外汇、黄金交易怎么能不懂K线图&#xff0c;学看K线图怎么能不把一些经典图解铭记心中呢&#xff1f;它们就好比字典和工具书&#xff0c;当投资者在解读行情时遇到任何困惑&#xff0c;都能从这些经典中得到指引&#xff0c;从而指明自己的投资方向。今天&#xff0c;小编…

java ssm校园二手书交易平台idea

该网站从实际运用的角度出发&#xff0c;运用了计算机网站设计、数据库等相关知识&#xff0c;网络和Mysql数据库设计来实现的&#xff0c;网站主要包括学生注册、学生登录、浏览图书、搜索图书、查看图书并进行购买&#xff0c;对购买的图书进行确认收货、退款退货、查看个人信…

Elasticsearch连续剧之实战篇Java操作es

作者&#xff1a;狮子也疯狂 专栏&#xff1a;《es》 坚持做好每一步&#xff0c;幸运之神自然会驾凌在你的身上 目录一、&#x1f407;前言二、&#x1f407;原生JAVA操作ES_搭建项目Ⅰ、创建项目Ⅱ、索引操作2.1 创建空索引2.2 给索引添加结构2.3 删除索引Ⅲ、文档操作3.1 新…

vCloud删除OVDC网络时提示被vApp网络使用无法删除

环境 VMware Cloud Director 版本:10.3.2.19375051 现象 在vCloud租户视图删除OVDC网络,提示被vApp网络使用,无法删除。此时通过查看vApp发现并没有残留vApp网络。 解决办法 1、登录vCloud数据库: 登录方法可以参考:VMware Cloud Director数据库操作 2、查逻辑网络: …

CAN接口电路设计

CAN总线的全称是控制器局域网络&#xff0c;主要应用在汽车电子和工业控制领域。和485总线一样&#xff0c;CAN总线也是一种半双工的通信。一条CAN总线最多能接110个节点它最高速率能到1Mbps&#xff0c;最远传输距离能到10KMCAN总线有两个信号&#xff0c;一个是CANH&#xff…

如何在 Linux 命令行中优雅的格式化输出 xml,记住这三种方法!

xml&#xff08;可扩展标记语言&#xff09;也是一种人类可读的标记语言&#xff0c;但是如同 json 文件一样&#xff0c;没有缩进格式&#xff08;或者压缩&#xff09;的 xml 文件&#xff0c;读起来那是挺头疼的。 首先来看一下我们这篇文章要达到的目的&#xff0c;如下图…

代码随想录训练营第十七天|110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和

110.平衡二叉树 看完题后的思路 int[] f(root)if rootnull return [true,0]left[]f(root.left) if(!left[0]){return [false,-1]} right[]f(root.right) if(!right[0]){return [false,-1]} return[true,math.max(left[1],right[1])1] 思路 上面的过程弄复杂了&#xff0c;其…

Elasticsearch 入门到精通-Elasticsearch核心倒排索引数据结构

Elasticsearch 简介Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。Elasticsearch 建立在全文搜索引擎 Apache Lucene™ 基础上&#xff0c;通过 Lucene 的倒排索引技术实现比关系型数据库更快的过滤&#xff0c;从而很方便的使大量数据具有搜索、分析和探索…

vue插槽之插槽的用法及作用域插槽详解

目录前言一&#xff0c;插槽的基本使用1.1 引出插槽1.2 插槽的基本使用1.3 默认插槽1.4 插槽样式二&#xff0c;具名插槽2.1 引出具名插槽2.2 具名插槽的使用三&#xff0c;template标签3.1 引出template标签3.2 template标签的使用四&#xff0c;作用域插槽4.1 引出作用域插槽…