当前位置: 代码迷 >> 综合 >> 详解Java 用GUI和网络编程连接远程数据库服务器,实现查询请求(服务器端+客户端)
  详细解决方案

详解Java 用GUI和网络编程连接远程数据库服务器,实现查询请求(服务器端+客户端)

热度:75   发布时间:2024-01-15 03:13:38.0

0x01 功能分析

建立模型

建立如图所示的通信框架,确定大致开发内容
通信框架

确立服务端类
  1. DbBridge类:处理与数据库之间的交互
  2. Server类:处理与客户端的交互(监听端口、建立Socket连接、读取&输出数据到客户端)
确立客户端类
  1. ClientSocket类:处理与服务器的交互(与服务器建立Socket连接、读取&输出数据到服务器)
  2. 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
  相关解决方案