当前位置: 首页 > news >正文

[MyBatis系列④]核心配置文件

目录

1、简介

2、DTD

3、typeHandlers

3.1、默认类型处理器

3.2、自定义类型处理器

4、plugins


⭐MyBatis系列①:增删改查

⭐MyBatis系列②:两种Dao开发方式

⭐MyBatis系列③:动态SQL

1、简介

MyBatis的核心配置文件(通常命名为mybatis-config.xml)是配置MyBatis框架的重要文件之一。

它定义了全局性的设置,包括数据库连接信息、对象关系映射(ORM)设置、插件配置、类型处理器等。

文档声明:

这部分内容是用于声明MyBatis核心配置文件的文档类型定义(DOCTYPE)。它告诉XML解析器如何解释这个XML文件。内容解释如下:

  1. <!DOCTYPE configuration:这部分表示这是一个文档类型声明,指定了文档的类型为configuration,也就是MyBatis的核心配置文件。
  2. PUBLIC "-//mybatis.org//DTD Config 3.0//EN":这是一个标识符,用于指定文档类型的公共标识符(Public Identifier)。在这里,-//mybatis.org//DTD Config 3.0//EN指定了MyBatis配置文件的版本和语言。
  3. "http://mybatis.org/dtd/mybatis-3-config.dtd":这是文档类型定义的系统标识符(System Identifier),它指定了DTD文件的位置。在这个例子中,它指向了MyBatis配置文件的DTD(Document Type Definition)文件的URL。

综合起来,这个文档类型声明告诉XML解析器如何解释这个XML文件,以及该XML文件遵循的DTD规范版本和位置。在这里,它指定了MyBatis核心配置文件的版本为3.0,并且使用MyBatis官方提供的DTD文件进行解析。

2、DTD

这段XML文件是一个DTD(Document Type Definition)文档,用于定义MyBatis的核心配置文件结构和元素的规范。这个DTD文件描述了MyBatis配置文件中可以使用的元素、属性以及它们之间的关系。

这个DTD文件中的注释和标签解释了各个元素的含义、属性和子元素。

元素

描述

configuration

根元素,表示MyBatis的配置信息,包括数据库连接、映射器配置等。

databaseIdProvider

数据库ID提供者元素,用于为不同数据库提供不同的配置。

properties

属性元素,用于设置全局属性,可以从外部资源加载。

property

属性元素,具有name和value属性,用于定义属性的名称和值。

settings

设置元素,用于定义全局设置。

setting

单个设置元素,具有name和value属性。

typeAliases

类型别名元素,用于定义Java类的别名。

typeAlias

类型别名元素,具有type和alias属性,用于定义类型别名。

typeHandlers

类型处理器元素,用于自定义类型处理器。

typeHandler

类型处理器元素,具有javaType、jdbcType和handler属性。

objectFactory

对象工厂元素,用于自定义对象的创建方式。

objectWrapperFactory

对象包装器工厂元素,用于自定义对象包装器。

reflectorFactory

反射器工厂元素,用于自定义反射器。

plugins

插件元素,用于添加插件拦截器。

plugin

插件元素,具有interceptor属性,指定插件拦截器的类名。

environments

数据库环境元素,用于定义事务管理器和数据源。

environment

环境元素,具有id属性,用于定义一个数据库环境。

transactionManager

事务管理器元素,用于定义事务管理器类型。

dataSource

数据源元素,用于定义数据源类型。

mappers

映射器元素,用于定义映射器配置。

mapper

映射器元素,具有resource、url和class属性,用于定义映射器文件的位置。

package

包元素,用于定义Java包。

这个DTD文件描述了MyBatis核心配置文件中可以使用的各种元素和属性,帮助开发者编写符合规范的配置文件。

3、typeHandlers

typeHandlers 是 MyBatis 配置文件中的一个元素,用于自定义处理数据库与 Java 类型之间的转换。

数据库和 Java 类型之间可能存在类型不匹配的情况,比如将数据库中的数字类型映射到 Java 中的枚举类型,或者处理日期时间的转换等。

typeHandlers 允许你编写自定义的类型处理器,以确保正确地在数据库与 Java 之间进行数据转换。

3.1、默认类型处理器

下表描述了一些默认的类型处理器:

类型处理器

对应的Java类型

对应的JDBC类型

BooleanTypeHandler

Boolean

数据库兼容的BOOLEAN

ByteTypeHandler

Byte

数据库兼容的NUMERIC或BYTE

ShortTypeHandler

Short

数据库兼容的NUMERIC或SHORT INTEGER

IntegerTypeHandler

Integer

数据库兼容的NUMERIC或INTEGER

LongTypeHandler

Long

数据库兼容的NUMERIC或LONG INTEGER

StringTypeHandler

String

VARCHAR, CHAR

DateTypeHandler

Date

DATE, TIMESTAMP

EnumTypeHandler

Enum

VARCHAR

ArrayTypeHandler

Array

ARRAY

MapTypeHandler

Map

MAP

ObjectTypeHandler

Object

VARIOUS

3.2、自定义类型处理器

可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。

具体做法为:

实现 org.apache.ibatis.type.TypeHandler 接口,或继承一个很便利的类org.apache.ibatis.type.BaseTypeHandler, 然

后可以选择性地将它映射到一个JDBC类型。

例如需求:一个Java中的Date数据类型,我想将其存到数据库的时候存成一个1970年至今的毫秒数,取出来时转换成java的Date,即java的Date与数据库的varchar毫秒值之间转换

开发步骤:

① 定义转换类继承类BaseTypeHandler<T>

② 覆盖4个未实现的方法:

其中setNonNullParameter为java程序设置数据到数据库的回调方法,getNullableResult为查询时 mysql的字符串类型转换成 java的Type类型的方法

③ 在MyBatis核心配置文件中进行注册

④ 测试转换是否正确

下面是代码实现:

编写转换类,继承BaseTypeHandler<T>,重写方法:

package com.xzl.handle;import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;/*** @author 逐梦苍穹* @date 2023/8/24 23:30* setNonNullParameter为java程序设置数据到数据库的回调方法* getNullableResult为查询时 mysql的字符串类型转换成 java的Type类型的方法* i 是一个整数,表示要设置的参数在 SQL 语句中的位置。* s 表示数据库列名*/
public class DateTypeHandle extends BaseTypeHandler<Date> {@Overridepublic void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {// 在预处理语句中设置非空参数// 将 Date 类型的数据转换为 long 类型的时间戳,并以字符串形式设置到 PreparedStatement 中preparedStatement.setString(i, date.getTime() + "");}@Overridepublic Date getNullableResult(ResultSet resultSet, String s) throws SQLException {// 从结果集中获取可空结果(根据列名)// 将结果集中的 long 类型的时间戳转换为 Date 类型并返回return new Date(resultSet.getLong(s));}@Overridepublic Date getNullableResult(ResultSet resultSet, int i) throws SQLException {// 从结果集中获取可空结果(根据列索引)// 将结果集中的 long 类型的时间戳转换为 Date 类型并返回return new Date(resultSet.getLong(i));}@Overridepublic Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {// 从存储过程的调用结果中获取可空结果// 直接获取存储过程的 Date 类型数据并返回return callableStatement.getDate(i);}
}

配置mybatis-config.xml

这一步配置要注意这个标签相对于其他标签的位置顺序,如果标签的相对位置不对,则会出现:

数据库表单和实体类要新增:

测试效果:

首先是测试存入时间戳到数据库中:

结果如下:

然后是测试将数据库中的时间毫秒值取出并且转换为正常的日期类对象:

结果如下:

4plugins

MyBatis可以使用第三方的插件来对功能进行扩展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据。

开发步骤:

导入通用PageHelper的坐标

<!-- 分页助手 -->
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>3.7.5</version>
</dependency>
<!-- sql解析 -->
<dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>0.9.1</version>
</dependency>

在mybatis核心配置文件中配置PageHelper插件

测试分页数据获取

关键代码:PageHelper.startPage(1,3);   表示当前在第一页、展现三条数据

如下:

获得分页相关的其他参数:

测试代码如下:

相关文章:

[MyBatis系列④]核心配置文件

目录 1、简介 2、DTD 3、typeHandlers 3.1、默认类型处理器 3.2、自定义类型处理器 4、plugins ⭐MyBatis系列①&#xff1a;增删改查 ⭐MyBatis系列②&#xff1a;两种Dao开发方式 ⭐MyBatis系列③&#xff1a;动态SQL 1、简介 MyBatis的核心配置文件&#xff08;通常命…...

系统架构设计高级技能 · 层次式架构设计理论与实践

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;二&#xff09;【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…...

Nuxt3打包部署到Linux(node+pm2安装和运行步骤+nginx代理)

最近&#xff0c;我们项目组的工作接近尾声&#xff0c;需要把项目部署上线。由于前端第一次使用Nuxt3框架&#xff0c;后端也是第一次部署Nuxt3项目&#xff0c;所以刚开始出现了很多问题。在我上网搜索很多教程后&#xff0c;得到了基本的流程。 1.服务器安装node.js环境 N…...

一维数组传参

在C语言中&#xff0c;可以通过指针来传递一维数组。一维数组实际上是指向数组首元素的指针&#xff0c;在函数中传递数组参数时&#xff0c;可以将数组名作为指针传递给函数。以下是一个示例&#xff1a; #include <stdio.h>void myFunction(int arr[], int size) {for…...

七层、四层和五层网络模型区别和联系

七层、四层和五层网络模型区别和联系 概述OSI网络7层模型&#xff08;概念型框架&#xff09;概述图片分析 四层模型概述常用协议OSI与TCP/IP四层的区别 五层模型概述三种网络模型对比 总结 概述 网络模型-七层模型&#xff08;OSI模型&#xff09;、五层协议体系结构和TCP/IP…...

RH1288V3 - 初识物理服务器

如果你拥有一台物理服务器(不是云服务器) 个人比较推荐你用物理服务器&#xff0c;虽然性能会比云要来的差&#xff0c;但是不用每月交钱上。云服务固然方便&#xff0c;但是几个核的性能和一点存储&#xff0c;想做一个动漫网站固然要很多mp4这种影视资源&#xff0c;云服务器…...

excel中如果A列中某项有多条记录,针对A列中相同的项,将B列值进行相加合并统计

excel中如果A列中某项有多条记录&#xff0c;针对A列中相同的项&#xff0c;将B列值进行相加合并统计。注意&#xff1a;B列的数据类型要为数字 如&#xff1a; 实现方法&#xff1a; C1、D1中分别输入公式&#xff0c;然后下拉 IF(COUNTIF($A$1:A1,A1)1, A1,"") …...

开发智能应用的新范式:大数据、AI和云原生如何构建智能软件

文章目录 1.利用大数据实现智能洞察2. 集成人工智能和机器学习3. 云原生架构的弹性和灵活性4. 实现实时处理和响应5. 数据安全和隐私保护6. 可解释性和透明性7. 持续创新和迭代8. 数据伦理和合规性 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &a…...

淘宝免费爬虫数据 商品详情数据 商品销售额销量API

场景&#xff1a;一个宽敞明亮的办公室&#xff0c;一位公司高管坐在办公桌前。 高管&#xff08;自言自语&#xff09;&#xff1a;淘宝&#xff0c;这个平台上商品真是琳琅满目&#xff0c;应该有不少销售数据吧。我该怎么利用这些数据呢&#xff1f; 突然&#xff0c;房间…...

Markdown初级使用指南

前言 大家好&#xff0c;我是艾老虎尤&#xff0c;我在一篇官方的文章中&#xff0c;我了解到了markdown&#xff0c;原本我写博客一直是使用的富文本编译器&#xff0c;之前我也有同学叫我使用MD&#xff0c;但是我嫌它复杂&#xff0c;就比如说一个标题&#xff0c;我在富文…...

国际版阿里云/腾讯云CDN装备运用教程:加快网站拜访速度

阿里云CDN装备运用教程&#xff1a;加快网站拜访速度 本文旨在为读者供给一个关于阿里云CDN的简要教程。咱们将介绍阿里云CDN的基本概念、资源加快过程、同步资源设置以及与阿里云OSS目标存储的结合。期望经过这篇教程&#xff0c;读者能够更好地了解和利用阿里云CDN服务&…...

面试之快速学习计算机网络-http

1. HTTP常见状态码 2. 3开头重定向&#xff0c;4开头客户端错误&#xff0c;5开头服务端错误 2. HTTP 报文 1. start-line&#xff1a;请求行&#xff0c;可以为以下两者之一&#xff1a; 请求行&#xff1a; GET /hello-world2.html HTTP/1.1状态行&#xff1a;HTTP/1.1 200…...

2023水果编曲软件fl studio 21.1.0 .3713官方中文直装破解版

fl studio 21.1.0 .3713官方中文直装破解版是一个完整的软件音乐制作环境或数字音频工作站&#xff08;DAW&#xff09;。它代表了 25 多年的创新发展&#xff0c;将您创作、编曲、录制、编辑、混音和掌握专业品质音乐所需的一切集于一身。 fl studio 21.1.0 .3713官方中文直装…...

【微信小程序】页面路由跳转函数之间的区别

微信小程序开发系列 文章目录 前言一、介绍1.wx.switchTab(Object object)2.wx.reLaunch(Object object)3.wx.redirectTo(Object object)4.wx.navigateTo(Object object)5.wx.navigateBack(Object object) 前言 在开发微信小程序中基本都会用到页面跳转&#xff0c;微信小程序…...

Ubuntu inotify

inotify 是一个用于监视文件系统事件的机制。它允许你监视文件或目录的变化,如文件的创建、修改、删除、移动等,以及目录的访问权限变化。 安装 在 Ubuntu 中,你需要安装 inotify-tools 包,这是一个包含 inotifywait 和 inotifywatch 等实用工具的软件包。你可以使用以下命…...

开始MySQL之路——MySQL的DataGrip图形化界面

下载DataGrip 下载地址&#xff1a;Download DataGrip: Cross-Platform IDE for Databases & SQL 安装DataGrip 准备好一个文件夹&#xff0c;不要中文和空格 C:\Develop\DataGrip 激活DataGrip 激活码&#xff1a; VPQ9LWBJ0Z-eyJsaWNlbnNlSWQiOiJWUFE5TFdCSjBaIiwibGl…...

C++ STL 标准模板库

C STL 标准模板库 标准容器 顺序容器 vector vector 向量容器 底层数据结构&#xff1a;动态开辟的数组&#xff0c;每次以原来空间大小的2倍进行扩容。采用allocator进行空间开辟和释放&#xff0c;对象创建和析构的分离。具体如C模板学习笔记中简要实现C中的vector。 增…...

C#-集合小例子

目录 背景&#xff1a; 过程: 1.添加1-100数: 2.求和: 3.平均值: 4.代码:​ 总结: 背景&#xff1a; 往集合里面添加100个数&#xff0c;首先得有ArrayList导入命名空间&#xff0c;这个例子分为3步&#xff0c;1.添加1-100个数2.进行1-100之间的总和3.求总和的平均值&…...

git保存删除的文件

查看pg源码的函数具体内容&#xff1a; https://doxygen.postgresql.org/resowner_8h.html#a7f01c9e9f97849f2859feabd913de1f8 git add 添加了多余文件 git add . 表示当前目录所有文件&#xff0c;不小心就会提交其他文件 git add 如果添加了错误的文件的话 撤销操作 g…...

【golang】go语句执行规则(goroutine)(下)

怎样才能让主goroutine等待其他goroutine&#xff1f; 上篇文章提到&#xff0c;一旦主 goroutine 中的代码执行完毕&#xff0c;当前的 Go 程序就会结束运行&#xff0c;无论其他的 goroutine 是否已经在运行了。那么&#xff0c;怎样才能做到等其他的 goroutine 运行完毕之后…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...