[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.hqwc.cn/news/83858.html

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

相关文章

三极管NPN、PNP的区别及简单应用

目录 一、NPN、PNP三极管的概念 二、NPN、PNP三极管的区别 三、三极管NPN、PNP的简单应用 一、NPN、PNP三极管的概念 NPN型三极管&#xff1a; 由两块N型半导体和一块P型半导体组成&#xff0c;P型半导体在中间&#xff0c;两块N型半导体在两侧。 三极管是电子电路中最重要的…

一、Kafka概述

目录 1.1 定义1.2 消息队列1、传统消息队列的应用场景2、消息队列的两种模式 1.3 Kafka的基础架构 1.1 定义 Kafka传 统定义&#xff1a;Kafka是一个分布式的基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域。 K…

如何搭建智能家居系统并通过内网穿透实现远程控制家中设备

文章目录 前言1. 安装Home Assistant2. 配置Home Assistant3. 安装cpolar内网穿透3.1 windows系统3.2 Linux系统3.3 macOS系统 4. 映射Home Assistant端口5. 公网访问Home Assistant6. 固定公网地址6.1 保留一个固定二级子域名6.2 配置固定二级子域名 前言 Home Assistant&…

重要通知:9月1日起,微信小程序须完成备案后才可上架

微信官方通知 近日&#xff0c;工信部发布了《工业和信息化部关于开展移动互联网应用程序备案工作的通知》&#xff0c;8月9日&#xff0c;微信公众平台也发布了“关于开展微信小程序备案的通知”&#xff1a; 一、备案必要性 在中华人民共和国境内从事互联网信息服务的移动互…

机器学习深度学习——NLP实战(自然语言推断——注意力机制实现)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——NLP实战&#xff08;自然语言推断——数据集&#xff09; &#x1f4da;订阅专栏&#xff1a;机器学习&…

自制编程语言基于c语言实验记录之二:总结三四五六七章之编译类定义

博客前言 由于本书第六七章是编译脚本语言sparrow生成指令、虚拟机运行指令的核心章节&#xff0c;需要连在一起理解&#xff0c;同时三四五章都是六七章的铺垫&#xff0c;所以专门写多篇博客来记录六七章。 同时本书相比《操作系统真相还原》缺少具体例子很难梳理项目整体代…

万界星空科技/免费MES系统/免费质量检测系统

质量管理也是万界星空科技免费MES中的一个重要组成部分&#xff0c;旨在帮助制造企业实现全面的质量管理。该系统涵盖了供应商来料、生产过程、质量检验、数据分析等各个环节&#xff0c;为企业提供了一站式的质量管理解决方案。 1. 实时质量监控 质量管理能够实时监控生产过程…

EasyPOI 实战总结

EasyPOI实战总结 简介 easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法 使用EasyPOI 环境搭建 # 1.引入相关依…

c++--动态规划回文串问题

1.回文子串 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定一个字符串 s &#xff0c;请计算这个字符串中有多少个回文子字符串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视作不同的子串。 示…

C++:构造方法(函数);拷贝(复制)构造函数:浅拷贝、深拷贝;析构函数。

1.构造方法(函数) 构造方法是一种特殊的成员方法&#xff0c;与其他成员方法不同: 构造方法的名字必须与类名相同&#xff1b; 无类型、可有参数、可重载 会自动生成&#xff0c;可自定义 一般形式:类名(形参)&#xff1b; 例: Stu(int age); 当用户没自定义构造方法时&…

iOS App逆向之:iOS应用砸壳技术

在iOS逆向&#xff0c;有一项关键的技术叫做“iOS砸壳”&#xff08;iOS App Decryption&#xff09;。自iOS 5版本以来&#xff0c;苹果引入了应用程序加密机制&#xff0c;使得大部分应用都需要进行砸壳操作才能进行逆向分析。因此作为开发者、逆向工程师和安全研究人员都需要…

器件介绍TMP1826NGRR、TMP1826DGKR、TMP1827NGRR、TMP1075NDRLR数字温度传感器

一、TMP1826 具有 2Kb EEPROM 的 1-Wire、0.2C 精度温度传感器 器件介绍 TMP1826 是一款高精度、1-Wire 兼容的数字输出温度传感器&#xff0c;具有集成的 2Kb EEPROM 和 –55C 至150C 的宽工作温度范围。TMP1826 在 10C 至45C 的温度范围内提供 0.1C&#xff08;典型值&#…