5-【JavaWeb】JUnit 单元测试及JUL 日志系统

1. 使用 JUnit 进行单元测试

JUnit 是 Java 中非常流行的单元测试框架,MyBatis 与 JUnit 可以很好地结合,来测试持久层代码的正确性。

1.1 添加 JUnit 依赖

在使用 JUnit 之前,需要在 pom.xml 中引入 JUnit 依赖。

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope>
</dependency>

1.2 单元测试基本结构

假设我们要测试 UserMapper 中的 getUserById 方法,测试代码如下:

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;import java.io.InputStream;public class UserMapperTest {private SqlSessionFactory sqlSessionFactory;// 在测试开始前初始化 SqlSessionFactory@Beforepublic void setup() throws Exception {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}// 测试获取用户的方法@Testpublic void testGetUserById() {try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.getUserById(1);// 断言用户不为空Assert.assertNotNull("用户不存在", user);// 断言用户名是否正确Assert.assertEquals("用户名不匹配", "Alice", user.getName());}}
}

1.3 运行测试

  • 每个 @Test 注解的方法代表一个测试用例。
  • 使用 @Before 注解的方法会在每个测试方法执行前运行,常用于初始化。
  • 使用 Assert 方法来验证测试结果,例如 Assert.assertNotNull() 检查对象是否为空,Assert.assertEquals() 检查预期结果是否与实际结果一致。

通过运行 JUnit 测试,你可以快速验证 MyBatis Mapper 的 SQL 执行是否正确。


2. 使用 JUL(Java Util Logging)日志系统

Java Util Logging (JUL) 是 Java 内置的日志系统。MyBatis 默认使用 JUL 作为日志输出工具,你可以通过配置来控制日志输出级别与格式。

2.1 配置 MyBatis 日志级别

MyBatis 可以输出执行的 SQL 语句、参数及结果等信息。首先,你需要在 mybatis-config.xml 中配置日志级别。

<configuration><settings><!-- 开启日志输出 --><setting name="logImpl" value="JUL"/></settings>
</configuration>
  • logImpl 属性指定日志实现,这里设置为 JUL,表示使用 Java 自带的日志系统。

2.2 配置日志属性文件

在项目的 resources 目录下创建 logging.properties 文件,配置日志输出格式和级别。

logging.properties 示例:

handlers= java.util.logging.ConsoleHandler# 设置根日志级别
.level= INFO# 控制台日志级别和格式
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter# MyBatis 日志级别
org.apache.ibatis.level = FINE
  • .level:设置根日志的默认级别,这里设为 INFO,表示输出普通信息及更高级别的日志。
  • org.apache.ibatis.level:将 MyBatis 的日志级别设置为 FINE,输出更详细的 SQL 日志。

2.3 常见日志级别

  • SEVERE:严重错误,可能导致程序崩溃的错误。
  • WARNING:警告信息,潜在问题。
  • INFO:普通信息,程序正常运行的相关消息。
  • CONFIG:配置信息,程序初始化时的信息。
  • FINEFINERFINEST:调试信息,显示程序细节,日志级别递增。

2.4 运行时日志输出

通过上面的配置,当你运行 MyBatis 程序时,日志会输出到控制台,并显示执行的 SQL 语句以及执行时间等。

示例日志输出:

INFO: PooledDataSource forcefully closed/removed all connections.
FINE: ==>  Preparing: SELECT * FROM users WHERE id = ? 
FINE: ==> Parameters: 1(Integer)
FINE: <==      Total: 1

日志中会显示 SQL 语句的准备状态、绑定的参数以及查询返回的记录数。

3. 使用 Properties 配置文件

Properties 文件是 Java 项目中常用的配置文件格式,用于配置一些可调整的参数,如数据库连接信息、日志级别等。在 MyBatis 中,properties 文件也可以用于配置日志系统。

3.1 配置文件示例

创建一个名为 application.properties 的文件,内容如下:

# 数据库配置
db.url=jdbc:mysql://localhost:3306/mydb
db.username=root
db.password=123456# 日志配置
log.level=INFO

然后在 Java 代码中加载这个配置文件:

import java.io.InputStream;
import java.util.Properties;public class ConfigLoader {public static Properties loadProperties(String fileName) {Properties properties = new Properties();try (InputStream input = ConfigLoader.class.getClassLoader().getResourceAsStream(fileName)) {properties.load(input);} catch (Exception e) {e.printStackTrace();}return properties;}
}

通过 loadProperties 方法可以将配置文件加载到内存中,在程序中使用时可以动态获取这些配置。


4. 编写日志配置文件

为了使用 Java 内置的日志系统 JUL,你可以编写一个 logging.properties 文件,配置日志的输出格式、级别、输出位置等。这个配置文件通常放在 resources 目录下。

4.1 logging.properties 文件内容示例:

# 使用 ConsoleHandler 输出日志到控制台
handlers = java.util.logging.ConsoleHandler# 全局日志级别
.level = INFO# 控制台日志处理器的级别和格式
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter# MyBatis 日志配置
org.apache.ibatis.level = FINE
  • handlers:定义日志输出的处理器,这里我们使用 ConsoleHandler 将日志输出到控制台。
  • .level:定义默认的日志级别,INFO 表示输出一般信息。
  • org.apache.ibatis.level:为 MyBatis 特定包设置日志级别为 FINE,显示更详细的 SQL 执行信息。

4.2 使用 logging.properties

在应用启动时,你需要将 logging.properties 文件加载到日志系统中。可以通过以下方式加载:

import java.util.logging.LogManager;public class LogConfig {static {try {LogManager.getLogManager().readConfiguration(LogConfig.class.getClassLoader().getResourceAsStream("logging.properties"));} catch (Exception e) {e.printStackTrace();}}
}

将此类放置在应用启动类中,它会自动读取日志配置文件。


5. 使用 Lombok 快速开启日志

Lombok 提供了一些注解来自动生成日志记录器,从而简化日志功能的使用。在 MyBatis 项目中,可以使用 Lombok 提供的注解快速开启日志记录。

5.1 添加 Lombok 依赖

pom.xml 文件中添加 Lombok 依赖:

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><scope>provided</scope>
</dependency>

5.2 使用 Lombok 的日志注解

Lombok 提供了多种日志注解,常用的有:

  • @Slf4j: 使用 SLF4J 日志框架
  • @Log: 使用 JUL 日志框架
  • @Log4j: 使用 Log4j 日志框架

在这里,我们使用 @Log 注解来使用 Java 自带的 JUL 日志系统:

import lombok.extern.java.Log;@Log
public class MyService {public void performAction() {log.info("Performing some action...");}
}
  • @Log 自动生成了一个 log 对象,你可以直接使用 log.info()log.warning() 等方法记录日志。
  • 这样做的好处是,不需要手动创建日志记录器对象,Lombok 会自动帮你生成。

6. MyBatis 日志系统

MyBatis 提供了内置的日志系统,可以输出 SQL 语句的执行情况、参数绑定、返回结果等信息。MyBatis 支持多种日志框架,如 JUL、Log4j、SLF4J 等。你可以根据项目需要选择合适的日志框架。

6.1 配置 MyBatis 日志系统

MyBatis 默认支持多种日志实现方式,你可以通过 mybatis-config.xml 文件指定使用哪种日志系统。

<configuration><settings><!-- 配置 MyBatis 使用 JUL 作为日志框架 --><setting name="logImpl" value="JUL"/></settings>
</configuration>

6.2 查看 SQL 日志

在启用了 MyBatis 日志系统后,每当执行 SQL 语句时,控制台上会输出相关的日志信息。示例日志输出如下:

FINE: ==>  Preparing: SELECT * FROM users WHERE id = ? 
FINE: ==> Parameters: 1(Integer)
FINE: <==      Total: 1
  • Preparing:显示即将执行的 SQL 语句。
  • Parameters:显示 SQL 语句的参数绑定信息。
  • Total:显示查询返回的结果数。

6.3 使用 Log4j 或 SLF4J 作为日志系统

MyBatis 也支持其他日志系统,比如 Log4j 或 SLF4J。如果你想使用 Log4j,首先需要添加依赖:

<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>

然后修改 mybatis-config.xml 配置文件,设置 logImplLOG4J

<configuration><settings><!-- 使用 Log4j 作为日志系统 --><setting name="logImpl" value="LOG4J"/></settings>
</configuration>

总结

  • JUnit 单元测试:通过 JUnit 进行单元测试可以确保 MyBatis 的持久层代码正常工作,@Before@Test 是最常用的注解,Assert 方法用于验证测试结果。
  • JUL 日志系统:MyBatis 支持 Java 自带的日志系统 (JUL),你可以通过 logging.properties 文件配置日志的级别、格式和输出位置。
  • Properties 文件:可以通过 application.properties 文件配置数据库连接信息和日志级别,并通过 Java 代码加载这些配置。
  • 日志配置文件logging.properties 文件用于配置 JUL 日志系统,可以控制日志的输出级别、格式等。
  • Lombok 日志注解:使用 Lombok 的 @Log@Slf4j 等注解可以快速开启日志功能,简化日志代码的书写。
  • MyBatis 日志系统:MyBatis 支持多种日志框架,通过 mybatis-config.xml 可以指定日志实现,MyBatis 的日志系统会输出 SQL 的执行情况,方便调试。

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

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

相关文章

SpringBoot开发——使用@Slf4j注解实现日志输出

文章目录 1、Lombok简介2、SLF4J简介3、实现步骤3.1 创建SpringBoot项目3.2 添加依赖3.3 使用 Slf4j 注解3.4 输出日志信息 4、结论 在现代Java开发中&#xff0c;日志记录是至关重要的。它不仅帮助开发者调试代码&#xff0c;还便于监控系统运行状态和性能。 Lombok 和 SLF4J …

【Android】Room—数据库的基本操作

引言 在Android开发中&#xff0c;数据持久化是一个不可或缺的部分。随着应用的复杂度增加&#xff0c;选择合适的数据存储方式变得尤为重要。Room数据库作为Android Jetpack架构组件之一&#xff0c;提供了一种抽象层&#xff0c;使得开发者能够以更简洁、更安全的方式操作SQ…

快速搭建最简单的前端项目vue+View UI Plus

1 引言 ‌‌Vue是一套用于构建Web前端界面的渐进式JavaScript框架。‌‌它以其易学易用、性能出色、灵活多变而深受开发者喜爱&#xff0c;并且与其他前端框架&#xff08;如‌React和‌Angular&#xff09;相比&#xff0c;在国内市场上受到了广泛的认可和使用。点击进入官方…

vue3嵌套路由无法显示子路由组件的解决方法

路由嵌套的问题&#xff1a; vue3前端开发中&#xff0c;在使用嵌套路由来设计二级目录或多级目录后&#xff0c;使用RouterLink标签和RouterView标签来渲染时显示的有可能是上一级的目录指向的vue组件&#xff0c;而无法显示子路由指向的组件的内容&#xff0c;这是为什么呢&…

AI问答-HTTP:理解 Content-Disposition

一、简介 Content-Disposition是HTTP协议中的一个响应头字段&#xff0c;它主要用于指示如何处理响应的内容以及如何呈现给用户。这个字段是MIME协议类型的扩展&#xff0c;用于指导MIME用户代理&#xff08;如浏览器&#xff09;如何显示附加的文件。Content-Disposition的主…

C++:opencv生成结构元素用于膨胀腐蚀等cv::getStructuringElement

cv::getStructuringElement 是 OpenCV 库中用于生成结构元素的函数。结构元素在形态学操作中&#xff08;如膨胀、腐蚀、开运算、闭运算等&#xff09;扮演着关键角色。这个函数可以创建不同形状和尺寸的结构元素&#xff0c;以适应不同的图像处理需求。 函数原型 cv::Mat cv…

yolo自动化项目实例解析(二)ui页面整理

我们在上一章整理main.py 的if __name__ __main__: 内容还留下面这一段&#xff0c; app QApplication(sys.argv) # 初始化Qt应用ratio screen_width / 2560 # 分辨率比例# 设置全局字体大小# 计算字体大小base_font_size 13# 基准字体大小&#xff0c;适合1920*1080分辨…

【数据结构与算法 | 灵神题单 | 合并链表篇】力扣2, 21, 445, 2816

1. 力扣2&#xff1a;两数相加 1.1 题目&#xff1a; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可…

vue3 +百度地图 实现 地点检索,输入联想,经纬度,逆地理编码,创建标记,label等

由于百度地图文档确实有点欠缺&#xff0c;在这里记录一下 vue3 百度地图&#xff08;js api 3.0&#xff09;实现效果如下实现方式注意事项 vue3 百度地图&#xff08;js api 3.0&#xff09; 需求&#xff1a; 地图弹框组件&#xff0c;可以搜索地图点&#xff0c;输入联想…

尚品汇-订单拆单、支付宝关闭交易、关闭过期订单整合(五十)

目录&#xff1a; &#xff08;1&#xff09;拆单接口 &#xff08;2&#xff09;取消订单业务补充关闭支付记录 &#xff08;3&#xff09;支付宝关闭交易 &#xff08;4&#xff09;查询支付交易记录 &#xff08;5&#xff09;PaymentFeignClient 远程接口 &#xff08…

指针与函数传递

title: 指针与函数传递 date: 2024-09-14 21:33:51 description: 函数传递多个元素 tags: c language skaiuijing 理解指针 很多人经常使用指针&#xff0c;看到这个标题可能不屑一顾。但笔者想说&#xff0c;把指针当作理所当然而不去探索它的本质&#xff0c;这是不对的。…

Go语言错误处理详解

Go语言以其简洁、高效和并发能力著称。在实际开发中&#xff0c;错误处理是一个不可避免且至关重要的部分。本文将深入探讨Go语言中的错误处理机制&#xff0c;涵盖其原理、使用方法、最佳实践&#xff0c;并提供丰富的代码示例和中文注释。 一、错误处理的基本概念 在Go语言…

7. 探究模型参数与显存的关系以及不同精度造成的影响

这篇文章将探讨两个重点&#xff1a; 模型参数与显存&#xff08;GPU 内存&#xff09;之间的关系不同精度的导入方式&#xff0c;以及它们对显存和性能的影响 理解这些概念会让你在模型的选择上更加游刃有余。 文章目录 模型参数与显存的关系模型参数量与内存占用GPU 显存需求…

JMeter脚本开发

环境部署 Ubuntu系统 切换到root用户 sudo su 安装上传下载的命令 apt install lrzsz 切换文件目录 cd / 创建文件目录 mkdir java 切换到Java文件夹下 cd java 输入rz回车 选择jdk Linux文件上传 解压安装包 tar -zxvf jdktab键 新建数据库 运行sql文件 选择sql文件即…

基于51单片机的电饭锅控制系统proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1CGyg6uPhFI0MeaBWwe_HAg 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectro…

RedisTemplate操作ZSet的API

文章目录 ⛄概述⛄常见命令有⛄RedisTemplate API❄️❄️ 向集合中插入元素&#xff0c;并设置分数❄️❄️向集合中插入多个元素,并设置分数❄️❄️按照排名先后(从小到大)打印指定区间内的元素, -1为打印全部❄️❄️获得指定元素的分数❄️❄️返回集合内的成员个数❄️❄…

前端网络层性能优化

前言 在数字时代&#xff0c;速度已成为互联网体验的关键。用户对网页加载时间的容忍度越来越低&#xff0c;每一毫秒的延迟都可能导致用户的流失。根据谷歌的研究&#xff0c;页面加载时间超过3秒的网站&#xff0c;其跳出率会增加120%。在这个以用户为中心的网络世界里&…

Git换行符自动转换参数core.autocrlf的用法

core.autocrlf 是 Git 中用于控制换行符自动转换的配置选项。它有以下几个可能的值&#xff1a; 1. true 作用&#xff1a;在 checkin 时将 CRLF 转换为 LF&#xff0c;在 checkout 时将 LF 转换为 CRLF。适用场景&#xff1a;适用于 Windows 用户&#xff0c;希望在本地文件…

LineageOS刷机教程

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ LineageOS 是一个基于 Android 开源项目&#xff08;AOSP&#xff09;的开源操作系统&#xff0c;主要由社区开发者维护。它起源于 CyanogenMod 项目&#xff…

10年Python程序员教你多平台采集10万+电商数据【附实例】

10万级电商数据采集需要注意什么&#xff1f; 在进行10万级电商数据采集时&#xff0c;有许多关键因素需要注意&#xff1a; 1. 采集平台覆盖&#xff1a;确保可以覆盖主流的电商平台&#xff0c;如淘宝、天猫、京东、拼多多等。 2. 数据字段覆盖&#xff1a;检查是否可以对平…