电子说
本栏目专为入门java学习者设计的一些简单的入门项目
本项目为简单的基于控制台的通讯录管理系统,所需要的环境仅仅为jdk以及mysql(版本不限)!只有一个简单的eclipse软件以及我们的mysql可视化工具(视频使用navicat)
本项目数据库表有二个,本项目是之前的单表项目的升级版本
本项目使用mvc设计模式,使用面向对象的开发思想
本项目使用最基础的jdbc的方式链接的数据库
本项目主要实现的功能有:
业务点处理:
当前登录人操作只能操作自己的数据,用户登录成功后,显示的列表只能显示自己录入的数据!
注册:用户表按照的是用户名作为唯一标识,也就是不能注册重复的用户名
新增:对于不同用户来说通讯录的no是可以重复的,但是对于同一个用户来说录入的通讯通好友的编号no是不允许重复的
修改:用户修改也是通过编号以及自己的登录状态来修改自己的数据
删除:用户删除输入的编号也是只针对自己的数据
项目结构:
1.登录用户表
2.用户的通讯录数据表
1.JDBC数据库连接工具类:
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;
/**
* 数据库连接工具类
* @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;
}
/**
* 关闭链接
* @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();
}
}
}
/**
* 关闭链接
* @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.运行程序的主类: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 {
//静态的user服务层对象
static UserService user = new UserService();
//静态的用户登录服务层对象
static LoginService loginService = new LoginService();
//静态的全局的用户输入对象
static Scanner sc = new Scanner(System.in);
//登录对象保存
static Login LOGIN = null;
/**
* main方法执行后先执行start方法
* 这里就是对登录注册的页面显示的操作
*/
public static void start(){
System.out.println("=======请选择=====");
System.out.println("【1】注册");
System.out.println("【2】登录");
int index = sc.nextInt();
//根据用户输入的操作来进行下一步的指令
//每一个指令之后都是重新进行start方法,只有在登录成功的时候,登录方法内部进入了into这个方法,就是进入系统中了
switch(index){
case 1:
//注册
toRegist();
start();
break;
case 2:
//登录
login();
start();
break;
default:
System.out.println("请输入正确的指令!");
start();
break;
}
}
//登录方法
private static void login() {
// TODO Auto-generated method stub
System.out.println("请输入用户名:");
String username = sc.next();
System.out.println("请输入密码:");
String password = sc.next();
//根据输入的用户名密码来调用服务层接口
LOGIN = loginService.toLogin(username, password);
if(LOGIN!=null){
//登录成功的时候会返回数据库中的登录对象,然后将对象赋值给全局的登录对象,这样在做其他操作的时候直接使用就行
//登录成功后进入系统中
into();
}
}
//注册的方法
private static void toRegist() {
// TODO Auto-generated method stub
System.out.println("请输入用户名:");
String username = sc.next();
System.out.println("请输入密码:");
String password = sc.next();
System.out.println("请确认密码:");
String rePassword = sc.next();
//根据用户输入的用户名密码来进行校验
if(password.equals(rePassword)){
//注册成功不做其他操作,在start方法中会重新执行start
loginService.toRegist(username, rePassword);
}else{
System.out.println("二次密码输入不一致!");
}
}
/**
* 这里就是用户登录成功后进入系统的页面显示方法
*/
public static void into() {
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】退出");
System.out.println("=============================");
int i = sc.nextInt();
//接收用户输入的指令来进行不同的操作
switch (i) {
case 1:
//添加联系人
add();
into();
break;
case 2:
//联系人查询
System.out.println("【1】通过联系人姓名查询/【2】通过联系人电话查询");
int a = sc.nextInt();
findbyName(a);
into();
break;
case 3:
//显示联系人列表
show();
into();
break;
case 4:
//根据编号删除指定编号的联系人
del();
into();
break;
case 5:
//修改指定编号的联系人
update();
into();
break;
case 0:
//退出
System.out.println("谢谢使用,再见!");
System.exit(0);
break;
default:
//不存在的指令
System.out.println("请输入正确的指令!");
into();
break;
}
}
/**
* 修改用户的方法
* 1.接收用户输入的联系人编号以及修改的数据
* 2.然后中间进行手机号验证以及邮箱验证
* 3.最后调用服务层updateUser方法去执行修改操作
*/
private static void update() {
// TODO Auto-generated method stub
System.out.println("请输入要修改的联系人编号:");
int a = sc.nextInt();
System.out.println("请输入姓名:");
String b = sc.next();
System.out.println("请输入手机号:");
String c = sc.next();
judgePhone(c);
System.out.println("请输入QQ:");
String d = sc.next();
System.out.println("请输入邮箱地址:");
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.接收用户输入的相关信息
* 2.中间进行手机号验证以及邮箱验证
* 3.调用服务器addUser新增接口
*/
public static void add() {
System.out.println("请输入联系人编号:");
int a = sc.nextInt();
System.out.println("请输入联系人姓名:");
String b = sc.next();
System.out.println("请输入联系人手机号:");
String c = sc.next();
judgePhone(c);
System.out.println("请输入联系人QQ:");
String d = sc.next();
System.out.println("请输入联系人邮箱地址:");
String e = sc.next();
judgeEmail(e);
User x = new User(a, b, c, d, e,LOGIN.getId());
if (user.addUser(x)) {
System.out.println("添加成功!");
}
}
/**
* 校验手机号
* 规则:11位 数字1开头 第二位为34589 后面9位1-9任意
*
* 校验不通过后可以重新输入
* @param phone 手机号
*/
public static void judgePhone(String phone) {
if (phone.matches("1[34589][0-9]{9}")) {
} else {
System.out.println("手机号输入有误,请重新输入");
String v = sc.next();
judgePhone(v);
}
}
/**
* 校验邮箱
* 规则:不包括特殊字符 中间有@
*
* 校验不通过后可以重新输入
* @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("邮箱格式输入有误,请重新输入");
String v = sc.next();
judgeEmail(v);
}
}
/**
* 查询联系人方法
*
* 查询方法调用user服务层接口然后参数加上当前登录人的id
*
* @param a 输入的指令 1按照姓名 2按照电话
*/
public static void findbyName(int a) {
if (a == 1) {
System.out.println("请输入联系人姓名");
} else {
System.out.println("请输入联系人电话");
}
String name = sc.next();
User user = UserMain.user.searchByName(name,LOGIN.getId());
System.out.println(user);
}
/**
* 显示所有联系人的方法
* 调用user服务层接口根据当前登录人的id查询
*/
public static void show() {
ArrayList list = user.showInfo(LOGIN.getId());
for (Object o : list) {
System.out.println(o);
}
}
/**
* 删除方法
* 1.根据用户输入的要删除的联系人编号
* 2.调用user服务器接口根据当前登录人id以及要删除的联系人编号进行删除
*/
public static void del() {
System.out.println("请输入编号");
int no = sc.nextInt();
if (user.delUser(no,LOGIN.getId())) {
System.out.println("删除成功");
}
}
//运行程序的主方法,右键运行后会执行start方法
public static void main(String[] args) {
start();
}
}
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;
/**
* 用户服务层
* @author Administrator
*
*/
public class UserService {
UserDao ud = new UserDao();
//新增用户
public boolean addUser(User user){
//判断编号是否存在,存在的话将不允许新增
User record = ud.queryByNo(user.getNo(),user.getUserId());
if(record!=null){
System.out.println("编号已存在!");
return false;
}
return ud.add(user);
}
/**
* 公共的查询所有数据的方法
* 查询出当前登录人的所有的联系人
* @param userId 当前登录人id
* @return
*/
public ArrayList showInfo(Integer userId){
return ud.getAll(userId);
}
/**
* 通过名称或者电话查询联系人
* 1.通过showInfo查询当前登录人的所有联系人
* 2.通过字段进行过滤查询出符合的联系人
*
* @param name 用户输入的
* @param userId 当前登录人的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 要修改的实体
* @return
*/
public boolean updateUser(User user){
boolean num = ud.updateUser(user);
if(!num) {
System.out.println("该用户不存在");
return false;
}
return true;
}
/**
* 删除联系人的方法
* 1.通过showInfo查询当前登录人的所有联系人
* 2.过滤查询要删除的联系人的编号
* 3.执行删除
* @param no 要删除人的编号
* @param userid 当前登录人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层处理对数据库的操作
* @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()){
//结果集中有数据 代表查询出来有数据
//创建user对象,将数据存入到对象集合中
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;
}
//按照编号查询用户
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();
//结果集中有数据 代表查询出来有数据
//创建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"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DBUtil.close(rs,state, conn);
}
return user;
}
//删除用户按照编号
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;
}
//修改用户按照编号修改
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;
}
}
全部0条评论
快来发表一下你的评论吧 !