2024年Java基础(项目1)——项目设计分层 & dao + service (4),2024年展望软件测试原生开发的现状

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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 findAll();
// 保存到文件的方法
void saveToFile();
// 从文件中读取成老人类的方法
List 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 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注解


![在这里插入图片描述](https://img-blog.csdnimg.cn/94e28f1559ad459fa60a73efd518a11d.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/070d9e1bf8c2497d97bd11fc78efffa6.png)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/5c56241c3d63432dbe26d1bd2f19247d.png)


## Service层—处理业务


### 1.项目设计分层初步


引入前端后,MVC模型:视图,模型,控制器  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/523d89a5e61d4d8cb0113f1dbb24a044.png)![在这里插入图片描述](https://img-blog.csdnimg.cn/96f2c37778d64ad682124ad0e18d13e6.png)


![在这里插入图片描述](https://img-blog.csdnimg.cn/9a2055787d2f4590bb4aa2cd1a81a55e.png)


### 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层进行交互


![在这里插入图片描述](https://img-blog.csdnimg.cn/b19c2cf187534cb79c4318a977563ef9.png)


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


![image-20230515110833830](https://img-blog.csdnimg.cn/img_convert/1fb5e7a28c56c6273904ddb21daba15c.png)


### 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层-----配置文件,数据文件


![在这里插入图片描述](https://img-blog.csdnimg.cn/7655b6355f7b416bb04ff738847bc326.png)  
 可以参考下面博客:


[IO流及其项目应用初步]( )


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


* 户名密码存储的文件,login.properties文件;
* log4j日志记录文档,log.log文件;
* 保存数据信息的文件,older.dat文件;  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/17cea5c014d44237b317097d7ab52aaa.png)


![在这里插入图片描述](https://img-blog.csdnimg.cn/4b3bc196c12c483dada34d1cb5f67b17.png)


## 项目的日志—log4j



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


### 1.日志的级别


![在这里插入图片描述](https://img-blog.csdnimg.cn/cbbbd5f43f3042c5b5ee5ffdb5ce8247.png)



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


控制的日志可见性  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/ef7eaea96918471bb010ee4a69b08fbe.png)



![img](https://img-blog.csdnimg.cn/img_convert/be07a2ad7dc68d2bd46331394583670f.png)
![img](https://img-blog.csdnimg.cn/img_convert/ceee78ecb561667e1594268a2ffcd0d8.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

告(开发人员警告使用者)  
>  ERROR: 系统比较严重问题  
>  FATAL: 非常严重的问题
> 
> 
> 


控制的日志可见性  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/ef7eaea96918471bb010ee4a69b08fbe.png)



[外链图片转存中...(img-pfU0qnJz-1715108348072)]
[外链图片转存中...(img-QAZCULIw-1715108348072)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值