MyBatis中的日志和映射器说明

1.MyBatis中的日志

1.1 什么是日志

​ 在我们编写应用的时候,有一些信息需要及时查看,查看的时候有时需要输出到控制台,有时需要输出到文件。MyBatis也需要日志,一般情况下,使用log4j进行日志管理。

1.2 在MyBatis中使用日志的步骤

1、引入日志的依赖

​ MyBatis默认要引入日志,如果不引入日志就会产生错误,如果引入了日志,但是不对日志进行配置,就会出现警告。

<!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>

2、日志的级别

log4j在使用的时候需要进行配置,配置的时候一般对日志分为6个级别

级别(从低到高)描述适用场景
TRACE提供最详细的程序执行跟踪信息,用于细粒度调试。开发阶段深度排查问题,生产环境通常关闭。
DEBUG记录调试信息,帮助开发者了解程序运行细节(如变量值、流程节点)。开发和测试环境,用于定位问题。
INFO输出程序运行的关键状态信息(如启动完成、重要操作记录)。生产环境监控运行状态,记录关键流程。
WARN提示潜在问题或非预期情况,但不会导致程序中断(如配置缺失、性能下降警告)。需关注但非紧急的问题,提醒运维排查。
ERROR记录错误事件,可能导致部分功能失效但程序仍可运行(如数据库连接超时、外部接口异常)。生产环境错误监控,需及时处理。
FATAL记录致命错误,导致程序无法继续运行(如内存溢出、系统崩溃)。需立即终止程序并紧急修复的严重问题。

输出目标一般是控制台和文件:

  1. console:控制台
  2. file:文件

3、对日志进行配置

1.log4j.appender.console是相关的设置的名字,后面的参数是真正的配置
2.org.apache.log4j.ConsoleAppender:日志的实现类,该类输出到控制台
3.org.apache.log4j.PatternLayout:日志输出布局的实现类
4. [%c]-%m%n:日志输出的格式化

配置代码,配置文件名必须使用log4j.properties,位置放在resources包下

#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/mybatis.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

2.MyBatis映射器说明

2.1 简介

映射器是 MyBatis 中最重要的文件,文件中包含一组 SQL 语句(例如查询、添加、删除、修改),这些语句称为映射语句或映射 SQL 语句。

映射器由 Java 接口和 XML 文件(或注解)共同组成,它的作用如下。

  • 定义参数类型
  • 配置缓存
  • 提供 SQL 语句和动态 SQL
  • 定义查询结果和 POJO 的映射关系

映射器有以下两种实现方式。

  • 通过 XML 文件方式实现,比如我们在 mybatis-config.xml 文件中描述的 XML 文件,用来生成 mapper。
  • 通过注解的方式实现,使用 Configuration 对象注册 Mapper 接口

如果 SQL 语句存在动态 SQL 或者比较复杂,使用注解写在 Java 文件里可读性差,且增加了维护的成本。所以一般建议使用 XML 文件配置的方式,避免重复编写 SQL 语句。

2.2 XML实现映射器

XML 定义映射器分为两个部分:接口和XML。利用映射器实现增删改查会在下文详细介绍,后续会贴上链接地址

mapper文件标签顺序说明:

<!ELEMENT mapper (cache-ref | cache | resultMap* | parameterMap* | sql* | insert* | update* | delete* | select* )+>
  • !ELEMENT mapper:声明了一个节点,该节点是xml的根节点。

  • ( ):代表节点里应该有哪些子节点。

  • |:代表子节点没有前后顺序,也可以有或者没有。

  • *:代表子节点可以没有,也可以有多个

  • ?:代表最多只能有一个。

namespace 用来定义命名空间,该命名空间和定义接口的全限定名一致。

<select> 元素表明这是一条查询语句,属性 id 用来标识这条 SQL。resultType 表示返回的是一个 Student 类型的值。

namespace的前缀必须是包名,后面的命名必须和接口的命名一样。

在 MyBatis 配置文件中添加以下代码。

 <package name="org.example.mapper"/>             

该语句用来引入 XML 文件,MyBatis 会读取对应 XxxMapper.xml 文件,生成映射器。

2.3 注解实现映射器

使用注解的方式实现映射器,只需要在接口中使用 Java 注解,注入 SQL 即可。如下所示。

public interface StudentMapper {@Select(value = "select * from Student")public List<Website> select();
}               

这里我们使用了 @Select 注解,并且注入了和 XML 中相同的 select 语句。

注意:

1.如果使用注解和 XML 文件两种方式同时定义,会报id重复的异常。

2.虽然这里注解的方式看起来比 XML 简单,但是现实中我们遇到的 SQL 会比该例子复杂得多。如果 SQL 语句中有多个表的关联、多个查询条件、级联、条件分支等,显然这条 SQL 就会复杂的多,所以并不建议读者使用这种方式。比如下面这条 SQL。

select * from t_user u
left join t_user_role ur on u.id = ur.user_id
left join t_role r on ur.role_id = r.id
left join t_user_info ui on u.id = ui.user_id
left join t_female_health fh on u.id = fh.user_id
left join t_male_health mh on u.id = mh.user_id
where u.user_name like concat('%', ${userName},'%')
and r.role_name like concat('%', ${roleName},'%')
and u.sex = 1
and ui.head_image is not null;       

如果把以上 SQL 放到 @Select 注解中,无疑会大大降低代码的可读性。如果同时还要考虑使用动态 SQL 或需要加入其他的逻辑,这样就使得这个注解更加复杂了,不利于日后的维护和修改。

此外,XML 可以相互引入,而注解是不可以的,所以在一些比较复杂的场景下,使用 XML 方式会更加灵活和方便。因此大部分的企业都以 XML 为主,本教程也会保持一致,以 XML 方式来创建映射器。当然在一些简单的表和应用中使用注解方式也会比较简单。

这个接口可以在 XML 中定义,将在 mybatis-config.xml 中配置 XML 的语句修改为以下语句即可。

<mapper resource="com/mybatis/mapper/WebsiteMapper2" />  

也可以使用 configuration 对象注册这个接口,比如:

configuration.addMapper(WebsiteMapper2.class);

2.4 MyBatis 映射器的主要元素

下面介绍在映射器中可以定义哪些元素,以及它们的作用。

元素名称描述备注
mapper映射文件的根节点,只有 namescape 一个属性namescape 作用如下:①用于区分不同的 mapper,全局唯一②绑定DAO接口,即面向接口编程。当 namescape 绑定某一接口后,可以不用写该接口的实现类,MyBatis 会通过接口的完整限定名查找到对应的 mapper 配置来执行 SQL 语句。因此 namescape 的命名必须要跟接口同名。
select查询语句,最常用、最复杂的元素之一可以自定义参数,返回结果集等
insert插入语句执行后返回一个整数,代表插入的条数
update更新语句执行后返回一个整数,代表更新的条数
delete删除语句执行后返回一个整数,代表删除的条数
parameterMap定义参数映射关系即将被删除的元素,不建议使用
sql允许定义一部分的 SQL,然后在各个地方引用它例如,一张表列名,我们可以一次定义,在多个 SQL 语句中使用
resultMap用来描述数据库结果集与对象的对应关系,它是最复杂、最强大的元素提供映射规则
cache配置给定命名空间的缓存-
cache-ref其它命名空间缓存配置的引用-

拓展

关于 MyBatis 的 SQL 映射文件中的 mapper 元素的 namescape 属性有如下要求。

  • namescape 的命名必须跟某个 DAO 接口同名,同属于 DAO 层,因此代码结构上,映射文件与该接口应放置在同一 package 下(如org.example.mapper),并且习惯上是以 Mapper
    结尾(如StudentMapper.java、TeacherMapper.xml)。
  • 不同的 mapper 文件中子元素的 id 可以相同,MyBatis 通过 namescape 和子元素的 id 联合区分。接口中的方法与映射文件中的 SQL 语句 id 应一 一对应。

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

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

相关文章

vim修改只读文件

现象 解决方案 对于有root权限的用户&#xff0c;在命令行输入 :wq! 即可强制保存退出

UML顺序图的建模方法及应用示例

《UML 2.5基础、建模与设计实践》(李波&#xff0c;姚丽丽&#xff0c;朱慧)【摘要 书评 试读】- 京东图书 顺序图是强调消息时间顺序的交互图&#xff0c;它描述了对象之间传送消息的时间顺序&#xff0c;用于表示用例中的行为顺序。顺序图将交互关系表示为一个二维图&#x…

docker 安装jenkins

使用docker 容器安装jenkins比较方便&#xff0c;但是细节比较重要&#xff0c;这里实战安装了一遍&#xff0c;可用&#xff1a; 拉取最新的jenkins镜像 docker pull jenkins/jenkins 如果没有翻墙的话&#xff0c;可以会有下面的报错&#xff1a; Error response from dae…

My Metronome for Mac v1.4.2 我的节拍器 支持M、Intel芯片

应用介绍 My Metronome 是一款适用于 macOS 的专业节拍器应用程序&#xff0c;旨在帮助音乐家、作曲家、学生和任何需要精确节奏控制的人进行练习。无论是进行乐器练习、音乐创作还是演出排练&#xff0c;My Metronome 都能为用户提供精准的节拍支持和灵活的功能&#xff0c;确…

第1章大型互联网公司的基础架构——1.12 多机房:主备机房

除了要考虑机房内的各个组件&#xff0c;也要考虑机房自身的高可用问题。使用单机房架构搭建互联网应用后台&#xff0c;虽然接入层、业务服务层、存储层均具备高可用架构&#xff0c;但由于机房是单点&#xff0c;所以还是避免不了机房故障会造成整个应用无法访问的问题。可能…

EasyRTC:基于WebRTC与P2P技术,开启智能硬件音视频交互的全新时代

在数字化浪潮的席卷下&#xff0c;智能硬件已成为我们日常生活的重要组成部分&#xff0c;从智能家居到智能穿戴&#xff0c;从工业物联网到远程协作&#xff0c;设备间的互联互通已成为不可或缺的趋势。然而&#xff0c;高效、低延迟且稳定的音视频交互一直是智能硬件领域亟待…

项目设置内网 IP 访问实现方案

在我们平常的开发工作中&#xff0c;项目开发、测试完成后进行部署上线。比如电商网站、新闻网站、社交网站等&#xff0c;通常对访问不会进行限制。但是像企业内部网站、内部管理系统等&#xff0c;这种系统一般都需要限制访问&#xff0c;比如内网才能访问等。那么一个网站应…

ProfiNet转EtherNet/IP罗克韦尔PLC与监控系统通讯案例

一、案例背景 在新能源产业蓬勃发展的当下&#xff0c;大型光伏电站作为绿色能源的重要输出地&#xff0c;其稳定高效的运行至关重要。某大型光伏电站占地面积广阔&#xff0c;内部设备众多&#xff0c;要保障电站的稳定运行&#xff0c;对站内各类设备进行集中监控与管理必不可…

C++STL——map和set

C教学总目录 map和set 1、set1.1、set简介1.2、set接口简介1.3、set的使用1.4、set其他接口的使用1.5、multiset 2、map2.1、map简介2.2、pair使用2.3、map接口使用2.4、multimap 1、set 1.1、set简介 如图&#xff1a;set是类模板&#xff0c;参数T表示存储的数据类型&#x…

【Research Proposal】基于提示词方法的智能体工具调用研究——研究问题

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;研究问题1. 如何优化提示词方法以提高智能体的工具调用能力&#xff1f;2. 如何解决提示词方法在多模态任务中的挑战&#xff1f;3. 如何通过提示词优化智能体…

PLC数据采集网关(三格电子)

产品概述 PLC转Modbus网关型号SG-PLC-Private&#xff08;PLC私有协议网关&#xff09;&#xff0c;是三格电子推出的工业级网关&#xff08;以下简称网关&#xff09;&#xff0c;主要用于在不需要对PLC编程的情况下将PLC数据映射到Modbus TCP(映射的方式符合PLC工程师使用习惯…

【HBase】HBaseJMX 接口监控信息实现钉钉告警

目录 一、JMX 简介 二、JMX监控信息钉钉告警实现 一、JMX 简介 官网&#xff1a;Apache HBase ™ Reference Guide JMX &#xff08;Java管理扩展&#xff09;提供了内置的工具&#xff0c;使您能够监视和管理Java VM。要启用远程系统的监视和管理&#xff0c;需要在启动Java…

Qt开发⑥Qt常用控件_下_多元素控件+容器类控件+布局管理器

目录 1. 多元素控件 1.1 ?Widget 和 ?View 之间的区别 1.2 List Widget 纵向列表 1.3 Table Widget 表格 1.4 Tree Widget 树形控件 2. 容器类控件 2.1 Group Box 分组框 2.2 Tab Widget 标签页控件 3. 布局管理器 3.1 垂直布局QVBoxLayout 3.2 水平布局QHBoxLayo…

科普mfc100.dll丢失怎么办?有没有简单的方法修复mfc100.dll文件

当电脑频繁弹窗提示“mfc100.dll丢失”或应用程序突然闪退时&#xff0c;这个看似普通的系统文件已成为影响用户体验的核心痛点。作为微软基础类库&#xff08;MFC&#xff09;的核心组件&#xff0c;mfc100.dll直接关联着Visual Studio 2010开发的大量软件运行命脉。从工业设计…

并行计算考前复习整理

并行计算考前复习整理 &#xff08;lwg老师会在最后一节课跟大家讲考点&#xff0c;考试考的东西不会在考点之外&#xff0c;这里面我整理的内容已经将考点全部囊括&#xff0c;最终100分&#xff09; 一、向量求和函数 C语言的串行化实现 CUDA的并行化实现 1、问题一&am…

Windows - 通过ssh打开带有图形界面的程序 - 一种通过计划任务的曲折实现方式

Windows(奇思妙想) - 通过ssh打开带有图形界面的程序 - 一种通过计划任务的曲折实现方式 前言 Windows启用OpenSSH客户端后就可以通过SSH的方式访问Windows了。但是通过SSH启动的程序&#xff1a; 无法显示图形界面会随着SSH进程的结束而结束 于是想到了一种通过执行“计划…

[C#]C# winform部署yolov12目标检测的onnx模型

yolov12官方框架&#xff1a;github.com/sunsmarterjie/yolov12 【测试环境】 vs2019 netframework4.7.2 opencvsharp4.8.0 onnxruntime1.16.3 【效果展示】 【调用代码】 using System; using System.Collections.Generic; using System.ComponentModel; using System.…

51单片机-按键

1、独立按键 1.1、按键介绍 轻触开关是一种电子开关&#xff0c;使用时&#xff0c;轻轻按开关按钮就可使开关接通&#xff0c;当松开手时&#xff0c;开关断开。 1.2、独立按键原理 按键在闭合和断开时&#xff0c;触点会存在抖动现象。P2\P3\P1都是准双向IO口&#xff0c;…

Baklib云智协同:数字资产赋能企业效能跃升

内容概要 在数字化转型加速的背景下&#xff0c;Baklib通过构建智能化的知识中台架构&#xff0c;为企业打造了贯穿知识采集、整合、应用的全链路解决方案。该平台以动态知识图谱为核心技术底座&#xff0c;支持文档、音视频、代码等20余种格式的数字资产全生命周期管理&#…

Windows10配置C++版本的Kafka,并进行发布和订阅测试

配置的环境为&#xff1a;Release x64下的环境 完整项目&#xff1a;https://gitee.com/jiajingong/kafka-publisher 1、首先下载相应的库文件&#xff08;.lib&#xff0c;.dll&#xff09; 参考链接&#xff1a; GitHub - eStreamSoftware/delphi-kafka GitHub - cloade…