0x01 功能分析
建立模型
建立如图所示的通信框架,确定大致开发内容
确立服务端类
- DbBridge类:处理与数据库之间的交互
- Server类:处理与客户端的交互(监听端口、建立Socket连接、读取&输出数据到客户端)
确立客户端类
- ClientSocket类:处理与服务器的交互(与服务器建立Socket连接、读取&输出数据到服务器)
- MainFrame类:处理与用户的交互(用户界面)
0x02 具体实现
QueryRequest.java(使用这个类的对象将查询数据封装)
package GUI;
import java.io.Serializable;
/**
* 查询请求包,用以封装客户端到服务器的数据库查询请求
*
* @since 1.1
* @author TagBug {@link https://github.com/tagbug}
*/
public class QueryRequest implements Serializable {
/**
* 客户端与服务器协定好的查询请求种类
*/
public static enum TYPE {
ID, NAME
}
private TYPE type;
private String data;
/**
* 初始化构造方法,将查询请求封装
*
* @param type 查询种类
* @param data 请求数据
*/
public QueryRequest(TYPE type, String data) {
this.type = type;
this.data = data;
}
public TYPE getType() {
return type;
}
public String getData() {
return data;
}
}
服务器端(/Server)
DbBridge.java
package GUI.Server;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
/**
* 处理与数据库的通讯,此类是线程安全的
*
* @since 10
* @author TagBug {@link https://github.com/tagbug}
*/
public class DbBridge {
private Connection conn;
private static final String[] VALUES = {
"学号", "姓名", "出生日期", "Java成绩" };
private static final String idQuery = "SELECT * FROM students WHERE id = ?";
private static final String nameQuery = "SELECT * FROM students WHERE name = ?";
/**
* 默认构造方法,建立与数据库的连接
*
* @throws ClassNotFoundException 加载数据库驱动失败
* @throws SQLException 建立连接失败
*/
DbBridge() throws ClassNotFoundException, SQLException {
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
conn = DriverManager.getConnection("jdbc:derby:test");
}
/**
* <strong>内部方法</strong>
* <p>
* 将ResultSet处理为{@code ArrayList<string>},使用VALUES常量
*
* @param rs 数据库操作返回的结果集
* @return 处理后的字符串数组
*/
private synchronized ArrayList<String> returnResult(ResultSet rs) throws SQLException {
var result = new ArrayList<String>();
while (rs.next()) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
sb.append(VALUES[i]);
sb.append(':');
sb.append(rs.getString(i + 1));
sb.append('\t');
}
result.add(sb.toString());
}
return result;
}
/**
* 通过学号查询
*
* @param id 学号
* @return 查询结果
*/
public