网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**