基于CS模式的通讯录课程设计

本文介绍了一个基于C/S模式的通讯录应用,采用MVC架构,使用Swing构建用户界面,配合JDBC处理数据库操作。项目中利用Druid数据源,通过WindowBuilder简化UI设计,支持联系人的增删改查功能。源码包含JDBC工具类、BaseDao基类及其实现,以及Service层和服务实现类。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本设计是基于C/S模式的通讯录,主要运用了MVC三层架构、Swing技术、JDBC技术以及数据库的创建和使用。主要实现了使用手机号与密码的登录功能,以及对联系人的增删改查。


一、可视化界面的实现

通讯录中可视化界面都是使用java中的swing实现的,但由于编写界面过于繁琐,推荐使用WindowBuilder插件直接进行可视化操作。点击按钮事件可以通过监听方法获取所需数据,以及实现不同页面(JFrame)之间的跳转。具体使用本文章不做具体介绍。
效果如下:
在这里插入图片描述在这里插入图片描述

二、项目引入

1.引入依赖

打开项目之后需对相关的jar包进行引入,此设计中使用了druid.jar、mysql-connector-java.jar、commons-beanutils.jar、commons-logging.jar,具体需要使用jar包版本根据自身所安装的数据库决定。下方提供的jar包版本不适用数据库8以上,若报错可前往mvnrepository官网进行高版本jar包下载。

2.配置文件

properties配置文件需要根据数据库所占用的端口号进行更改使用。

三、程序实现

通过view层创建service层对象,调用service层来对请求进一步处理,最后调用Dao层对数据库进行操作。
上代码:
JDBC工具类

package utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class DBUtils {
    private static DataSource ds = null;
    static {
        InputStream resourceAsStream = DBUtils.class.getClassLoader().getResourceAsStream("java-mysql.properties");
        Properties properties=new Properties();
        try {
            properties.load(resourceAsStream);
            ds = DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
    public static void close(Connection conn, Statement stmt){
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    public static void close(Connection conn, PreparedStatement pstmt, ResultSet res){
        close(conn,pstmt);
        if (res != null) {
            try {
                res.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

BaseDao类
将数据库中的数据转换为到java对象中(源码有多余测试方法,可以参考以下代码)

package BaseDao.BaseDaoImpl;

import utils.DBUtils;
import org.apache.commons.beanutils.BeanUtils;

import demoMain.User;

import java.lang.reflect.InvocationTargetException;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class BaseDao {
	public int update(String sql,Object[] params){
		//连接对象
        Connection conn = null;
        //数据库操作对象
        PreparedStatement pstmt=null;
        int b=0;
        {
            try {
                conn = DBUtils.getConnection();
                pstmt = conn.prepareStatement(sql);
                for (int i = 0; i < params.length ; i++) {
                    pstmt.setObject(i+1,params[i]);
                }
                b = pstmt.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                DBUtils.close(conn,pstmt);
            }
        }
        return b;
    }
    public <T>List<T> select(String sql, Object[] params, Class T) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet res = null;
        T t=null;
        List list=new ArrayList();
        try {
            conn = DBUtils.getConnection();
            pstmt = conn.prepareStatement(sql);
            if (params!=null){
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
            }
            res = pstmt.executeQuery();
            ResultSetMetaData metaData = res.getMetaData();
            while (res.next()) {
                t= (T) T.newInstance();
                int columnCount = metaData.getColumnCount();
                for (int i = 0; i < columnCount; i++) {
                    String columnName = metaData.getColumnName(i + 1);
                    String columnLabel = metaData.getColumnLabel(i + 1);
                    Object object = res.getObject(columnName);
                    BeanUtils.copyProperty(t,columnLabel,object);
                }
                list.add(t);

            }

        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } finally {
            DBUtils.close(conn, pstmt, res);
        }
        return list;
    }
}

Dao层的实现类:

package BaseDao.BaseDaoImpl;

import demoMain.Linkman;
import demoMain.User;

import java.sql.ResultSet;
import java.util.List;

import BaseDao.Dao;

public class BaseDaoImpl extends BaseDao implements Dao {
    @Override
    public boolean selectUser(User user) {
        String sql="select * from user where userPhone=? and password=?";
        Object[] params={user.getUserPhone(),user.getPassword()};
        List<Object> list = super.select(sql, params, User.class);
        return list==null?false:true;
    }

	@Override
	public boolean addUser(User user) {
		// TODO Auto-generated method stub
		String sql="insert into user values (?,?,?)";
		Object[] params={user.getUserName(),user.getUserPhone(),user.getPassword()};
		return super.update(sql, params)==0?false:true;
	}

	@Override
	public boolean addLinkman( Linkman linkman) {
		// TODO Auto-generated method stub
		String sql="insert into linkman values (null,?,?,?,?,?,?,?)";
		Object[] params={linkman.getLkmKey(),linkman.getLkmName(),linkman.getLkmMobile(),linkman.getLkmEmail(),linkman.getLkmGroup(),linkman.getLkmAddr(),linkman.getLkmRemark()};
		return super.update(sql, params)==0?false:true;
	}

	@Override
	public Linkman selectLinkman(Linkman linkman) {
		// TODO Auto-generated method stub
		String sql="select * from linkman where lkmMobile=? and lkmKey=?";
		Object[] params={linkman.getLkmMobile(),linkman.getLkmKey()};
		List list=super.select(sql, params, Linkman.class);
		return  list.size()==0?null:(Linkman)list.get(0);
	}

	@Override
	public List<Linkman> listLinkmans(String userPhone) {
		// TODO Auto-generated method stub
		String sql="select * from linkman where lkmKey=?";
		Object[] params={userPhone};
		return super.select(sql, params, Linkman.class);
	}

	@Override
	public List<Linkman> obscureListByName(String lkmName, String userPhone) {
		// TODO Auto-generated method stub
		String name="%"+lkmName+"%";
		String sql="select * from linkman where lkmKey=? and lkmName like ?";
		Object[] params={userPhone,name};
		return super.select(sql, params, Linkman.class);
	}

	@Override
	public List<Linkman> obscureListBymob(String lkmName, String userPhone) {
		// TODO Auto-generated method stub
		String name="%"+lkmName+"%";
		String sql="select * from linkman where lkmKey=? and lkmMobile like ?";
		Object[] params={userPhone,name};
		return super.select(sql, params, Linkman.class);
	}

	@Override
	public boolean updateLinkman(Linkman linkman) {
		// TODO Auto-generated method stub
		String sql="update linkman set  lkmName=?,lkmMobile=?, lkmEmail=?,lkmAddr=?,lkmGroup=?, lkmRemark=? where lkmId=?;";
		Object[] params={linkman.getLkmName(),linkman.getLkmMobile(),linkman.getLkmEmail(),linkman.getLkmAddr(),linkman.getLkmGroup(),linkman.getLkmRemark(),linkman.getLkmId()};
		return super.update(sql, params)==0?false:true;
	}

	@Override
	public boolean deleteLinkman(Linkman linkman) {
		// TODO Auto-generated method stub
		String sql="delete from linkman where lkmId=?";
		Object[] params={linkman.getLkmId()};
		return super.update(sql, params)==0?false:true;
	}

}

Service层的实现类:

package Service.ServiceImpl;

import demoMain.Linkman;
import demoMain.User;

import java.sql.ResultSet;
import java.util.List;

import BaseDao.Dao;
import BaseDao.BaseDaoImpl.BaseDaoImpl;
import Service.Service;

public class ServiceImpl implements Service {
    static Dao baseDao=new BaseDaoImpl();
    static User user=null;
    @Override
    public boolean selectUser(User user) {
        return baseDao.selectUser(user);
    }
	@Override
	public boolean addUser(User user) {
		// TODO Auto-generated method stub
		return baseDao.addUser(user);
	}
	@Override
	public void baocun(User user) {
		// TODO Auto-generated method stub
		this.user=user;
	}
	@Override
	public boolean addLinkman(Linkman linkman) {
		// TODO Auto-generated method stub
		//查询该手机号是否已存在
		linkman.setLkmKey(user.getUserPhone());
		if(baseDao.selectLinkman(linkman)==null){
			return baseDao.addLinkman(linkman);
		}else{
			return false;
		}
		
	}
	@Override
	public List listLinkmans(Linkman linkman) {
		// TODO Auto-generated method stub
		if(linkman.getLkmName()==null||"".equals(linkman.getLkmName())){
			return baseDao.listLinkmans(user.getUserPhone());
		}else{
			boolean b=true;
			char[] chars=linkman.getLkmName().toCharArray();
			for(int i=0;i<chars.length;i++){
				if(chars[i]>='0'&&chars[i]<='9'){
					b=false;
					break;
				}
			}
			if(b){
				return baseDao.obscureListByName(linkman.getLkmName(),user.getUserPhone());
			}else{
				return baseDao.obscureListBymob(linkman.getLkmName(),user.getUserPhone());
			}
		}
	}
	
	@Override
	public boolean updateLinkman(Linkman linkman) {
		// TODO Auto-generated method stub
		return baseDao.updateLinkman(linkman);
	}
	@Override
	public boolean deleteLinkman(Linkman linkman) {
		// TODO Auto-generated method stub
		return baseDao.deleteLinkman(linkman);
	}
	
}

四、源码下载

链接:https://pan.baidu.com/s/1IdnwROiPDHzlo-tmy8gc-Q
提取码:k1ex

通讯录查询系统是一个可以帮助用户快速查询联系人信息的软件系统。基于CS架构的通讯录查询系统,通常由客户端和服务器端两部分组成,客户端负责用户界面的展示和交互,服务器端负责数据的存储和处理。 以下是一个基于CS架构的通讯录查询系统的设计方案: 1. 客户端设计 客户端需要提供一个用户友好的界面,让用户可以方便地查询和管理通讯录。客户端的功能包括: - 登录/注册:用户需要通过用户名和密码进行登录,或者进行注册新用户。 - 查询联系人:用户可以根据姓名、电话、地址等关键字进行查询,并且可以进行模糊查询。 - 添加联系人:用户可以添加新的联系人信息,包括姓名、电话、地址、邮箱等。 - 修改联系人:用户可以修改已有的联系人信息。 - 删除联系人:用户可以删除已有的联系人信息。 - 显示联系人列表:用户可以查看当前所有的联系人信息列表,并且可以按照姓名、电话、地址等字段进行排序。 2. 服务器端设计 服务器端需要提供数据存储和处理功能,包括: - 数据库设计:服务器端需要设计一个数据库来存储联系人信息,包括姓名、电话、地址、邮箱等字段。 - 数据库操作:服务器端需要提供CRUD操作,包括添加、查询、修改、删除联系人信息等。 - 数据校验:服务器端需要对用户提交的数据进行校验,确保数据的正确性和安全性。 - 安全认证:服务器端需要对用户进行安全认证,防止非法用户访问和修改数据。 3. 技术选型 客户端可以选择桌面应用程序或者Web应用程序来实现,桌面应用程序可以使用Java Swing、WPF等技术实现,Web应用程序可以使用React、Vue、Angular等前端框架,配合后端框架如Spring Boot、Node.js等实现。 服务器端可以使用Java、Python、Node.js等语言实现,数据库可以选择MySQL、Oracle、MongoDB等关系型或非关系型数据库。 4. 总结 基于CS架构的通讯录查询系统可以帮助用户快速查询和管理联系人信息,具有良好的用户体验和数据安全性。在实现过程中需要注意数据校验和安全认证等问题,确保系统的稳定性和可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值