欄目介紹
本欄目專為入門java學(xué)習(xí)者設(shè)計(jì)的一些簡單的入門項(xiàng)目
功能介紹
本項(xiàng)目為簡單的基于控制臺(tái)的通訊錄管理系統(tǒng),所需要的環(huán)境僅僅為jdk以及mysql(版本不限)!只有一個(gè)簡單的eclipse軟件以及我們的mysql可視化工具(視頻使用navicat)
本項(xiàng)目數(shù)據(jù)庫表有二個(gè),本項(xiàng)目是之前的單表項(xiàng)目的升級(jí)版本
本項(xiàng)目使用mvc設(shè)計(jì)模式,使用面向?qū)ο蟮拈_發(fā)思想
本項(xiàng)目使用最基礎(chǔ)的jdbc的方式鏈接的數(shù)據(jù)庫
本項(xiàng)目主要實(shí)現(xiàn)的功能有:
- 注冊登錄
- 系統(tǒng)運(yùn)行成功后的歡迎及菜單頁面
- 按照登錄人添加聯(lián)系人功能
- 按照登錄人進(jìn)行聯(lián)系人查詢功能(分名稱和手機(jī)號(hào)查詢)
- 按照登錄人顯示聯(lián)系人列表
- 按照登錄人根據(jù)編號(hào)刪除指定編號(hào)的聯(lián)系人
- 按照登錄人修改指定編號(hào)的聯(lián)系人
- 退出登錄
業(yè)務(wù)點(diǎn)處理:
當(dāng)前登錄人操作只能操作自己的數(shù)據(jù),用戶登錄成功后,顯示的列表只能顯示自己錄入的數(shù)據(jù)!
注冊:用戶表按照的是用戶名作為唯一標(biāo)識(shí),也就是不能注冊重復(fù)的用戶名
新增:對(duì)于不同用戶來說通訊錄的no是可以重復(fù)的,但是對(duì)于同一個(gè)用戶來說錄入的通訊通好友的編號(hào)no是不允許重復(fù)的
修改:用戶修改也是通過編號(hào)以及自己的登錄狀態(tài)來修改自己的數(shù)據(jù)
刪除:用戶刪除輸入的編號(hào)也是只針對(duì)自己的數(shù)據(jù)
項(xiàng)目實(shí)現(xiàn)截圖
項(xiàng)目結(jié)構(gòu):
數(shù)據(jù)表結(jié)構(gòu)
1.登錄用戶表
2.用戶的通訊錄數(shù)據(jù)表
頁面截圖
項(xiàng)目功能及代碼
1.JDBC數(shù)據(jù)庫連接工具類:
package com.maker.address.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 數(shù)據(jù)庫連接工具類
* @author Administrator
*
*/
public class DBUtil {
public static String db_url = "jdbc:mysql://localhost:3306/addressbook?serverTimezone=Asia/Shanghai&useSSL=false&useUnicode=true&characterEncoding=utf-8";
public static String db_user = "root";
public static String db_pass = "123456";
public static Connection getConn () {
Connection conn = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(db_url, db_user, db_pass);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 關(guān)閉鏈接
* @param state
* @param conn
*/
public static void close (Statement state, Connection conn) {
if (state != null) {
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 關(guān)閉鏈接
* @param state
* @param conn
*/
public static void close (ResultSet rs, Statement state, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (state != null) {
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2.運(yùn)行程序的主類:UserMain
主類中包含各種頁面顯示以及主方法入口
package com.maker.address.web;
import java.util.ArrayList;
import java.util.Scanner;
import com.maker.address.entity.Login;
import com.maker.address.entity.User;
import com.maker.address.service.LoginService;
import com.maker.address.service.UserService;
//主類 程序從這里的main方法開始
public class UserMain {
//靜態(tài)的user服務(wù)層對(duì)象
static UserService user = new UserService();
//靜態(tài)的用戶登錄服務(wù)層對(duì)象
static LoginService loginService = new LoginService();
//靜態(tài)的全局的用戶輸入對(duì)象
static Scanner sc = new Scanner(System.in);
//登錄對(duì)象保存
static Login LOGIN = null;
/**
* main方法執(zhí)行后先執(zhí)行start方法
* 這里就是對(duì)登錄注冊的頁面顯示的操作
*/
public static void start(){
System.out.println("=======請(qǐng)選擇=====");
System.out.println("【1】注冊");
System.out.println("【2】登錄");
int index = sc.nextInt();
//根據(jù)用戶輸入的操作來進(jìn)行下一步的指令
//每一個(gè)指令之后都是重新進(jìn)行start方法,只有在登錄成功的時(shí)候,登錄方法內(nèi)部進(jìn)入了into這個(gè)方法,就是進(jìn)入系統(tǒng)中了
switch(index){
case 1:
//注冊
toRegist();
start();
break;
case 2:
//登錄
login();
start();
break;
default:
System.out.println("請(qǐng)輸入正確的指令!");
start();
break;
}
}
//登錄方法
private static void login() {
// TODO Auto-generated method stub
System.out.println("請(qǐng)輸入用戶名:");
String username = sc.next();
System.out.println("請(qǐng)輸入密碼:");
String password = sc.next();
//根據(jù)輸入的用戶名密碼來調(diào)用服務(wù)層接口
LOGIN = loginService.toLogin(username, password);
if(LOGIN!=null){
//登錄成功的時(shí)候會(huì)返回?cái)?shù)據(jù)庫中的登錄對(duì)象,然后將對(duì)象賦值給全局的登錄對(duì)象,這樣在做其他操作的時(shí)候直接使用就行
//登錄成功后進(jìn)入系統(tǒng)中
into();
}
}
//注冊的方法
private static void toRegist() {
// TODO Auto-generated method stub
System.out.println("請(qǐng)輸入用戶名:");
String username = sc.next();
System.out.println("請(qǐng)輸入密碼:");
String password = sc.next();
System.out.println("請(qǐng)確認(rèn)密碼:");
String rePassword = sc.next();
//根據(jù)用戶輸入的用戶名密碼來進(jìn)行校驗(yàn)
if(password.equals(rePassword)){
//注冊成功不做其他操作,在start方法中會(huì)重新執(zhí)行start
loginService.toRegist(username, rePassword);
}else{
System.out.println("二次密碼輸入不一致!");
}
}
/**
* 這里就是用戶登錄成功后進(jìn)入系統(tǒng)的頁面顯示方法
*/
public static void into() {
System.out.println("=======通訊錄管理系統(tǒng)=====");
System.out.println("【1】添加聯(lián)系人");
System.out.println("【2】聯(lián)系人查詢");
System.out.println("【3】顯示聯(lián)系人列表");
System.out.println("【4】根據(jù)編號(hào)刪除指定編號(hào)的聯(lián)系人");
System.out.println("【5】修改指定編號(hào)的聯(lián)系人");
System.out.println("【0】退出");
System.out.println("=============================");
int i = sc.nextInt();
//接收用戶輸入的指令來進(jìn)行不同的操作
switch (i) {
case 1:
//添加聯(lián)系人
add();
into();
break;
case 2:
//聯(lián)系人查詢
System.out.println("【1】通過聯(lián)系人姓名查詢/【2】通過聯(lián)系人電話查詢");
int a = sc.nextInt();
findbyName(a);
into();
break;
case 3:
//顯示聯(lián)系人列表
show();
into();
break;
case 4:
//根據(jù)編號(hào)刪除指定編號(hào)的聯(lián)系人
del();
into();
break;
case 5:
//修改指定編號(hào)的聯(lián)系人
update();
into();
break;
case 0:
//退出
System.out.println("謝謝使用,再見!");
System.exit(0);
break;
default:
//不存在的指令
System.out.println("請(qǐng)輸入正確的指令!");
into();
break;
}
}
/**
* 修改用戶的方法
* 1.接收用戶輸入的聯(lián)系人編號(hào)以及修改的數(shù)據(jù)
* 2.然后中間進(jìn)行手機(jī)號(hào)驗(yàn)證以及郵箱驗(yàn)證
* 3.最后調(diào)用服務(wù)層updateUser方法去執(zhí)行修改操作
*/
private static void update() {
// TODO Auto-generated method stub
System.out.println("請(qǐng)輸入要修改的聯(lián)系人編號(hào):");
int a = sc.nextInt();
System.out.println("請(qǐng)輸入姓名:");
String b = sc.next();
System.out.println("請(qǐng)輸入手機(jī)號(hào):");
String c = sc.next();
judgePhone(c);
System.out.println("請(qǐng)輸入QQ:");
String d = sc.next();
System.out.println("請(qǐng)輸入郵箱地址:");
String e = sc.next();
judgeEmail(e);
User x = new User(a, b, c, d, e,LOGIN.getId());
if (user.updateUser(x)) {
System.out.println("修改成功!");
}
}
/**
* 新增方法
* 1.接收用戶輸入的相關(guān)信息
* 2.中間進(jìn)行手機(jī)號(hào)驗(yàn)證以及郵箱驗(yàn)證
* 3.調(diào)用服務(wù)器addUser新增接口
*/
public static void add() {
System.out.println("請(qǐng)輸入聯(lián)系人編號(hào):");
int a = sc.nextInt();
System.out.println("請(qǐng)輸入聯(lián)系人姓名:");
String b = sc.next();
System.out.println("請(qǐng)輸入聯(lián)系人手機(jī)號(hào):");
String c = sc.next();
judgePhone(c);
System.out.println("請(qǐng)輸入聯(lián)系人QQ:");
String d = sc.next();
System.out.println("請(qǐng)輸入聯(lián)系人郵箱地址:");
String e = sc.next();
judgeEmail(e);
User x = new User(a, b, c, d, e,LOGIN.getId());
if (user.addUser(x)) {
System.out.println("添加成功!");
}
}
/**
* 校驗(yàn)手機(jī)號(hào)
* 規(guī)則:11位 數(shù)字1開頭 第二位為34589 后面9位1-9任意
*
* 校驗(yàn)不通過后可以重新輸入
* @param phone 手機(jī)號(hào)
*/
public static void judgePhone(String phone) {
if (phone.matches("1[34589][0-9]{9}")) {
} else {
System.out.println("手機(jī)號(hào)輸入有誤,請(qǐng)重新輸入");
String v = sc.next();
judgePhone(v);
}
}
/**
* 校驗(yàn)郵箱
* 規(guī)則:不包括特殊字符 中間有@
*
* 校驗(yàn)不通過后可以重新輸入
* @param email 郵箱
*/
public static void judgeEmail(String email) {
if (email.matches("[A-Za-z0-9]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)")) {
} else {
System.out.println("郵箱格式輸入有誤,請(qǐng)重新輸入");
String v = sc.next();
judgeEmail(v);
}
}
/**
* 查詢聯(lián)系人方法
*
* 查詢方法調(diào)用user服務(wù)層接口然后參數(shù)加上當(dāng)前登錄人的id
*
* @param a 輸入的指令 1按照姓名 2按照電話
*/
public static void findbyName(int a) {
if (a == 1) {
System.out.println("請(qǐng)輸入聯(lián)系人姓名");
} else {
System.out.println("請(qǐng)輸入聯(lián)系人電話");
}
String name = sc.next();
User user = UserMain.user.searchByName(name,LOGIN.getId());
System.out.println(user);
}
/**
* 顯示所有聯(lián)系人的方法
* 調(diào)用user服務(wù)層接口根據(jù)當(dāng)前登錄人的id查詢
*/
public static void show() {
ArrayList list = user.showInfo(LOGIN.getId());
for (Object o : list) {
System.out.println(o);
}
}
/**
* 刪除方法
* 1.根據(jù)用戶輸入的要?jiǎng)h除的聯(lián)系人編號(hào)
* 2.調(diào)用user服務(wù)器接口根據(jù)當(dāng)前登錄人id以及要?jiǎng)h除的聯(lián)系人編號(hào)進(jìn)行刪除
*/
public static void del() {
System.out.println("請(qǐng)輸入編號(hào)");
int no = sc.nextInt();
if (user.delUser(no,LOGIN.getId())) {
System.out.println("刪除成功");
}
}
//運(yùn)行程序的主方法,右鍵運(yùn)行后會(huì)執(zhí)行start方法
public static void main(String[] args) {
start();
}
}
- user的服務(wù)層代碼
UserService
package com.maker.address.service;
import java.util.ArrayList;
import java.util.Objects;
import com.maker.address.dao.UserDao;
import com.maker.address.entity.User;
/**
* 用戶服務(wù)層
* @author Administrator
*
*/
public class UserService {
UserDao ud = new UserDao();
//新增用戶
public boolean addUser(User user){
//判斷編號(hào)是否存在,存在的話將不允許新增
User record = ud.queryByNo(user.getNo(),user.getUserId());
if(record!=null){
System.out.println("編號(hào)已存在!");
return false;
}
return ud.add(user);
}
/**
* 公共的查詢所有數(shù)據(jù)的方法
* 查詢出當(dāng)前登錄人的所有的聯(lián)系人
* @param userId 當(dāng)前登錄人id
* @return
*/
public ArrayList showInfo(Integer userId){
return ud.getAll(userId);
}
/**
* 通過名稱或者電話查詢聯(lián)系人
* 1.通過showInfo查詢當(dāng)前登錄人的所有聯(lián)系人
* 2.通過字段進(jìn)行過濾查詢出符合的聯(lián)系人
*
* @param name 用戶輸入的
* @param userId 當(dāng)前登錄人的id
* @return
*/
public User searchByName(String name,Integer userId){
ArrayList< User > s = showInfo(userId);
for (User user : s) {
if (Objects.equals(name,user.getName()) ||Objects.equals(name,user.getPhone())){
return user;
}
}
return null;
}
/**
* 修改方法
* @param user 要修改的實(shí)體
* @return
*/
public boolean updateUser(User user){
boolean num = ud.updateUser(user);
if(!num) {
System.out.println("該用戶不存在");
return false;
}
return true;
}
/**
* 刪除聯(lián)系人的方法
* 1.通過showInfo查詢當(dāng)前登錄人的所有聯(lián)系人
* 2.過濾查詢要?jiǎng)h除的聯(lián)系人的編號(hào)
* 3.執(zhí)行刪除
* @param no 要?jiǎng)h除人的編號(hào)
* @param userid 當(dāng)前登錄人id
* @return
*/
public boolean delUser(int no,Integer userid){
ArrayList< User > s = showInfo(userid);
User user = null;
for(User u:s) {
if(no == u.getNo()) {
user = u;
break;
}
}
if(user == null) {
System.out.println("該用戶不存在");
return false;
}
return ud.remove(user);
}
}
4.user的Dao層代碼 UserDao
package com.maker.address.dao;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import com.maker.address.entity.User;
import com.maker.address.util.DBUtil;
/**
* dao層處理對(duì)數(shù)據(jù)庫的操作
* @author Administrator
*
*/
public class UserDao {
//新增用戶
public boolean add(User user) {
// TODO Auto-generated method stub
String sql = "insert into user(no,name,phone,qq,email,userid) values ("+user.getNo()+",'"+user.getName()+"','"+user.getPhone()+"','"+user.getQQ()+"','"+user.getEmail()+"',"+user.getUserId()+")";
Connection conn = DBUtil.getConn();
Statement state = null;
int num = 0;
System.out.println(sql);
try {
state = conn.createStatement();
num = state.executeUpdate(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DBUtil.close(state, conn);
}
return num > 0;
}
//查詢所有用戶
public ArrayList getAll(Integer userid) {
// TODO Auto-generated method stub
String sql = "select * from user where userid =" + userid;
Connection conn = DBUtil.getConn();
Statement state = null;
ArrayList< User > list = new ArrayList< >();
ResultSet rs = null;
try {
state = conn.createStatement();
rs = state.executeQuery(sql);
while(rs.next()){
//結(jié)果集中有數(shù)據(jù) 代表查詢出來有數(shù)據(jù)
//創(chuàng)建user對(duì)象,將數(shù)據(jù)存入到對(duì)象集合中
User user = new User();
user.setNo(rs.getInt("no"));
user.setName(rs.getString("name"));
user.setPhone(rs.getString("phone"));
user.setQQ(rs.getString("qq"));
user.setEmail(rs.getString("email"));
user.setUserId(rs.getInt("userid"));
list.add(user);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DBUtil.close(rs,state, conn);
}
return list;
}
//按照編號(hào)查詢用戶
public User queryByNo(int no,Integer userid) {
// TODO Auto-generated method stub
String sql = "select * from user where no="+no + " and userid="+userid;
Connection conn = DBUtil.getConn();
Statement state = null;
User user = null;
ResultSet rs = null;
try {
state = conn.createStatement();
rs = state.executeQuery(sql);
while(rs.next()){
user = new User();
//結(jié)果集中有數(shù)據(jù) 代表查詢出來有數(shù)據(jù)
//創(chuàng)建user對(duì)象,將數(shù)據(jù)存入到對(duì)象集合中
user.setNo(rs.getInt("no"));
user.setName(rs.getString("name"));
user.setPhone(rs.getString("phone"));
user.setQQ(rs.getString("qq"));
user.setEmail(rs.getString("email"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DBUtil.close(rs,state, conn);
}
return user;
}
//刪除用戶按照編號(hào)
public boolean remove(User user) {
// TODO Auto-generated method stub
String sql = "delete from user where no = '"+user.getNo()+"' and userid="+user.getUserId();
Connection conn = DBUtil.getConn();
Statement state = null;
int num = 0;
try {
state = conn.createStatement();
num = state.executeUpdate(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DBUtil.close(state, conn);
}
return num > 0;
}
//修改用戶按照編號(hào)修改
public boolean updateUser(User user) {
// TODO Auto-generated method stub
String sql = "update user set name='"+user.getName()+"',phone='"+user.getPhone()+"',qq='"+user.getQQ()+"',email='"+user.getEmail()+"' where no = "+user.getNo();
Connection conn = DBUtil.getConn();
Statement state = null;
int num = 0;
try {
state = conn.createStatement();
num = state.executeUpdate(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DBUtil.close(state, conn);
}
return num > 0;
}
}
-
JAVA
+關(guān)注
關(guān)注
20文章
2987瀏覽量
108178 -
軟件
+關(guān)注
關(guān)注
69文章
5140瀏覽量
89078 -
管理系統(tǒng)
+關(guān)注
關(guān)注
1文章
2753瀏覽量
36900 -
MySQL
+關(guān)注
關(guān)注
1文章
850瀏覽量
27728
發(fā)布評(píng)論請(qǐng)先 登錄
SCVMM 2008 R2管理控制臺(tái)介紹
蘋果手機(jī)咋備份通訊錄,如何導(dǎo)出手機(jī)通訊錄聯(lián)系人?

通訊錄管理系統(tǒng)
Wind River Helix設(shè)備云中管理控制臺(tái)的介紹
通訊錄管理系統(tǒng)源碼,C語言鏈表實(shí)現(xiàn)
C語言程序設(shè)計(jì)--通訊錄系統(tǒng)
基于Android系統(tǒng)手機(jī)通訊錄管理軟件的設(shè)計(jì)與開發(fā)

基于Android平臺(tái)的手機(jī)通訊錄管理系統(tǒng)

基于Android平臺(tái)的個(gè)性通訊錄

評(píng)論