A role-based recruitment system built with Java SE, JDBC, and MySQL.
Job seekers can search for jobs, build a resume, manage their profile, and track applications.
Employers can manage company profiles, post jobs, manage applicants, and view hiring statistics β all from the terminal.
| Feature | Description |
|---|---|
| Registration | Separate seeker flow with optional profile fields (phone, education, skills, certifications) |
| Login & Password Reset | Email-based auth with security Q&A for password reset |
| Profile Management | Update phone, education, work experience, skills, certifications anytime |
| Profile Completion | Percentage tracker (5 profile fields, 20% each) |
| Resume | Create and update a structured resume (objective, education, experience, skills, projects) |
| Job Search | Browse all jobs or filter by title, location, type, experience, company name, salary range |
| View Job Details | Full details: description, skills required, education req, salary range, deadline |
| Apply | Apply with optional cover letter; validates resume exists and no duplicates |
| Applications | View status, job title, company, date, employer comments; APPLIED/SHORTLISTED/REJECTED/WITHDRAWN |
| Withdraw | Confirmation prompt with optional reason; sets status to WITHDRAWN (preserves record) |
| Notifications | In-app alerts with unread count badge; mark as read individually or all at once |
| Feature | Description |
|---|---|
| Registration | Separate employer flow; prompted to create company after login |
| Company Profile | Create, view, and update company profile (name, industry, size, website, description, location) |
| Job Management | Post (with description, skills required, education req, salary range, deadline), edit, close, reopen, delete jobs |
| Applicant View | View all applicants per job with formatted tables |
| Filter Applicants | Filter by skills, education, experience, application date |
| Actions | Shortlist / reject individually or in bulk with notifications to each applicant |
| Comments | Add review comments on application (triggers notification to applicant) |
| Statistics | View applied / shortlisted / rejected / withdrawn counts per job |
| Resume View | View any applicant's resume by application ID |
| Notifications | View notifications with unread badge, mark all as read |
| Layer | Technology |
|---|---|
| Language | Java 17+ |
| Database | MySQL 8+ |
| Persistence | JDBC (PreparedStatement) |
| Build | Maven |
| Logging | Log4j 2 (console + rolling file) |
| Testing | JUnit 5 |
src/main/java/com/revhire/
βββ app/ Main.java β Console UI, menus, input helpers
βββ config/ DBConfig.java β DB connection constants
βββ util/ DBUtil.java β JDBC connection factory
βββ model/ User, Job, Company, Application, Resume, Notification
βββ dao/ Interfaces (UserDao, JobDao, etc.)
β βββ impl/ JDBC implementations
βββ service/ AuthService, JobSeekerService, EmployerService
src/test/java/com/revhire/service/
βββ AuthServiceTest.java
βββ EmployerServiceTest.java
βββ JobSeekerServiceTest.java
sql/
βββ schema.sql β Complete DB schema (6 tables)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PRESENTATION LAYER β
β ββββββββββββββββββββββββββββββββββββββββ-βββββββββββββ β
β β Main.java β β
β β β’ Welcome Menu (Register Seeker / Employer / Login) β
β β β’ Job Seeker Menu (15 options) β β
β β β’ Employer Menu (21 options) β β
β β β’ Input validation & display formatting β β
β ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββ€
β SERVICE LAYER β
β ββββββββββββ ββββββββββββββββ ββββββββββββββββββββ β
β βAuthServiceβ βJobSeekerSvc β β EmployerService β β
β ββ’ register β ββ’ searchJobs β ββ’ postJob β β
β ββ’ login β ββ’ applyJob β ββ’ bulkShortlist β β
β ββ’ password β ββ’ createResumeβ ββ’ filterApplicantsβ β
β ββ’ profile β ββ’ withdraw β ββ’ deleteJob β β
β ββ’ getUserByβ ββ’ notificationsβ ββ’ updateCompany β β
β βββββββ¬ββββββ ββββββββ¬ββββββββ ββββββββββ¬ββββββββββ β
ββββββββββΌββββββββββββββββΌβββββββββββββββββββββΌββββββββββββ€
β DAO LAYER (Interfaces) β
β ββββββββββ ββββββββ βββββββββββ ββββββββββββ β
β βUserDao β βJobDaoβ βResumeDaoβ βCompanyDaoβ β
β βββββ¬βββββ ββββ¬ββββ βββββ¬ββββββ ββββββ¬ββββββ β
β ββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β βApplicationDaoβ βNotificationDaoβ β β
β ββββββββ¬βββββββ ββββββββ¬ββββββββ β β
βββββββββββΌβββββββββββββββΌβββββββββββββββββββββββββ€ β
β DAO IMPL LAYER β β
β β’ PreparedStatement for all queries β β
β β’ Transaction management (delete job) β β
β β’ Dynamic WHERE clause building (search/filter) β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β
β DATABASE (MySQL 8+) β β
β ββββββββ ββββββ βββββββββ βββββββββββββββ β β
β βusers β βjobsβ βresumesβ βapplications β β β
β ββββββββ ββββββ βββββββββ βββββββββββββββ β β
β βββββββββββ ββββββββββββββββ β β
β βcompaniesβ βnotifications β β β
β βββββββββββ ββββββββββββββββ β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
Design principles:
- Interface-driven DAO layer (easy to swap implementations)
- Service layer enforces business rules (resume-before-apply, no duplicate applications, ownership checks)
- PreparedStatements prevent SQL injection
- Log4j 2 logs every action to console +
logs/revhire.log - Notifications sent automatically on: apply, shortlist, reject, bulk actions, comments
- Profile completion tracking calculated dynamically
ββββββββββββββββββββββββββββββββ βββββββββββββββββββββββββββββββββββ
β USERS β β COMPANIES β
ββββββββββββββββββββββββββββββββ€ βββββββββββββββββββββββββββββββββββ€
β PK id INT AUTO β β PK id INT AUTO β
β name VARCHAR β β FK employer_id INT (UNIQUE) ββββ
β email VARCHAR UQ β β name VARCHAR β β
β password VARCHAR β β industry VARCHAR β β
β role ENUM β β size VARCHAR β β
β phone VARCHAR β β description TEXT β β
β education TEXT β β website VARCHAR β β
β work_experience TEXT β β location VARCHAR β β
β skills TEXT β β created_at TIMESTAMP β β
β certifications TEXT β βββββββββββββββββββββββββββββββββββ β
β security_question VARCHARβ β
β security_answer VARCHAR β β
β created_at TIMESTAMP β β
ββββββββββββ¬ββββββββββββββββββββ β
β β
β 1:1 1:1 β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
β 1:N 1:N
β β
ββββββββ΄βββββββββββββββββββ ββ΄βββββββββββββββββββββββββββββββββββββ
β RESUMES β β JOBS β
βββββββββββββββββββββββββββ€ βββββββββββββββββββββββββββββββββββββββ€
β PK id INT AUTO β β PK id INT AUTO β
β FK user_id INT (UQ) β β FK employer_id INT β
β objective TEXT β β title VARCHAR β
β education TEXT β β description TEXT β
β experience TEXT β β company VARCHAR β
β skills TEXT β β location VARCHAR β
β projects TEXT β β experience INT β
β created_at TIMESTAMPβ β salary_min DECIMAL β
βββββββββββββββββββββββββββ β salary_max DECIMAL β
β job_type ENUM β
β skills_required TEXT β
β β education_req VARCHAR β
β β deadline DATE β
β β status ENUM β
β β created_at TIMESTAMP β
β ββββββββββββ¬βββββββββββββββββββββββββββ
β β
β 1:N β 1:N
β β
β ββββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββ
β β APPLICATIONS β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β PK id INT AUTO β
β β FK user_id INT ββββ USERS.id β
β β FK job_id INT ββββ JOBS.id β
β β status ENUM (APPLIED/SHORTLISTED/ β
β β REJECTED/WITHDRAWN) β
β β cover_letter TEXT β
β β withdraw_reason VARCHAR β
β β comment TEXT β
β β applied_at TIMESTAMP β
β β UNIQUE(user_id, job_id) β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
β 1:N
β
ββββββββ΄βββββββββββββββββββββββββββββββββββββββββββ
β NOTIFICATIONS β
ββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β PK id INT AUTO β
β FK user_id INT ββββ USERS.id β
β message TEXT β
β is_read BOOLEAN (DEFAULT FALSE) β
β created_at TIMESTAMP β
ββββββββββββββββββββββββββββββββββββββββββββββββββββ
Relationships:
USERS 1 ββββ 1 RESUMES (one resume per job seeker)
USERS 1 ββββ 1 COMPANIES (one company per employer)
USERS 1 ββββ N JOBS (employer posts many jobs)
USERS 1 ββββ N APPLICATIONS (seeker applies to many jobs)
JOBS 1 ββββ N APPLICATIONS (one job has many applicants)
USERS 1 ββββ N NOTIFICATIONS (one user gets many notifications)
Six tables with foreign keys and constraints:
| Table | Purpose | Key Columns |
|---|---|---|
users |
Accounts with role (JOB_SEEKER / EMPLOYER) and profile | phone, education, work_experience, skills, certifications |
jobs |
Listings with full details | description, skills_required, education_req, salary_min/max, deadline |
resumes |
One resume per user (UNIQUE constraint) | objective, education, experience, skills, projects |
applications |
UserβJob with status tracking | cover_letter, withdraw_reason, status (4 states), comment |
companies |
One company profile per employer | size, website, industry, description |
notifications |
Alerts for status changes, comments, etc. | is_read, created_at |
- Java 17 or higher
- MySQL 8+
- Maven 3.8+
mysql -u root -p < sql/schema.sqlEdit src/main/java/com/revhire/config/DBConfig.java:
public static final String URL = "jdbc:mysql://localhost:3306/revhire";
public static final String USER = "root";
public static final String PASS = "your_password";mvn clean compileOpen the project in IntelliJ β run Main.java (right-click β Run).
Or from terminal:
mvn -q exec:java -Dexec.mainClass="com.revhire.app.Main"mvn testNote: Tests are integration tests that require a running MySQL instance with the
revhiredatabase.
- Separate registration flows β Job Seekers provide profile fields; Employers are prompted to create a company
- Profile completion tracking β 5 profile fields (phone, education, work experience, skills, certifications); percentage shown in menu
- Resume required β job seekers must create a resume before applying
- No duplicate applications β enforced at both service and DB level (UNIQUE constraint)
- Cover letter support β optional cover letter submitted with each application
- Withdraw with reason β confirmation prompt; sets status to WITHDRAWN (preserves audit trail)
- Role-based access β job seekers and employers see completely different menus
- Employer ownership β employers can only edit/close/delete their own jobs
- Delete job β cascading delete removes all associated applications (with confirmation)
- Notifications β automatic alerts on: apply, shortlist, reject, bulk actions, comments
- Unread badge β notification count shown in menu header
- Salary range β jobs specify min/max salary; search supports range filtering
- Password security β change password requires old password; reset requires security Q&A
| Status | Description |
|---|---|
APPLIED |
Initial state when seeker applies |
SHORTLISTED |
Employer moved applicant forward |
REJECTED |
Employer declined the application |
WITHDRAWN |
Seeker withdrew their application (with optional reason) |
All actions are logged via Log4j 2:
- Console β compact format (
HH:mm:ss LEVEL Class β message) - File β detailed format in
logs/revhire.log(rolling) - Events logged: registration, login, job posting, applications, status changes, bulk actions, errors
This project is for educational purposes.