提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本设计是基于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