[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);   表示当前在第一页、展现三条数据

如下:

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

测试代码如下:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3D WEB轻量化引擎HOOPS产品助力NAPA打造船舶设计软件平台

NAPA&#xff08;Naval Architectural PAckage&#xff0c;船舶建筑包&#xff09;&#xff0c;来自芬兰的船舶设计软件供应商&#xff0c;致力于提供世界领先的船舶设计、安全及运营的解决方案和数据分析服务。NAPA拥有超过30年的船舶设计经验&#xff0c;年营业额超过2560万欧…

Rspack 创建 vue2/3 项目接入 antdv(rspack.config.js 配置 less 主题)

一、简介 Rspack CLI 官方文档。 rspack.config.js 官方文档。 二、创建 vue 项目 创建项目&#xff08;文档中还提供了 Rspack 内置 monorepo 框架 Nx 的创建方式&#xff0c;根据需求进行选择&#xff09; # npm 方式 $ npm create rspacklatest# yarn 方式 $ yarn create…

Linux 终端命令之文件目录操作,对比Dos相关命令

目录 前言 基础命令&#xff08;文件目录相关的&#xff09; cd命令 【英文帮助】 【对应Dos命令】 pwd命令 【英文帮助】 【对应Dos命令】 ls命令 【英文帮助】 【对应Dos命令】 tree命令 【英文帮助】 【对应Dos命令】 mkdir命令 【英文帮助】 【对应Dos命令…

718. 最长重复子数组

718. 最长重复子数组 原题链接&#xff1a;完成情况&#xff1a;题解&#xff1a;方法一&#xff1a;动态规划方法二&#xff1a;滑动窗口方法三&#xff1a;二分查找 哈希 原题链接&#xff1a; 718. 最长重复子数组 https://leetcode.cn/problems/maximum-length-of-repe…

二甲医院信息管理系统源码 his系统源码 java+Angular+JavaScript

云HIS系统采用SaaS软件应用服务模式&#xff0c;提供软件应用服务多租户机制&#xff0c;实现一中心部署多机构使用。主要包含收费计费、药品管理、门诊医生工作站、住院医生工作站、护士工作站、数据统计、电子病历、医保接口等功能&#xff0c;能够满足医院及诊所日常业务开展…

人力资源小程序的设计方案与实现

随着互联网的发展&#xff0c;人才招聘已经成为许多企业的一项重要任务。为了提高招聘效率和便利求职者&#xff0c;许多企业开始采用小程序作为招聘平台。本文将为大家介绍一个搭建本地人才招聘网小程序的实用指南。 首先&#xff0c;我们需要登录【乔拓云】制作平台&#xff…

GNU-gcc编译选项-1

include目录 -I &#xff0c;比如: -I. -I ./Platform/include -I ./Platform/include/prototypes -I ./tpm/include -I ./tpm/include/prototypes -I ./Simulator/include -I ./Simulator/include/prototypes 编译选项 在GCC编译器中&#xff0c;-D是一个编译选项&…

基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v7.0版已发布

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持 UDP 、TCP 、WebSocket 三种协议&#xff0c;支持 iOS、Android、H5、标准Java、小程序、Uniapp&#xff0c;服务端基于Netty编写。 工程…

区分什么是Java内存模型(JMM)和 JVM运行时数据区

文章目录 一、概念区分1、什么是内存模型&#xff1f;什么是&#xff08;内存区域&#xff09;运行时数据区&#xff1f;2、为什么要有Java内存模型&#xff1f;2.1、硬件的效率与一致性2.2、 CPU和缓存的一致性2.2.1、为什么需要CPU cache&#xff1f;2.2.2、三级缓存&#xf…

Redis知识点总结

概述 Redis诞生于2009年&#xff0c;全称是Remote Dictionarty Server(远程词典服务器) 只支持单线程 非关联&#xff1a;主要指的是表中没有主外键等概念 Redis是一款内存数据库&#xff0c;主要存储键值对类型的数据 基本用法 注意&#xff1a;该操作是在cli中进行的 首…

【MySQL系列】统计函数(count,sum,avg)详解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

【面向大一新生IT技术社群招新啦,不来瞅瞅?】

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生 &#x1f43b;‍❄️个人主页&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;落798. &#x1f54a;️系列专栏&#xff1a;【零基础学java】 ----- 【重识c语言】 ---- 【计算机网络】—【Spri…

接口测试时遇到接口加密了该如何处理?

对明文编码生成信息摘要&#xff0c;以防止被篡改。比如MD5使用的是Hash算法&#xff0c;无论多长的输入&#xff0c;MD5都会输出长度为128bits的一个串。摘要算法不要秘钥&#xff0c;客户端和服务端采用相同的摘要算法即可针对同一段明文获取一致的密文。 对称加密 对称加密…

设计模式之工厂模式(万字长文)

文章目录 概述工厂模式的优点包括工厂模式有几种主要的变体看一个具体需求使用传统的方式来完成传统的方式的优缺点 简单工厂模式基本介绍使用简单工厂模式简单工厂模式的优缺点优点&#xff1a;缺点&#xff1a; 工厂方法模式看一个新的需求思路 1思路 2工厂方法模式介绍工厂方…

macOS上编译obs-studio

前言 最近基于obs的1个二开程序&#xff0c;需要移植到macOS平台上&#xff0c;由于遇到些问题&#xff0c;本文记录下如何在macOS上配置&编译&运行obs程序完整过程。 下载 首先下载cmake-gui工具&#xff0c;下载CMAKE&#xff0c;选择对应macOS平台的cmake版本&…

【ArcGIS微课1000例】0074:ArcGIS热点分析(Getis-Ord Gi*)---犯罪率热点图

严重声明:本文来自专栏《ArcGIS微课1000例:从点滴到精通》,为CSDN博客专家刘一哥GIS原创,原文及专栏地址为:(https://blog.csdn.net/lucky51222/category_11121281.html),谢绝转载或爬取!!! 文章目录 一、热点分析工具介绍二、ArcGIS热点分析案例1. 普通热点分析2. 加…

【ArcGIS微课1000例】0072:如何生成空间权重矩阵

严重声明:本文来自专栏《ArcGIS微课1000例:从点滴到精通》,为CSDN博客专家刘一哥GIS原创,原文及专栏地址为:(https://blog.csdn.net/lucky51222/category_11121281.html),谢绝转载或爬取!!! 文章目录 一、空间权重矩阵工具介绍二、ArcGIS生成空间权重矩阵三、注意事项…

从零开始配置Jenkins与GitLab集成:一步步实现持续集成

在软件开发中&#xff0c;持续集成是确保高效协作和可靠交付的核心实践。以下是在CentOS上安装配置Jenkins与GitLab集成的详细步骤&#xff1a; 1.安装JDK 解压JDK安装包并设置环境变量&#xff1a; JDK下载网址 Java Downloads | Oracle 台灣 tar zxvf jdk-11.0.5_linux-x64_b…

设计模式三原则

1.1单一职责原则 C 面向对象三大特性之一的封装指的就是将单一事物抽象出来组合成一个类&#xff0c;所以我们在设计类的时候每个类中处理的是单一事物而不是某些事物的集合。 设计模式中所谓的单一职责原则&#xff0c;就是对一个类而言&#xff0c;应该仅有一个引起它变化的原…

怎么借助ChatGPT处理数据结构的问题

目录 使用ChatGPT进行数据格式化转换 代码示例 ChatGPT格式化数据提示语 代码示例 批量格式化数据提示语 代码示例 ChatGPT生成的格式化批处理代码 使用ChatGPT合并不同数据源的数据 合并数据提示语 自动合并数据提示语 ChatGPT生成的自动合并代码 结论 数据合并是…