Java基础(项目1)——项目设计分层 dao + service + test +ui + exception + log + util

news2024/12/30 3:49:27

目录

  • 引出
  • DAO层---和数据库交互
    • 1.通过IO流存储到dat文件
    • 2.通过JDBC存储到数据库
    • 【测试】用junit进行测试:@Test注解
  • Service层---处理业务
    • 1.项目设计分层初步
    • 2.service处理业务相关
    • 3.和UI层以及dao层进行交互
  • UI层界面---控制台,单例模式
    • 1.创建单例的方法
    • 2.页面的实现
  • Exception层----异常的处理
  • Test测试层----dao和service可测
    • 1.dao的测试
    • 2.service结合UI测试
  • resource层-----配置文件,数据文件
  • 项目的日志---log4j
    • 1.日志的级别
    • 2.日志的配置和使用
  • util层---工具,DbUtil,常量
    • 1.枚举的使用
    • 2.常量的定义
    • 3.DbUtil
  • 总结

引出

1.为什么建那么多层,dao,service…
2.项目设计分层初步;
3.本文以养老院老人信息管理、招聘应聘控制台项目为例;


在这里插入图片描述

DAO层—和数据库交互

1.通过IO流存储到dat文件

IO流及其项目应用初步

在这里插入图片描述

(1)类需要实现Serializable序列化接口

package com.tianju.older.entity;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.io.Serializable;
import java.util.Date;
import java.util.Objects;

@Setter@Getter
@AllArgsConstructor
@NoArgsConstructor
public class Older implements Serializable { // 实现序列化接口
    private String id;
    private String name;
    private Integer age;
    private Date inDate;

    @Override
    public String toString() {
        return "Older[" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", inDate=" + inDate +
                ']';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Older older = (Older) o;
        return Objects.equals(id, older.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
}

(2)dao层的接口和实现分离

接口:

package com.tianju.older.dao;

import com.tianju.older.entity.Older;

import java.util.List;

/**
 * Older的dao类
 */
public interface IOlderDao {
    // 保存老人信息
    void save(Older older);
    // 删除老人信息
    void delete(Older older);
    // 更新老人信息
    void update(Older older);
    // 根据id找老人信息
    Older findById(String id);
    // 找到全部老人信息
    List<Older> findAll();
    // 保存到文件的方法
    void saveToFile();
    // 从文件中读取成老人类的方法
    List<Older> loadFromFile();
}

实现:

package com.tianju.older.dao.impl;

import com.tianju.older.dao.IOlderDao;
import com.tianju.older.entity.Older;
import com.tianju.older.exception.NotFoundOlderException;
import com.tianju.older.util.Config;
import org.apache.log4j.Logger;

import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;

public class OlderDaoImpl implements IOlderDao {
    List<Older> list = null;

    // 如果读取到的loadFromFiLe不为null,则赋值给list;
    // 否则new 出来
    public OlderDaoImpl() {
        List<Older> olders = loadFromFile();
        if (Objects.isNull(olders)){
            list = new ArrayList<>(20);
        }else {
            list = olders;
        }
    }

    @Override
    public void save(Older older) {
        list.add(older);
        Logger.getLogger(this.getClass()).info("addOlder: " + older);
        saveToFile();
    }

    @Override
    public void delete(Older older) {
        // 先看能不能找到
        Older find = findById(older.getId());
        // 如果找到,删除;没找到,抛出异常,并记录日志
        if (Objects.isNull(find)){
            throw new NotFoundOlderException("404异常,该老人信息不存在,未删除");
        }
        Logger.getLogger(this.getClass()).info("deleteOlder: " + find);
        list.remove(older);
        saveToFile(); // 文件更新
    }

    @Override
    public void update(Older older) {
        // 找到index,用set方法更新
        Older find = findById(older.getId()); // 根据ID定位老人
        if (Objects.isNull(find)){
            throw new NotFoundOlderException("404异常,该老人信息不存在,无法修改");
        }
        // 记录日志信息
        Logger.getLogger(this.getClass()).info("beforeUpdate: " + find);
        int index = list.indexOf(find);
        list.set(index,older);
        Logger.getLogger(this.getClass()).info("afterUpdate: "+older);
        // 刷新文件
        saveToFile();
    }

    @Override
    public Older findById(String id) {
        Older find = null;
        Iterator<Older> it = list.iterator();
        while (it.hasNext()){
            Older older = it.next();
            if (older.getId().equals(id)){
                find = older;
                break;
            }
        }
        return find;
    }

    @Override
    public List<Older> findAll() {
        return list;
    }

    @Override
    public void saveToFile() {
        // 从内存写入硬盘,输出
        try {
            ObjectOutputStream out = new ObjectOutputStream(
                    new FileOutputStream("D:\\Myprogram\\idea-workspace\\Older_v2.6\\Older_v2.6\\src\\com\\woniuxy\\older\\resources\\older.dat")
            );
            out.writeObject(list);
            Logger.getLogger(OlderDaoImpl.class).info("save保存"+list.size()+"信息");
            out.flush();
            out.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public List<Older> loadFromFile() {
        // 从硬盘读入内存,输入
        List<Older> loadList = null;
        try {
            ObjectInputStream in = new ObjectInputStream(
                    new FileInputStream(Config.getDatPath())
            );
            loadList = (List<Older>) in.readObject();
            in.close();

        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        return loadList;

    }
}

2.通过JDBC存储到数据库

参考下面文章:

java连接SQL数据库 & 单例封装数据库

【测试】用junit进行测试:@Test注解

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

Service层—处理业务

1.项目设计分层初步

引入前端后,MVC模型:视图,模型,控制器
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

2.service处理业务相关

一个求职者和应聘者登陆和注册的业务接口

package com.qianbaidu.recruit.service;

import com.qianbaidu.recruit.entity.Boss;
import com.qianbaidu.recruit.entity.Emp;

/**
 * 用户登陆的服务接口
 */
public interface ILoginService {
    boolean login(String role);
    boolean sign(String role);

    // 返回登陆后的id,默认的id为-1,或者null
    // 0老板,1应聘者;-1,未登录成功,登陆成功返回id
    String[] execute();


}

3.和UI层以及dao层进行交互

在这里插入图片描述

UI层界面—控制台,单例模式

image-20230515110833830

1.创建单例的方法

创建单例的方法

2.页面的实现

用枚举的方式实现单例

package com.qianbaidu.recruit.ui;

import java.util.List;
import java.util.Scanner;
import java.util.Set;

public enum ApplicantMenuUI {
    APPLY_UI;
    
    private Scanner sc;


    private ApplicantMenuUI(){
        sc = new Scanner(System.in);
    }
    
    
    // 主界面 公司查询,信息修改,职位查询,企业打分
    public String appExecuteUI(){
        System.out.println("------------------欢迎您进入 众里寻他 招聘信息网站的 应聘者主界面------------------------");
        System.out.println("1.进行个人信息修改");
        System.out.println("2.进行公司的查询");
        System.out.println("3.进行职位的查询");
        System.out.println("4.查看个人申请记录");
        System.out.println("5.对企业进行评分");
        System.out.println("0.返回上一级界面");
        return sc.nextLine();
    }

}

Exception层----异常的处理

(1)自定义异常—用户登陆异常

package com.qianbaidu.recruit.exception;

/**
 * 402异常,用户登陆异常
 */
public class LoginIllegalException extends RuntimeException{
    public LoginIllegalException(String message) {
        super(message);
    }
}

(2)使用异常类进行登陆验证

    private Emp loginEmp(){
        // 用户名错误
        String[] loginInput = LoginMenu.loginUI("1");//(企业0,求职者1)
        if (dao.findEmpByLoginName(loginInput[0])==null){
            throw new LoginNameNotFoundException("404异常,用户名"+loginInput[1]+"不存在,请注册");
        }
        Emp loginEmpLoginNameTrue = dao.findEmpByLoginName(loginInput[0]);
        // 用户名/密码错误
        if (dao.findEmpLoginNameAndPassword(loginInput[0],loginInput[1])==null){
            throw new LoginIllegalException("405异常,用户名|密码错误,请重新输入+" + loginEmpLoginNameTrue.getUsername());
        }
        Emp loginEmp = dao.findEmpLoginNameAndPassword(loginInput[0],loginInput[1]);
        Logger.getLogger(this.getClass()).info("应聘者用户 "+loginEmp.getUsername()+" 登陆");
        return loginEmp;
    }

Test测试层----dao和service可测

1.dao的测试

Dao层的测试,用junit4

package com.tianju.older.test;

import com.tianju.older.dao.IOlderDao;
import com.tianju.older.dao.impl.OlderDaoImpl;
import com.tianju.older.entity.Older;
import org.junit.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * dao的测试类
 */
public class OlderDaoImplTest {
    private IOlderDao dao = new OlderDaoImpl();
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");

    @Test
    public void save() throws ParseException {
        dao.save(new Older("1", "小王", 28, sdf.parse("2023-04-07")));
        dao.save(new Older("2", "小张", 26, sdf.parse("2023-05-07")));
        dao.save(new Older("3", "小李", 24, sdf.parse("2021-06-07")));
        dao.save(new Older("3", "小鹏", 24, sdf.parse("2022-04-10")));
        System.out.println(dao.findAll());
    }


    @Test
    public void loadFromFile() {
        System.out.println(dao.loadFromFile());
        System.out.println(dao.findAll());
    }

    @Test
    public void delete() {
        dao.loadFromFile();
        System.out.println(dao.findAll());
        // 删除
        dao.delete(new Older("2",null,null,null));
        // 删除是否保存成功
        System.out.println(dao.loadFromFile());

    }
}

2.service结合UI测试

如果涉及到控制台的输入,则不能用junit

package com.qianbaidu.recruit.test;

import com.qianbaidu.recruit.dao.IApplicantDao;
import com.qianbaidu.recruit.dao.impl.ApplicantDaoImpl;
import com.qianbaidu.recruit.service.IApplicantService;
import com.qianbaidu.recruit.service.impl.ApplicantServiceImpl;

public class ApplyMainTest {
    public static void main(String[] args) {
        IApplicantService ias = new ApplicantServiceImpl();
        while (true){
            ias.execute(1);
        }
    }
}

resource层-----配置文件,数据文件

在这里插入图片描述
可以参考下面博客:

IO流及其项目应用初步

在本控制台项目中,resources文件夹包括以下文件

  • 户名密码存储的文件,login.properties文件;
  • log4j日志记录文档,log.log文件;
  • 保存数据信息的文件,older.dat文件;
    在这里插入图片描述

在这里插入图片描述

项目的日志—log4j

日志是文件,记录一些信息。记录重要的,登录信息,操作,异常信息。

1.日志的级别

在这里插入图片描述

DEBUG: 项目开发人员的测试
INFO: 一般信息(开发人员,其他)
WARN: 警告(开发人员警告使用者)
ERROR: 系统比较严重问题
FATAL: 非常严重的问题

控制的日志可见性
在这里插入图片描述

2.日志的配置和使用

其中的log4j配置文件目录和内容如下:

在这里插入图片描述
配置文件内容:

log4j.rootLogger=DEBUG,Console,F
#显示在控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout 
log4j.appender.Console.layout.ConversionPattern=[%p],%d{yyyy-MM-dd HH:mm:ss},[%t],%rms,[%m]%n
#在文件输出
log4j.appender.F=org.apache.log4j.RollingFileAppender
log4j.appender.F.File=d:\\log.log
log4j.appender.F.layout=org.apache.log4j.PatternLayout 
log4j.appender.F.layout.ConversionPattern=[%p],%d{yyyy-MM-dd HH:mm:ss},[%t],%rms,[%m]%n

util层—工具,DbUtil,常量

1.枚举的使用

枚举类型作用
替代常量的。编码规范: 魔鬼常量

if(choice == 1)

switch(a){

case 1:break;

}

在这里插入图片描述
枚举的定义代码:

package com.tianju.older.util;

/**
 * 业务的选择
 * 登陆后选择,1.录入老人信息;2.修改老人信息;3.删除老人信息;4.查询老人信息;0.返回登陆界面
 */
public enum Choice {
    ADD_MES,UPDATE_MES,DELETE_MES,QUERY_ALL,BACK_LOGIN;

    /**
     * 根据客户输入的数字转换成枚举类型
     * @param ch 输入的数字
     * @return 转换成的枚举类型
     */
    public static Choice get(String ch){
        if (ch.equals("1")){
            return ADD_MES;
        }else if (ch.equals("2")){
            return UPDATE_MES;
        } else if (ch.equals("3")){
            return DELETE_MES;
        } else if (ch.equals("4")){
            return QUERY_ALL;
        }else {
            return BACK_LOGIN;
        }
    }
}

使用枚举类型代替魔鬼常量:

比如在页面里让用户在控制台输入,0~4进行操作选择

public static String welcome(){
        System.out.println("-------------------欢迎进入老人信息管理系统-------------------");
        // 登陆后选择,1.录入老人信息;2.修改老人信息;3.删除老人信息;4.查询老人信息;0.返回登陆界面
        System.out.println("1.录入老人信息");
        System.out.println("2.修改老人信息");
        System.out.println("3.删除老人信息");
        System.out.println("4.查询老人信息");
        System.out.println("0.返回登陆界面");
        System.out.println("-----------------------------------------");
        System.out.print("请输入选择:");
        // 正则表达式判断
        String in = sc.nextLine();
        String regex = "[0-4]{1}";
        if (!in.matches(regex)){
            System.out.println("输入错误,请输入0-4之间的数字");
        }
        return in;
    }

然后在这里用枚举代替魔鬼常量,让代码可读性增强;

 private void welcome(){
        boolean isContinue = true;
        while (isContinue) {
            String ch = OlderMenu.welcome();
            Choice c = Choice.get(ch);
            switch (c){
                case ADD_MES:
                    addOlder();
                    break;
                case UPDATE_MES:
                    updateOlder();
                    break;
                case DELETE_MES:
                    deleteOlder();
                    break;
                case QUERY_ALL:
                    findAll();
                    break;
                case BACK_LOGIN:
                    isContinue = false;
                    System.out.println("------------再见,欢迎再次登陆------------");
                    break;
            }
        }
    }

2.常量的定义

比如下面,用数字0~3来表示公司规模为1-20人,20-100人,100-500人,以及大于500人这几种公司规模

package com.qianbaidu.recruit.util;

import com.qianbaidu.recruit.exception.InputIllegalException;

public class Constance {
    public final static String COMPANY_LESS20 = "1~20人";
    public final static String COMPANY_LESS100 = "20~100人";
    public final static String COMPANY_LESS500 = "100~500人";
    public final static String COMPANY_MORE500 = "大于500人";

    public static String showCompanySize(int size){
        if (size==0){
            return COMPANY_LESS20;
        }else if(size==1){
            return COMPANY_LESS100;
        }else if (size==2){
            return COMPANY_LESS500;
        }else if (size==3){
            return COMPANY_MORE500;
        }
        return null;
    }
}

在公司信息的实体类的toString方法中调用showCompanySize()方法把数字转成常量对应的中文;

    @Override
    public String toString() {
        return "\nCompany{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", size=" + Constance.showCompanySize(size) +
                ", address='" + address + '\'' +
                ", type='" + type + '\'' +
                ", web='" + web + '\'' +
                ", phone='" + phone + '\'' +
                ", person='" + person + '\'' +
                ", desc='" + desc + '\'' +
                ", rate=" + rate +
                ", rates=" + rates +
                '}';
    }

3.DbUtil

参考下面文章:

java连接SQL数据库 & 单例封装数据库


总结

1.关于控制台项目中使用到Java基础知识;
2.实体类和dao层,增删改查CRUD分离,从IO流到JDBC,SQL语句;
3.dao层和service层,dao层和数据库交互,service层处理业务,初步了解程序设计思想;
4.测试:dao层和service层的方法要可测,@Test注解,涉及控制台输入不能用@Test;
5.控制台的UI层处理控制台的输入,学习单例创建UI类的方法;
6.异常类,用自定义异常处理业务,初步学习Java的异常机制;
7.配置文件,resources层,用配置文件实现程序解耦,初步了解程序设计思想;
8.日志文件:log4j的配置,软件要有日志,日志的级别;
9.工具类:枚举类的使用,常量的定义,JDBC封装方式,创建单例的三种方法;

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

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

相关文章

牛客-【237题】算法基础精选题单

2023年06月02日更新 NOIP2007 字符串的展开NOIP2009 多项式输出NOIP2010 机器翻译 NOIP2007 字符串的展开 第一道题目花费的时间是最多的&#xff0c;还wa了几次 需要特别注意的一个特殊情况时 1-a 这个时候a的ASCII是大于1的&#xff0c;需要满足的一个条件是’-前后的符号属…

Bugku 本地管理员

打开链接 F12查看源码&#xff0c;发现了一个base64字符串 解码得到test123&#xff0c;猜测是密码 输入用户admin&#xff0c;密码test123 尝试登录&#xff0c;发现不行 要求似乎只允许本地访问&#xff0c;于是使用bp抓包改包后重发 在请求头加上 x-forwarded-for: 127.0…

Unity中影响性能的因素

原文链接&#xff1a;https://blog.csdn.net/Mq110m/article/details/130435557 Unity中的渲染优化 移动平台的特点 PC平台相比&#xff0c;移动平台上的GPU架构有很大的不同。由于处理资源等条件的限制&#xff0c;移动设备上的GPU架构专注于尽可能使用更小的带宽和功能&am…

【高数+复变函数】Laplace变换的性质

文章目录 【高数复变函数】Laplace变换的性质一、性质1. 线性性质2. 微分性质3. 像函数的微分性质4. 积分性质5. 象函数的积分性质6. 位移性质7. 延迟性质 【高数复变函数】Laplace变换的性质 通过上一节【高数复变函数】Laplace变换的学习&#xff0c;我们知道了Laplace的基本…

MySQL】- 04 MVCC实现原理

MVCC的实现原理 隐式字段undo日志Read View(读视图)整体流程例子 MVCC的目的就是多版本并发控制&#xff0c;在数据库中的实现&#xff0c;就是为了解决读写冲突&#xff0c;它的实现原理主要是依赖记录中的 3个隐式字段&#xff0c;undo日志 &#xff0c;Read View 来实现的。…

同时处理多个聊天,无需头疼

引入实时聊天的想法令人生畏。您正在打开新渠道的闸门&#xff0c;这是添加到您已经不断增长的要管理的应用程序列表中的另一件事。如果实时聊天给您和您的团队增加了如此大的压力&#xff0c;那么也势必不会有很大的成效。 实时聊天正日益成为一种必不可少的支持工具&#xf…

Compose 中 TextField 的有效状态管理

Compose 中 TextField 的有效状态管理 为了防止同步问题和意外行为: 避免在输入和更新TextField状态之间出现延迟/异步行为。避免使用响应式流收集StateFlow的数据来保存TextField状态&#xff0c;例如使用默认调度程序。使用Compose API&#xff0c;例如MutableState<Stri…

C++练习

整理思维导图有以下定义&#xff0c;说明哪些量可以改变哪些不可以改变&#xff1f; const char *p; const (char *) p; char *const p; const char* const p; char const *p; (char *) const p; char const* const p; 3.总结命名空间使用时的方式和注意事项 1. 2. const cha…

Spring IOC - FactoryBean源码解析

​​​​​1. 介绍 FactoryBean是Spring框架中的一个接口&#xff0c;它允许我们自定义一个工厂类&#xff0c;用于创建和管理Spring容器中的Bean实例。FactoryBean接口定义了两个方法&#xff1a; getObject()&#xff1a;用于返回一个Bean实例&#xff0c;这个方法可以自定义…

创建型设计模式04-建造者模式

✨作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 建造者模式 1、建造者模式介绍 建造者模式是一种创建型设计模式&#xff0c;用于将一个复杂对象的构造过程与其表示分离开来&…

七面蚂蚁金服,超硬核面经,已拿Offer!!

刚面试了蚂蚁金服&#xff0c;给大家分享下这些硬核的面试经验 一面&#xff1a;50分钟 1.自我介绍 2.之前的实习经历提问 3.实习做过什么项目&#xff0c;负责什么 4.进程线程 5.java的垃圾回收 6.数据库简单sql语句 7.事务隔离 8.测试微信点赞 9.对测试的了解 10.编程&…

【LeetCode每日一题】——2269.找到一个数字的 K 美丽值

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 滑动窗口 二【题目难度】 简单 三【题目编号】 2269.找到一个数字的 K 美丽值 四【题目描述…

第二十二篇、基于Arduino uno,控制五线四相步进电机实现正转和反转——结果导向

0、结果 说明&#xff1a;步进电机可以旋转指定角度&#xff0c;例如转了九十度就停止&#xff0c;如果想一直转也是可以的&#xff0c;程序里面已写&#xff0c;而且也有正反转。如果是你想要的&#xff0c;可以接着往下看。 1、外观 说明&#xff1a;五线四相步进电机如下…

自然语言处理从入门到应用——文本的表示方法

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 若要利用计算机对自然语言进行处理&#xff0c;首先需要解决语言在计算机内部的存储和计算问题。字符串&#xff08;String&#xff09;是文本最自然&#xff0c;也是最常用的机内存储形式。所谓字符串&#xff0c;即字…

rtty移植到MTK OpenWRT平台

准备工具链 使用MTK Openwrt 相应平台工具链&#xff0c;不能使用buildroot的工具链&#xff0c;否则程序无法运行&#xff0c;本文MTK7621为例工具链官网下载地址 构建libev rtty依赖libev库&#xff0c;因此需要先构建libev git clone https://github.com/enki/libev.git …

C语言-外部关键字extern

extern 关键字 extern 用在全局变量或函数的声明前&#xff0c;用来说明“此变量/函数是在别处定义的&#xff0c;要在此处引用。 什么是定义&#xff0c;什么是声明? 什么是定义:所谓的定义就是为这个变量分配一块内存并给它取上一个名字&#xff0c;这个名字就是我们经…

《多传感器融合感知》一、构建自动驾驶多传感器系统

来自 &#xff1a; https://www.bilibili.com/video/BV1JY4y1R7Be/ 多传感器融合的需求多传感器硬件系统构建多传感器硬件系统的时序闭环 1. 多传感器融合的需求 自动驾驶用来解决的问题&#xff1a; 建图定位、感知问题&#xff08;路上有什么、堵不堵、好不好走…&#xff…

数据可视化系列指南之分布类图表大全

导语 随着数据在各行业中的应用越来越广泛&#xff0c;大家也逐渐认识到数据可视化在企业生产经营中的重要作用&#xff0c;在数据可视化过程中&#xff0c;图表是处理数据的重要组成部分&#xff0c;因为它们是一种将大量数据压缩为易于理解的格式的方法。数据可视化可以让受…

生态系统服务评估方法 | 人类活动影响、重大工程实施的生态成效评估(InVEST模型)

以InVEST模型结合实际项目进行由浅入深的实战技术&#xff0c;针对特点及需求进行分析&#xff0c;融合课程体系&#xff0c;对接工作实际项目及论文写作&#xff0c;解决参会者关注的重点及实际项目过程问题&#xff0c;采取逐步延伸的逻辑&#xff0c;不论您是小白亦或是已经…

数据库磁盘文件格式的设计原理内幕

引言 访问磁盘需通过系统调用来实现&#xff0c;因此通常我们需要指定目标文件的偏移量&#xff0c;然后把数据从磁盘上的形式解析成合适主存的形式。这意味着要想设计一个高效的磁盘数据结构&#xff0c;必须构造一种易于修改和解析的文件格式。在本文中&#xff0c;我们将讨论…