Java利用套接字实现应用程序对数据库的访问

Java利用套接字实现应用程序对数据库的访问,需要经过以下步骤:

  1. 配置数据库信息:在Java应用程序中,我们可以通过配置文件比如Property文件来存储数据库信息,比如数据库名称、用户名、密码、地址、端口等等。

  2. 建立连接:使用Java JDBC API中的该库驱动连接数据库。

  3. 字段验证:避免SQL注入攻击,对输入的字段进行验证和过滤。

  4. 构建SQL语句:使用Java JDBC API中的SQL语句构建模块,构建所需的SQL查询/修改语句。

  5. 执行操作:向数据库发送SQL语句并执行,如果需要则从结果集中提取结果。

示例1:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

// 服务器端线程,用于处理客户端请求
public class ServerThread implements Runnable {

    private Socket socket;
    // 定义客户端请求常量
    private final String REQUEST_IP = "query_by_ip";
    private final String REQUEST_NAME = "query_by_name";
    private final String REQUEST_EXIT = "exit";
    private final String RESPONSE_SUCCESS = "success";
    private final String RESPONSE_FAIL = "fail";

    public ServerThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            // 获取客户端请求类型
            ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
            String requestType = (String) in.readObject();
            // 获取请求参数
            String requestParam = (String) in.readObject();
            // 执行数据库操作
            Connection conn = getConnection();
            Statement stmt = conn.createStatement();
            ResultSet rs;
            if (REQUEST_IP.equals(requestType)) {
                rs = stmt.executeQuery("SELECT * FROM userinfo WHERE ip='" + requestParam + "'");
            } else {
                rs = stmt.executeQuery("SELECT * FROM userinfo WHERE name='" + requestParam + "'");
            }
            // 构建返回结果
            ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
            if (rs.next()) {
                String result = rs.getString("name") + " " + rs.getString("ip") + " " + rs.getString("phone");
                out.writeObject(result);
                out.writeObject(RESPONSE_SUCCESS);
            } else {
                out.writeObject(null);
                out.writeObject(RESPONSE_FAIL);
            }
            // 关闭连接
            rs.close();
            stmt.close();
            conn.close();
            in.close();
            out.close();
            socket.close();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    private Connection getConnection() {
        try {
            String url = "jdbc:mysql://localhost:3306/test";
            String user = "root";
            String password = "123456";
            Class.forName("com.mysql.jdbc.Driver");
            return DriverManager.getConnection(url, user, password);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

示例2:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

// 服务器端线程,用于处理客户端请求
public class ServerThread implements Runnable {

    private Socket socket;
    // 定义客户端请求常量
    private final String REQUEST_INSERT = "insert";
    private final String REQUEST_DELETE = "delete";
    private final String RESPONSE_SUCCESS = "success";
    private final String RESPONSE_FAIL = "fail";

    public ServerThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            // 获取客户端请求类型
            ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
            String requestType = (String) in.readObject();
            // 执行数据库操作
            Connection conn = getConnection();
            PreparedStatement stmt = null;
            if (REQUEST_INSERT.equals(requestType)) {
                // 获取请求参数
                String name = (String) in.readObject();
                String ip = (String) in.readObject();
                String phone = (String) in.readObject();
                stmt = conn.prepareStatement("INSERT INTO userinfo (name, ip, phone) VALUES (?, ?, ?)");
                stmt.setString(1, name);
                stmt.setString(2, ip);
                stmt.setString(3, phone);
                int rows = stmt.executeUpdate();
                // 构建返回结果
                ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
                if (rows > 0) {
                    out.writeObject(RESPONSE_SUCCESS);
                } else {
                    out.writeObject(RESPONSE_FAIL);
                }
                out.close();
            } else {
                // 获取请求参数
                int id = (int) in.readObject();
                stmt = conn.prepareStatement("DELETE FROM userinfo WHERE id = ?");
                stmt.setInt(1, id);
                int rows = stmt.executeUpdate();
                // 构建返回结果
                ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
                if (rows > 0) {
                    out.writeObject(RESPONSE_SUCCESS);
                } else {
                    out.writeObject(RESPONSE_FAIL);
                }
                out.close();
            }
            // 关闭连接
            stmt.close();
            conn.close();
            in.close();
            socket.close();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    private Connection getConnection() {
        try {
            String url = "jdbc:mysql://localhost:3306/test";
            String user = "root";
            String password = "123456";
            Class.forName("com.mysql.jdbc.Driver");
            return DriverManager.getConnection(url, user, password);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java利用套接字实现应用程序对数据库的访问 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • java ArrayList和Vector的区别详解

    Java ArrayList 和 Vector 的区别详解 在Java程序开发中,ArrayList和Vector是两个非常常用的集合类,它们都可以用来存储一组数据,但是它们之间也存在一些区别,本篇文章将详细解释ArrayList和Vector的区别。 ArrayList ArrayList是Java集合框架中非常常用的动态数组实现类,它是基于数组结构实现的…

    Java 2023年5月26日
    00
  • java框架之maven是用来做什么的

    Maven是一种Java项目管理工具,它提供了自动化构建、版本控制、项目报告和依赖管理的功能。它使用一个基于XML的格式来描述项目构建和依赖关系。 什么是Maven Maven是一个开源的工具,提供构建、测试、部署Java应用程序所需的一系列自动化工具。它采用“约定优于配置”的设计理念,通过定义标准的目录结构和构建过程规则,将工程构建自动化,提高项目的开发效…

    Java 2023年5月20日
    00
  • Maven配置单仓库与多仓库的实现(Nexus)

    Maven是一款开源的Java项目管理工具,它可以自动化地构建、发布和管理Java项目。在使用Maven构建Java项目时,需要配置仓库来管理项目依赖的库。一般来说,Maven支持单仓库和多仓库两种配置方式。 单仓库配置 单仓库配置即使用一个仓库来管理Java项目依赖的库。在Maven的配置文件pom.xml中,可以使用如下代码块来配置单仓库。 <re…

    Java 2023年5月19日
    00
  • 教你使用java将excel数据导入MySQL

    下面是“教你使用java将excel数据导入MySQL”的完整攻略: 步骤一:准备工作 确认已经安装了Java开发环境(JDK)和MySQL数据库,并配置好了环境变量。 下载并安装Apache POI库,它是Java操作Excel的必备库,可在https://poi.apache.org/download.html 中获取最新版本。 创建一个Java项目,并…

    Java 2023年6月1日
    00
  • Spring占位符Placeholder的实现原理解析

    Spring占位符Placeholder的实现原理解析 在Spring中,占位符(Placeholder)是一个非常实用的功能,它可以在Spring容器启动时通过配置文件或环境变量等方式注入需要的配置值。本文将详细讲解Spring占位符的实现原理。 占位符的使用 在Spring中,占位符有两种使用方式:XML配置方式和注解方式。 XML配置方式 在XML配置…

    Java 2023年5月31日
    00
  • Spring Boot超详细分析启动流程

    以下是“Spring Boot超详细分析启动流程”的完整攻略: 目录 准备工作 Spring Boot 启动流程分析 自定义启动流程 示例1:加载自定义配置文件 示例2:自定义Banner 准备工作 在分析 Spring Boot 启动流程之前,我们需要先了解几个基本概念: SpringApplicationBuilder:Spring Boot 启动入口,…

    Java 2023年5月15日
    00
  • java身份证验证代码实现

    下面是 “java身份证验证代码实现”的完整攻略。 1. 身份证号码规则 身份证号码规则如下: 身份证号码为18位数字和字母(除最后一位是字母外) 前17位为地区码和出生日期码,最后一位为校验码 校验码计算方法: 取出前17位数字(地区码和出生日期码),按权重分别乘以7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2 对乘积求和 将和数除…

    Java 2023年5月19日
    00
  • SpringMVC+EasyUI实现页面左侧导航菜单功能

    概述 要实现页面左侧导航菜单功能,我们需要用到SpringMVC和EasyUI框架。具体实现过程包括以下步骤: 配置SpringMVC框架; 配置EasyUI框架和主题样式; 实现导航菜单的数据获取和展示。 配置SpringMVC框架 SpringMVC是Spring框架中的一个模块,主要用于构建Web应用程序。要配置SpringMVC框架,需要在web.x…

    Java 2023年6月16日
    00
合作推广
合作推广
分享本页
返回顶部