⭐⭐⭐⭐⭐⭐
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自带 |
log4j2 | Apache收购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()方法 |