自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 资源 (2)
  • 收藏
  • 关注

原创 Mybatis源码解析08-动态SQL、延迟加载、缓存、插件

动态 SQL 是 MyBatis 的强大特性之一。这样一旦title为空,则数据就会全部满足条件,如果数据量很大,一是会导致数据库端的压力,二是可能会占满虚拟机的内存,所以这个时候就可以利用mybatis的插件做点事件,我们可以针对Executor的query做一个插件(这里以mysql数据库为例)Mybatis的缓存有一级缓存与二级缓存,一级缓存是SqlSession级别的缓存,二级缓存是全局的或者说是namespace级别的缓存。Mybatis的动态SQL可以在运行时根据数据的不同,执行不同的SQL。

2023-02-22 22:40:19 242

原创 Mybatis 源码解析 07 - 关键组件 ResultSetHandler

根据我们配置的ResultMap可知有resultMap的id,类型,以及字段与表列名称的对应关系,这个复杂的过程主要就是从ResultSet中根据column_name获取值然后根据TypeHandler转换为Entity对应字段(属性)的值。可以看到同ParameterHandler一样,在创建StatementHandler实例调用BaseStatementHandler的构造器时,会创建ResultSetHandler。此方法也只有一个实现类:DefaultResultSetHandler。

2023-02-14 22:21:52 226

原创 Mybatis 源码解析 06 - 关键组件 ParameterHandler

ParameterHandler显然是用来处理参数的,主要是用来设置PreparedStatement的参数,接口只有两个方法,一个是获取参数对象,一个是设置PreparedStatement的参数。可以看到ParamenterHandler相对比较简单,主要是根据配置解析的ParameterMapping(参数映射)找到对应的TypeHandler和JdbcType,最终会调用到PreparedStatement的设置参数方法。此接口只有一个实现类:DefaultParameterHandler。

2023-02-14 21:51:29 212

原创 Mybatis源码解析05-关键组件StatementHandler

可以看到这两个核心组件的类图有相似之处,StatementHandler接口定义核心的方法,抽象类BaseStatementHandler提供一些非子类特有的行为,而子类则去实现自己特有的行为,而RoutingStatementHandler又用到了代理模式,这样让好具体的StatementHandler与上层代码解耦,上层代码面向StatementHandler接口编程即可。可以知道Statement是执行的关键,而上面StatementHandler的每一个都关乎SQL的执行。

2023-02-14 21:25:48 185

原创 JDBC关键部分简单梳理

JDBC定义了驱动(Driver)的接口,可以将驱动动态加载并交给DriverManger管理,且DriverManger可以当做Connection的工厂(提供了getConnection方法)。可以看到通过jdbc的接口我们可以和数据库交互,进行CRUD,达到预期目的,但是通过jdbc操作数据库较为麻烦,所以诞生了诸如Mybatis、Hibernate等一系列框架。然后可以看一下类图的关系。

2023-02-11 23:14:21 112

原创 Mybatis源码解析04-关键组件Executor

接下来看一下Executor,Executor是Mybatis的执行器,接口提供的主要功能有:1. 更新、查询、提交、回滚2. 缓存处理(一级、二级缓存 ),如创建缓存key、清理缓存等

2023-02-10 22:53:36 128

原创 Mybatis源码解析03-关键组件SqlSession

SqlSession是Mybatis的主要Java接口,通过此接口你可以执行命令、获取Mappers、管理事务。

2023-02-10 22:46:30 275

原创 Mybatis源码解析02-SQL执行概述

一般在使用mybatis的时候,会在DAO层设计一个*Mapper的接口,然后会有与之对应的文件,其namespace为接口class的全限定名,而里面的这些操作标签对应接口里面的方法。我们在Mapper接口打断点,然后执行到断点的时候,如下图所示:可以看到此时的Mapper接口对应的是这明显是一个由MapperProxy派生出来的代理类。

2023-02-04 19:26:09 229

原创 代理模式(Proxy Pattern)

基于字节码可以实现更强大的功能,这里我们只聚焦于代理模式。可以看到Java的代理模式实现有多种方式,spring即支持JDK实现的动态代理,也支持cglib实现的动态代理,基于代理模式实现的AOP是spring的核心功能之一。灵活的运用代理模式可以让我们更加游刃有余的完成的复杂功能。

2023-02-02 23:30:55 107

原创 Mybatis 源码解析01 - 配置、启动加载

mybatis是目前非常流行的ORM框架,在其基础上还衍生了mybatis-plus)等优秀的框架。mybatis简单,易用,易扩展。接下来我们用一个简单的例子(几乎包含所有配置)来看一下mybatis相关的配置项下面是一个包含用户、商品、订单的DAO例子,关系图如下:MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 各属性介绍可以参考[官网](mybatis – MyBatis 3 | 配置)此示例项目的内容如下下面是mapper配置,即xml映射文件的配置,我

2023-01-19 14:52:08 494

原创 ucore_lab8 实验报告

实验目的通过完成本次实验,希望能达到以下目标某操作系统中建立了一个基于索引节点(index node)结构的文件系统very simple file system, 简称vsfs。vsfs的用户操作包括(以函数形式表示):mkdir(“str”) - 创建一个新目录,目录名称为”str”creat(“str”) - 创建一个空文件,空文件名称为“str”

2022-12-27 15:50:35 325

原创 ucore_lab7实验报告

管程是由局部于自己的若干公共变量及其说明和所有访问这些公共变量的过程所组成的软件模块。

2022-10-20 11:12:29 365

原创 ucore_lab6实验报告

实验目的熟悉ucore的系统调度器框架,以及基于此框架的Round-Robin(RR) 调度算法。然后参考RR调度算法的实现,完成Stride Scheduling调度算法。

2022-09-19 15:17:24 387

原创 简单工厂模式

简单工厂模式是工厂模式的一种最简单的形式,该模式可以根据消费者的需求,生产固定的几种产品,且将生产产品(创建对象的行为逻辑隐藏起来)。,当用户想要手机的时候,调用工厂类的ProducePhone方法,可以根据手机品牌名称生产对应的手机。上图是IDEA导出来的图片,我们有一个。有一个Phone的工厂类。

2022-09-09 14:29:28 160

原创 单例模式(Singleton Pattern)

不同的地方在饿汉式方式是只要Singleton类被装载就会实例化,没有Lazy-Loading的作用,而静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载Instance类,从而完成Singleton的实例化。类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。5、懒汉模式(在实例化单例类的时候加同步锁,线程不安全,还是有可能产生多个实例)...

2022-08-26 08:19:53 250

原创 ucore_lab5实验报告

让用户进程在用户态执行,且在需要ucore支持时,可通过系统调用来让ucore提供服务。为此需要构造出第一个用户进程,并通过系统调用sys_fork/sys_exec/sys_exit/sys_wait来支持运行不同的应用程序,完成对用户进程的执行过程的基本管理。

2022-08-23 16:48:33 595

原创 页表自映射机制(Page Tables self-map)

学习ucore操作系统的时候在看到关于页表自映射的介绍,但是讲的不是很详细,理解起来有些吃力,查了一些资料大概有了一个自己的理解。

2022-08-11 14:54:06 1615

原创 ucore_lab4实验报告

实验目的:本次实验将首先接触的是内核线程的管理。内核线程是一种特殊的进程,内核线程与用户进程的区别有两个:进程是资源分配单位,线程是CPU调度单位。本实验依赖实验1/2/3。请把你做的实验1/2/3的代码填入本实验中代码中有“LAB1”,“LAB2”,“LAB3”的注释相应部分。和前面一样,直接合并代码即可alloc_proc函数(位于kern/process/proc.c中)负责分配并返回一个新的struct proc_struct结构,用于存储新建立的内核线程的管理信息。ucore需要对这个结构进行最基

2022-07-13 17:20:36 599

原创 ucore_lab3 实验报告

在做完lab1、lab2的实验后接着就是lab3,lab3主要是虚拟内存管理相关的内容,按照lab3的实验指导书的要求,开始做lab3的练习本次实验是在实验二的基础上,借助于页表机制和实验一中涉及的中断异常处理机制,完成Page Fault异常处理和FIFO页替换算法的实现,结合磁盘提供的缓存空间,从而能够支持虚存管理,提供一个比实际物理内存空间“更大”的虚拟内存空间给系统使用。这个实验与实际操作系统中的实现比较起来要简单,不过需要了解实验一和实验二的具体实现。实际操作系统系统中的虚拟内存管理设计与实现是相

2022-07-13 17:19:44 494

原创 ucore_lab2实验报告

lab1的实验完成后开始lab2,lab2主要是实现内存分配实验目的:理解基于段页式内存地址的转换机制理解页表的建立和使用方法理解物理内存的管理方法在lab1的时候我们用的是段式管理,涉及到的地址都是物理地址。而lab2需要建立段页式内管管理机制。从应用程序的使用角度看是不关心具体对应的物理内存的,操作系统提供一个可用的连续内存空间(虚拟的)给应用程序使用,这样会更方便应用程序编写。lab2主要分三部分:首先要了解的是如何发现系统(硬件)的物理内存建立对物理内存的初步管理页

2022-03-07 17:47:29 1206

原创 通用双向循环链表学习

双向循环链表是很常用的一种数据结构。其结构如下图所示:ucore里面使用了很多双向循环链表组织数据,如空闲页链表等。一般我们在Java写双向链表可能会这么写:public class DoubleLink<T> { T data; DoubleLink prev; DoubleLink next;}而在C里面可能会这么写:struct custom_data {};struct double_link { struct custom_data

2022-03-07 17:46:32 493

原创 ucore_lab1实验报告

此篇是学习ucore操作系统lab1的实验报告,参考了很多资料和文章,也学到了不少。先看要求:为了实现lab1的目标,lab1提供了6个基本练习和1个扩展练习,要求完成实验报告。对实验报告的要求:基于markdown格式来完成,以文本方式为主。填写各个基本练习中要求完成的报告内容完成实验后,请分析ucore_lab中提供的参考答案,并请在实验报告中说明你的实现与参考答案的区别列出你认为本实验中重要的知识点,以及与对应的OS原理中的知识点,并简要说明你对二者的含义,关系,差异等方面的理解(也可

2022-03-07 17:44:22 1807

原创 接口隔离原则(Interface Segregation Principle, ISP)

在软件设计、编码过程中有几个基本原则即SOLID原则,学习理解能够帮忙我们写出更健壮的代码。SOLID是五个基本原则的首字母。这五个原则如下:Single responsibilityOpen–closedLiskov substitutionInterface segregationDependency inversion此篇来学习一下接口隔离原则(Interface Segregation Principle)接口隔离原则:Clients should not.

2022-02-23 13:30:00 257

原创 依赖反转(倒置)原则(Dependency inversion principle,DIP)

在软件设计、编码过程中有几个基本原则即SOLID原则,学习理解能够帮忙我们写出更健壮的代码。SOLID是五个基本原则的首字母。这五个原则如下:Single responsibilityOpen–closedLiskov substitutionInterface segregationDependency inversion此篇来学习一下依赖反转(倒置)原则(Dependency Inversion Principle)定义如下:A. High-level mod.

2022-02-22 10:56:20 2039

原创 里氏替换原则(Liskov Substitution principle)

在软件设计、编码过程中有几个基本原则即SOLID原则,学习理解能够帮忙我们写出更健壮的代码。SOLID是五个基本原则的首字母。这五个原则如下:Single responsibilityOpen–closedLiskov substitutionInterface segregationDependency inversion此篇来学习一下里氏替换原则(Liskov Substitution responsibility)那么什么是里氏替换原则(LSP)呢?Barb.

2022-02-22 10:55:52 1205 2

原创 开闭原则(Open-closed principle)

在软件设计、编码过程中有几个基本原则即SOLID原则,学习理解能够帮忙我们写出更健壮的代码。SOLID是五个基本原则的首字母。这五个原则如下:Single responsibilityOpen–closedLiskov substitutionInterface segregationDependency inversion此篇来学习一下开闭原则(Open–closed responsibility)开闭原则即对扩展开放对修改关闭。即在不改变本身代码的情况下其行为能.

2022-02-22 10:55:07 3337

原创 单一职责原则(Single Responsibility Principle)

相信很多人都听过单一职责原则(Single Responsibility Principle),那么什么是单一职责原则,怎么才算单一职责原则呢,单一职责原则又有什么好处呢。记得当初刚开始进入项目组做需求的时候,完全不清楚什么设计模式、架构。一个问题单就困扰很久,慢慢搬砖越来越多,对项目的代码结构、业务有了一定的了解之后,回头看看自己写的代码,真是不忍直视。有一次写发送邮件的代码,将组装邮件内容、附件、发送等全部柔和在一个类里面,然后一位老大哥给review代码的时候就发现问题了,说你这个类写的太乱了,把什

2022-02-16 17:02:03 748

原创 JAVA编程思想学习笔记----01

人们所能够解决的问题的fuzaxin

2014-09-08 11:15:49 259

log4j-1.2.17.zip

Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

2014-09-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除