【Mybatis】1—前言日志框架

⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
笔记链接👉https://github.com/A-BigTree/Code_Learning
⭐⭐⭐⭐⭐⭐

如果可以,麻烦各位看官顺手点个star~😊

如果文章对你有所帮助,可以点赞👍收藏⭐支持一下博主~😆


文章目录

  • 1 前言
    • 1.1 总体技术体系
      • 1.1.1 单一架构
      • 1.1.2 分布式架构
    • 1.2 框架的概念
    • 1.3 Mybatis历史
    • 1.4 Mybatis特性
    • 1.5 和其他持久化层技术对比
  • 2 日志框架
    • 2.1 用日志打印代替sout
      • 2.1.1 sout的问题
        • I/O影响性能
        • 无法统一管理
      • 2.1.2 使用好处
        • 设定级别,统一管理
        • 灵活指定输出位置
        • 自定义日志格式
        • 基于日志分析问题
    • 2.2 Java日志体系的演变
      • 2.2.1 门面
      • 2.2.2 实现
      • 2.2.3 最佳搭档
      • 2.2.4 用法
        • 导入依赖
        • 代码测试
        • 引入配置文件
    • 2.3 Lombook插件使用
      • 2.3.1 Lombok简介
        • Lombok原理
      • 2.3.2 使用Lombok注解
        • 加入依赖
        • 注解功能

1 前言

1.1 总体技术体系

1.1.1 单一架构

一个项目,一个工程,导出为一个war包,在一个Tomcat上运行。也叫all in one。

在这里插入图片描述

1.1.2 分布式架构

一个项目(对应IDEA中的一个project),拆分成很多个模块,每个模块是一个IDEA中的一个module。每一个工程都是运行在自己的Tomcat上。模块之间可以互相调用。每一个模块内部可以看成是一个单一架构的应用。

在这里插入图片描述

1.2 框架的概念

框架 = jar包 + 配置文件

在这里插入图片描述

1.3 Mybatis历史

MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github;

iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO);

Mybatis的最大特点:轻量级。相对于Hibernate省略了大量不常用的功能,整体轻巧又高效;

1.4 Mybatis特性

  • MyBatis支持定制化SQL、存储过程以及高级映射;
  • MyBatis避免了几乎所有的JDBC代码和手动设置参数以及结果集解析操作;
  • MyBatis可以使用简单的XML或注解实现配置和原始映射;将接口和Java的POJO(Plain Ordinary Java Object,普通的Java对象)映射成数据库中的记录;
  • Mybatis是一个半自动的ORM(Object Relation Mapping)框架;

1.5 和其他持久化层技术对比

  • JDBC
    • SQL 夹杂在Java代码中耦合度高,导致硬编码内伤;
    • 维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见;
    • 代码冗长,开发效率低;
  • Hibernate 和 JPA
    • 操作简便,开发效率高;
    • 程序中的长难复杂SQL需要绕过框架;
    • 内部自动生成的SQL,不容易做特殊优化;
    • 基于全映射的全自动框架,大量字段的 POJO 进行部分映射时比较困难;
    • 反射操作太多,导致数据库性能下降;
  • MyBatis
    • 轻量级,性能出色;
    • SQL 和 Java 编码分开,功能边界清晰。Java代码专注业务、SQL语句专注数据;
    • 开发效率稍逊于 HIbernate,但是完全能够接收;

开发效率:Hibernate > Mybatis > JDBC

运行效率:JDBC > Mybatis > Hibernate

2 日志框架

2.1 用日志打印代替sout

2.1.1 sout的问题

I/O影响性能

System.out对象是一个输出流对象,所以控制台输出信息本质上是I/O操作。而I/O操作是项目运行过程中两大性能瓶颈之一。

无法统一管理

项目上线时,希望把所有(或一部分)sout打印关闭,但是只能手动一个一个查找,耗费开发人员的极大精力,因为sout的无度使用会使它分散在项目的各个角落。

2.1.2 使用好处

设定级别,统一管理

日志框架会按照事件的严重程度来划分级别,例如:

  • 错误(Error):表示程序运行出错,比如抛异常等情况;
  • 警告(Warning):表示程序运行过程中有潜在风险,但此时并没有报错;
  • 信息(Info):表示程序运行过程中完成了一个关键动作,需要以程序运行信息的形式告知开发者;
  • 调试(Debug):表示程序运行过程中更加细致的信息,协助程序员调试程序;

通过在配置文件中指定某一个日志级别来控制系统要打印的内容。日志框架会打印当前指定级别的日志和比当前指定级别更严重的级别的日志。

例如在开发阶段,我们指定debug级别,项目上线修改成info级别,那么所有debug级别的日志就都不打印了,不需要到项目代码中一个一个修改,非常方便。

灵活指定输出位置

使用日志框架不一定是打印到控制台,也可以保存到文件中或者保存到数据库。这就看具体的项目维护需求。

自定义日志格式

打印日志数据可以使用日志框架的默认格式,也可以根据需要定制。

基于日志分析问题

将来我们开发的应用系统中,不仅包含Java代码,还有很多中间件服务器。任何子系统出现故障我们都是通过日志来定位问题、分析故障原因。甚至更复杂的系统还会专门开发日志子系统,在主系统出现问题时抓取日志数据供维护人员参考。

而日志数据必须要有确定格式才便于格式化和抓取,这肯定不是随意写sout就能实现的。

2.2 Java日志体系的演变

2.2.1 门面

门面:类似于标准层、接口层

名称说明
JCL(Jakarta Commons Logging)陈旧
SLF4J(Simple Logging Facade for Java)适合(同一作者
jboss-logging特殊专业领域使用

2.2.2 实现

名称说明
log4j最初版(同一作者
JUL(java.util.logging)JDK自带
log4j2Apache收购log4j后全面重构,内部实现和log4j完全不同
logback优雅、强大(同一作者

2.2.3 最佳搭档

  • 门面:SLF4J

  • 实现:logback

2.2.4 用法

导入依赖

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.4.6</version>
  <scope>compile</scope>
</dependency>

代码测试

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogTest {
    private final Logger logger = LoggerFactory.getLogger(LogTest.class);

    @Test
    public void testLog(){
        logger.trace("hello trace");
        logger.debug("hello, debug");
        logger.info("hello info");
        logger.warn("hello warn");
        logger.error("hello error");
    }
}

引入配置文件

Logback要求配置文件名称必须是logback.xml,存放路径在main/resources目录下。

配置文件示例如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <!-- 指定日志输出的位置,ConsoleAppender表示输出到控制台 -->
    <appender name="STDOUT"
              class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 日志输出的格式 -->
            <!-- 按照顺序分别是:时间、日志级别、线程名称、打印日志的类、日志主体内容、换行 -->
            <pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <!-- 设置全局日志级别。日志级别按顺序分别是:TRACE、DEBUG、INFO、WARN、ERROR -->
    <!-- 指定任何一个日志级别都只打印当前级别和后面级别的日志。 -->
    <root level="INFO">
        <!-- 指定打印日志的appender,这里通过“STDOUT”引用了前面配置的appender -->
        <appender-ref ref="STDOUT" />
    </root>
    <!-- 根据特殊需求指定局部日志级别,可也是包名或全类名。 -->
    <logger name="com.atguigu.mybatis" level="DEBUG" />
</configuration>

2.3 Lombook插件使用

2.3.1 Lombok简介

使用Lombok注解就可以省略生成getXxx()setXxx()方法、toString()方法、构造器等固定格式代码的繁琐操作,提高开发效率。包括Logger日志对象。

Lombok原理

Lombok是将自动生成的代码织入字节码文件中,从而实现:源代码没有,但是字节码文件有——毕竟我们最终运行的是字节码文件,只要字节码文件中有即可。而这个过程因为要参与源文件编译,所以需要安装IDEA插件。

2.3.2 使用Lombok注解

加入依赖

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.26</version>
  <scope>compile</scope>
</dependency>

注解功能

注解作用
@Data生成getXxx()方法、setXxx()方法、toString()、equals()、canEqual()、hashCode()方法
@AllArgsConstructor生成全参构造器
@NoArgsConstructor生成无参构造器
@Slf4j生成日志对象
@Getter生成getXxx()方法
@Setter生成setXxx()方法
@ToString生成toString()方法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RBF-UKF径向基神经网络结合无迹卡尔曼滤波估计锂离子电池SOC(附MATLAB代码)

目录 RBFNN训练结果 UKF估计SOC 文章的结尾红色部分有彩蛋 RBFNN训练结果 这篇文章主要介绍如何使用RBF神经网络训练出的参数并结合UKF算法完成锂离子电池SOC的估计&#xff0c;有关RBF参数训练过程的代码分析放在2天后的下一篇文章&#xff0c;这里只给出训练完成后的结果…

关于async/await、promise和setTimeout执行顺序

关于async/await、promise和setTimeout执行顺序 async function async1() {console.log(async1 start);await async2();console.log(asnyc1 end); } async function async2() {console.log(async2); } console.log(script start); setTimeout(() > {console.log(setTimeOut…

springboot(01)项目搭建与启动

01&#xff0c;项目搭建与启动 一&#xff0c;项目搭建 有多种方式可以搭建Spring Boot项目&#xff0c;包括&#xff1a; 使用Spring Boot CLI命令行工具使用Spring Initializr网站或IDE插件生成项目模板使用Maven或Gradle手动配置项目 每种方式都有其优缺点&#xff0c;具…

Android IPC Binder机制学习(一)

一、多进程系统设计及意义Android系统分为5层&#xff0c;不过Android一般岗位只关注上三层就够用了即&#xff1a;应用层、framework层、native层。Android中的应用层和系统服务层不在同一个进程&#xff0c;系统服务在单独的进程中。Android中不同的应用属于不同的进程中Andr…

ChatGPT遭禁用、抵制后又停止Plus付费发生了?

ChatGPT相关信息 2023年2月27日消息&#xff0c;Snapchat 正在推出一个基于 OpenAI 的 ChatGPT 最新版本的聊天机器人。 这款名为“My AI”的机器人将被固定在应用界面的聊天选项卡上&#xff0c;虽然最初仅适用于每月3.99美元的SnapchatPlus付费订阅用户&#xff0c;但最终目…

图像分类综述

一、图像分类介绍 什么是图像分类&#xff0c;核心是从给定的分类集合中给图像分配一个标签的任务。实际上&#xff0c;这意味着我们的任务是分析一个输入图像并返回一个将图像分类的标签。标签来自预定义的可能类别集。 示例&#xff1a;我们假定一个可能的类别集categories …

Vue3+vite2 博客前端开发

Vue3vite2 博客前端开发 文章目录Vue3vite2 博客前端开发前言页面展示代码设计卡片设计背景&#xff08;Particles.js粒子效果&#xff09;右侧个人信息与公告内容页友链总结前言 大家是否也想拥有一个属于自己的博客&#xff1f;但是如何去开发博客&#xff0c;怎样去开发一个…

毫升 | 主成分分析(PCA)

这种方法是由Karl Pearson 介绍的。它的工作条件是&#xff0c;当高维空间中的数据映射到低维空间中的数据时&#xff0c;低维空间中数据的方差应最大。 主成分分析 (PCA) 是一种用于降低大型数据集维数的统计技术。它是机器学习、数据科学和其他处理大型数据集的领域中常用的…

如何通过C++ 将数据写入 Excel 工作表

直观的界面、出色的计算功能和图表工具&#xff0c;使Excel成为了最流行的个人计算机数据处理软件。在独立的数据包含的信息量太少&#xff0c;而过多的数据又难以理清头绪时&#xff0c;制作成表格是数据管理的最有效手段之一。这样不仅可以方便整理数据&#xff0c;还可以方便…

aspnet030高校学生团体管理系统sqlserver

net030高校学生团体管理系统 . 1.用户基本信息管理模块&#xff1a;录入、修改、删除、查询、统计、打印等功能 2.学生成绩管理模块&#xff1a;录入、修改、删除、查询、统计、打印等功能 3.学生团体信息管理模块&#xff1a;录入、修改、删除、查询、统计、打印等功能 4.教…

Excel技能之查找筛选排序,同事竖起大拇指

每天面对大量的数据&#xff0c;眼睛都看花了。头疼、脱发、颈椎病、胸闷、腰间盘突出&#xff0c;一系列并发症严重影响打工人的心情。同事看在眼里&#xff0c;痛在心里。 救救打工人吧&#xff01;打工人的福音来了&#xff0c;自从学会了查找筛选排序&#xff0c;手脚利索…

动态规划(一) part1

T1:一个数组 中的最长 升序 子序列 的长度 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组…

C 非线性结构——树 万字详解(通俗易懂)

目录 一、树的介绍 1.定义 : 2.相关概念 : 3.简单分类 : 4.相关应用 : 二、树的存储 1.二叉树的存储 : 1 二叉树连续存储 2 二叉树链式存储&#xff08;常用&#xff09; 2.普通树和森林的存储 : 1 普通树的存储 2 森林的存储 三、树的遍历 1.二叉树先序遍历 : 2.二叉…

深度学习训练营之yolov5训练自己的数据集

深度学习训练营之训练自己的数据集原文链接环境介绍准备好数据集划分数据集运行voc_train.py遇到问题完整代码创建new_data.yaml文件模型训练时遇到的报错模型训练结果可视化参考链接原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f…

正则表达式

一、正则表达式的概述 1、概念 正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 正则表达式是对字符串&#xff08;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊字符&#xff08;称为“元字符”&#xff09;&#xff09;操…

JVM 程序计数器(PC)

PC寄存器的概念 JVM中的程序计数寄存器&#xff08;Program Counter Register&#xff09;中&#xff0c;Register的命名源于CPU的寄存器&#xff0c;寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里&#xff0c;并非是广义上所指的物理寄存器&#…

【蓝桥杯冲刺】日期类专题特训

目录 1. 日期累加 题目描述 输入 输出 代码 2. 日期差值 题目描述 输入 输出 代码 3. 打印日期 题目描述 输入 输出 代码 写在最后&#xff1a; 1. 日期累加 题目链接&#xff1a;日期累加 题目描述 输入 1 2008 2 3 100 输出 2008-05-13 代码 #include…

如何在 Linux 中查找所有符号链接,这几个命令得会!

在Linux中&#xff0c;符号链接&#xff08;Symbolic Link&#xff09;是一种非常常见的文件类型&#xff0c;也称为软链接。符号链接是指向另一个文件的指针&#xff0c;而不是实际的数据。它允许用户创建一个指向另一个文件的虚拟文件&#xff0c;这样用户可以在不改变实际文…

JVM解析原理

目录1.JVM内存结构2.JIT及时编译器的原理&#xff0c;优化以及切换编译器类型2.1解释型语言和编译语言2.2JIT即时编译器&#xff08;Just In Time Compiler&#xff09;3.类的加载机制和类的加载器3.1类的加载机制3.2类的加载器4.双亲委派机制4.1定义4.2优点4.3总结5.虚拟机栈详…

读破万卷,神交古人,突破ChatGPT4096的Token限制,建立自己的垂直领域资料人工智能助理

ChatGPT的泛用性极高&#xff0c;上知天文&#xff0c;下通地理&#xff0c;参考古今&#xff0c;博稽中外&#xff0c;几乎无所不知&#xff0c;无所不晓。但如果涉及垂直领域的专业知识点&#xff0c;ChatGPT难免也会有语焉不详&#xff0c;闪烁其词的毛病&#xff0c;本次我…
最新文章