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 synchr