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

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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值