潍坊网站建设供应商/百度广告服务商
目录
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文件。内容解释如下:
- <!DOCTYPE configuration:这部分表示这是一个文档类型声明,指定了文档的类型为configuration,也就是MyBatis的核心配置文件。
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN":这是一个标识符,用于指定文档类型的公共标识符(Public Identifier)。在这里,-//mybatis.org//DTD Config 3.0//EN指定了MyBatis配置文件的版本和语言。
- "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
这一步配置要注意这个标签相对于其他标签的位置顺序,如果标签的相对位置不对,则会出现:
③数据库表单和实体类要新增:
④测试效果:
首先是测试存入时间戳到数据库中:
结果如下:
然后是测试将数据库中的时间毫秒值取出并且转换为正常的日期类对象:
结果如下:
4、plugins
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系列①:增删改查 ⭐MyBatis系列②:两种Dao开发方式 ⭐MyBatis系列③:动态SQL 1、简介 MyBatis的核心配置文件(通常命…...

系统架构设计高级技能 · 层次式架构设计理论与实践
系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA(一)【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估(二)【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…...

Nuxt3打包部署到Linux(node+pm2安装和运行步骤+nginx代理)
最近,我们项目组的工作接近尾声,需要把项目部署上线。由于前端第一次使用Nuxt3框架,后端也是第一次部署Nuxt3项目,所以刚开始出现了很多问题。在我上网搜索很多教程后,得到了基本的流程。 1.服务器安装node.js环境 N…...

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

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

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

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

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

淘宝免费爬虫数据 商品详情数据 商品销售额销量API
场景:一个宽敞明亮的办公室,一位公司高管坐在办公桌前。 高管(自言自语):淘宝,这个平台上商品真是琳琅满目,应该有不少销售数据吧。我该怎么利用这些数据呢? 突然,房间…...

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

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

面试之快速学习计算机网络-http
1. HTTP常见状态码 2. 3开头重定向,4开头客户端错误,5开头服务端错误 2. HTTP 报文 1. start-line:请求行,可以为以下两者之一: 请求行: GET /hello-world2.html HTTP/1.1状态行:HTTP/1.1 200…...

2023水果编曲软件fl studio 21.1.0 .3713官方中文直装破解版
fl studio 21.1.0 .3713官方中文直装破解版是一个完整的软件音乐制作环境或数字音频工作站(DAW)。它代表了 25 多年的创新发展,将您创作、编曲、录制、编辑、混音和掌握专业品质音乐所需的一切集于一身。 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) 前言 在开发微信小程序中基本都会用到页面跳转,微信小程序…...

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

开始MySQL之路——MySQL的DataGrip图形化界面
下载DataGrip 下载地址:Download DataGrip: Cross-Platform IDE for Databases & SQL 安装DataGrip 准备好一个文件夹,不要中文和空格 C:\Develop\DataGrip 激活DataGrip 激活码: VPQ9LWBJ0Z-eyJsaWNlbnNlSWQiOiJWUFE5TFdCSjBaIiwibGl…...

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

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

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

【golang】go语句执行规则(goroutine)(下)
怎样才能让主goroutine等待其他goroutine? 上篇文章提到,一旦主 goroutine 中的代码执行完毕,当前的 Go 程序就会结束运行,无论其他的 goroutine 是否已经在运行了。那么,怎样才能做到等其他的 goroutine 运行完毕之后…...

websocket 接收消息无法获取用户id
1.遇到问题 公司项目是基于ruoyi 框架快速搭建开发,使用多线程搜索查询,所以以用户区分任务,保证可以搜索任务和取消搜索,所以我这需要获得用户id,使用 SecurityUtils 共工工具类从请求头获取token,然后解…...

springboot通过sharding-dbc按年、月分片
目录 springboot通过sharding-dbc按年、月分片 1、引入pom依赖 2、application.yml配置 3、分片算法 4、注意事项 1、引入pom依赖 <!--shardingjdbc分片,和Druid不兼容,如果不使用sharding则需要注释--><dependency><groupId>org.…...

基于静电放电算法优化的BP神经网络(预测应用) - 附代码
基于静电放电算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于静电放电算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.静电放电优化BP神经网络2.1 BP神经网络参数设置2.2 静电放电算法应用 4.测试结果:5…...

开发者插件推荐FeHelper
开发者巨好用的插件、有很多功能比如json美化、对比,二维码/解码,图片转Base64,时间戳转换等 一、下载插件 1、打开网址:FeHelper - Awesome(建议用谷歌打开); 2、选择要下载的版本,…...

【MySQL】JSON 格式字段处理
MySQL 5.7 版本后已支持 JSON 格式,这虽是 MySQL 的一小步,但可以说是程序开发的一大步,再也不用将 JSON 内容塞到 VARCHAR 类型字段了,程序设计也会变得更加灵活。网上大多只针对JSONObject 对象类型,本文也将详解 JS…...

数据库选型<1>
数据库选型 1.SQL与NoSQL1.SQL2.NoSQL 2.各种数据存储的适应场景1.MySQL 3.构建MySQL开发环境 1.SQL与NoSQL 1.SQL 关系型数据库 MySQLOracleSQL serverPostGreSQL 关系型数据库的特点 数据结构化存储在二维表中(新增JSON存储方式,也有nosql的特点)支持事务的原子…...

1.Flink源码编译
目录 1.环境版本 1.1 jdk 1.2.maven 1.3.node 1.4.scala 2.下载flink源码 3.编译源码 4.idea打开flink源码 5.运行wordcount 1.环境版本 软件地址 链接:https://pan.baidu.com/s/1ZxYydR8rBfpLCcIdaOzxVg 提取码:12xq 1.1 jdk 1.2 maven 1.…...

Linux内核数据结构 散列表
1、散列表数据结构 在Linux内核中,散列表(哈希表)使用非常广泛。本文将对其数据结构和核心函数进行分析。和散列表相关的数据结构有两个:hlist_head 和 hlist_node //hash桶的头结点 struct hlist_head {struct hlist_node *first…...

数据库系统课设——基于python+pyqt5+mysql的酒店管理系统(可直接运行)--GUI编程
几个月之前写的一个项目,通过这个项目,你能学到关于数据库的触发器知识,python的基本语法,python一些第三方库的使用,包括python如何将前后端连接起来(界面和数据),还有界面的设计等…...

《C和指针》笔记9: typedef
C语言支持一种叫作typedef的机制,它允许你为各种数据类型定义新名字。typedef声明的写法和普通的声明基本相同,只是把typedef这个关键字出现在声明的前面。例如,下面这个声明: char *ptr_to_char;把变量ptr_to_char声明为一个指向…...