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

yizhihongxing

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日

相关文章

  • Springboot整合Netty自定义协议实现示例详解

    针对“Springboot整合Netty自定义协议实现示例详解”这一话题,我来给您进行详细的讲解和介绍。 1. 环境搭建 首先,我们需要在本地环境搭建好所需的开发环境。具体来说,我们需要安装好以下组件: Java SDK(1.8或更高版本) Spring Boot(2.0或更高版本) Netty(4.1或更高版本) 安装完成后,我们就可以开始进行具体的开发工…

    Java 2023年5月20日
    00
  • 什么是并行收集器?

    下面我来详细讲解一下“什么是并行收集器?”的完整使用攻略。 并行收集器是什么? 并行收集器就是一种并行执行的垃圾收集器,它利用多个线程同时进行垃圾收集。它针对的是堆内存比较大的场景,因为在这种场景下,垃圾收集器需要进行很多的扫描和标记操作,使用多线程可以有效加快垃圾收集的速度。 如何使用并行收集器? 使用并行收集器很简单,只需要使用以下参数即可: -Xmx&…

    Java 2023年5月10日
    00
  • java编程实现求质数与因式分解代码分享

    下面是 “Java编程实现求质数与因式分解代码分享” 的完整攻略。 目录 介绍 求质数的代码实现 因式分解的代码实现 示例说明 总结 介绍 本文将介绍Java编程实现求质数与因式分解的代码。当我们需要判断一个数是不是质数时,我们可以使用质数的定义:只有1和该数本身能够整除它,它才是质数。因式分解是指将一个数分解成几个互质的整数乘积的形式。这里我们使用两种算法…

    Java 2023年5月19日
    00
  • Eclipse+Java+Swing+Mysql实现工资管理系统

    Eclipse+Java+Swing+Mysql实现工资管理系统攻略 1. 系统概述 工资管理系统是企业内部薪资管理的重要组成部分,其任务是集中管理员工的薪资及相关信息。本系统采用Eclipse+Java+Swing+Mysql技术实现,具备以下功能模块: 登录模块:提供登录界面,验证用户身份。 员工信息管理:添加、删除员工及修改员工信息。 薪资管理:计算、…

    Java 2023年5月30日
    00
  • Spring quartz Job依赖注入使用详解

    Spring Quartz Job依赖注入使用详解 介绍 Spring框架提供了一个任务调度组件——Quartz。Quartz可用于在指定时间、日期执行任务或按规定时间间隔执行任务,比如定时备份、数据同步等任务。 在Quartz中定义任务的时候,我们可能需要依赖注入一些Spring管理的Bean,通过Spring支持的依赖注入特性,Quartz任务类很容易获…

    Java 2023年6月15日
    00
  • Mybatis实现自动生成增删改查代码

    下面我给你详细讲解一下Mybatis实现自动生成增删改查代码的完整攻略。 概述 Mybatis是一款基于Java的持久层框架,它提供了自动生成增删改查代码的功能,让开发人员可以快速生成常用的CRUD操作。可以大大提高代码的开发效率,减少了数据库访问层的开发工作量。 步骤 实现Mybatis自动生成增删改查代码的过程如下: 配置Mybatis Generato…

    Java 2023年5月19日
    00
  • Mybatis中resultMap的使用总结

    下面就是关于“Mybatis中resultMap的使用总结”的详细攻略。 什么是resultMap resultMap是MyBatis中比较重要的一个元素,可以自定义SQL返回结果。通过定义resultMap,我们可以灵活的控制与定制查询结果,使结果集可以和我们Java对象相映射。 resultMap是一个描述如何从JDBCResultSet中加载数据的规则…

    Java 2023年5月20日
    00
  • 基于Class.forName()用法及说明

    下面我来为你详细讲解“基于Class.forName()用法及说明”的完整攻略。 什么是Class.forName()方法? 在Java中,Class.forName()方法是一种加载Class对象的方式。注意,它并不是使用了一个类,而是将它加载到JVM中,使其代码可以被执行。通过使用该方法,我们可以动态的创建对象、使用反射等功能。 Class.forNam…

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