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;
        }
    }
}
阅读剩余 74%

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

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

相关文章

  • Nginx中location匹配以及rewrite重写跳转详解

    以下是“Nginx中location匹配以及rewrite重写跳转详解”的攻略: 1. location匹配规则 location是nginx中用于匹配请求uri的指令,可以控制nginx如何处理请求。在nginx配置文件中,我们可以使用location来设置不同的匹配规则以及相应的处理方式。 下面是几种location匹配规则: 精确匹配:location…

    Java 2023年6月15日
    00
  • 通用弹出层页面(兼容IE、firefox)可关闭控制宽高及屏蔽背景

    为了让大家更好地理解,我将会详细讲解如何实现“通用弹出层页面(兼容IE、firefox)可关闭控制宽高及屏蔽背景”。 1. 确定需求 首先,我们需要确定所需的样式和功能。需求如下: 弹出层需要兼容IE和firefox浏览器 弹出层需要能够控制宽度和高度 弹出层需要能够屏蔽背景 弹出层需要提供关闭按钮 2. 编写HTML代码 然后,我们需要在HTML文件中编写…

    Java 2023年6月15日
    00
  • JPA多数据源分布式事务处理方案

    JPA多数据源分布式事务处理方案需要涉及到以下几个步骤: 配置多数据源 配置事务管理器 编写跨数据源分布式事务代码 具体步骤如下: 配置多数据源 在Spring Boot应用程序中实现多个数据源的方法有很多,这里以使用HikariCP连接池的方式为例。首先在application.properties文件中配置两个数据源: # 第一个数据源 spring.d…

    Java 2023年5月20日
    00
  • Java实现调用外部程序的示例代码

    这里我为你提供一份“Java实现调用外部程序的示例代码”攻略: 1. 确认可供调用的外部程序 在Java代码中调用外部程序之前,首先需要确认可供调用的外部程序是否存在及可用。若存在,则可以直接在Java中通过执行外部程序的命令来进行调用,并获取相应的返回值;若不存在,则需要先进行程序安装或者确认是否已经加入环境变量中。 2. Java代码实现调用外部程序 使…

    Java 2023年5月19日
    00
  • 详解Mybatis的分页插件

    MyBatis是一款非常流行的ORM框架,它在开发过程中会遇到分页查询的需求。MyBatis原生不支持分页功能,因此需要使用MyBatis的分页插件。下面是详解MyBatis的分页插件的攻略。 1. 安装分页插件 在MyBatis项目中,添加分页插件是很简单的,只需两步即可: 在pom.xml中添加分页插件的依赖: <dependency> &l…

    Java 2023年5月20日
    00
  • Session过期后实现自动跳转登录页面

    要实现Session过期后自动跳转到登录页面,需要进行以下步骤: 1. 设置Session过期时间 在服务器端的配置文件中设置Session过期的时间,例如设置为30分钟。具体的配置方式可以因服务器而异,例如在PHP中可以通过php.ini文件中的session.gc_maxlifetime参数来设置过期时间。在JAVA中可以通过web.xml文件或者代码来…

    Java 2023年6月16日
    00
  • form表单回写技术java实现

    下面是“form表单回写技术java实现”的完整攻略。 1. 什么是form表单回写技术 form表单回写技术是指在在用户提交表单时,如果表单有数据验证不通过或者其他原因导致提交失败,那么网页应该保留用户之前提交的数据,并在页面上回显给用户以方便用户修改。这就是form表单回写技术。 常见的web框架都提供了这种功能,例如Spring MVC框架的Bindi…

    Java 2023年6月16日
    00
  • Java实现字符串转为驼峰格式的方法详解

    Java实现字符串转为驼峰格式的方法详解 在Java中,字符串转为驼峰格式是一种很常见的操作。下面就给大家分享一下Java实现字符串转为驼峰格式的几种方法。 方法一:使用apache.commons.lang3库 import org.apache.commons.lang3.StringUtils; public class StringUtilsTest…

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