实现:

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注解

java项目层级目录_java项目层级目录

java项目层级目录_java_02


java项目层级目录_List_03

Service层—处理业务

1.项目设计分层初步

引入前端后,MVC模型:视图,模型,控制器

java项目层级目录_System_04

java项目层级目录_System_05

java项目层级目录_java_06

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

java项目层级目录_System_07

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

java项目层级目录_System_08

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()+” 登陆”);
 re

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

java项目层级目录_List_09


可以参考下面博客:

IO流及其项目应用初步

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

  • 户名密码存储的文件,login.properties文件;
  • log4j日志记录文档,log.log文件;
  • 保存数据信息的文件,older.dat文件;

java项目层级目录_java_10

项目的日志—log4j

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

1.日志的级别

java项目层级目录_java项目层级目录_11

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

控制的日志可见性

java项目层级目录_开发语言_12

2.日志的配置和使用

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

java项目层级目录_System_13


配置文件内容:

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;
}

java项目层级目录_System_14


枚举的定义代码:

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


枚举的定义代码:

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