Java基础(项目1)——项目设计分层 & dao + service

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
img

正文

实现:

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 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 it = list.iterator();
while (it.hasNext()){
Older older = it.next();
if (older.getId().equals(id)){
find = older;
break;
}
}
return find;
}

@Override
public List 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 loadFromFile() {
// 从硬盘读入内存,输入
List loadList = null;
try {
ObjectInputStream in = new ObjectInputStream(
new FileInputStream(Config.getDatPath())
);
loadList = (List) 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;

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

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
img

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

package com.tianju.older.util;

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

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

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-eXcusQKH-1713320819106)]

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值