Javaweb的增删改查

编写单一Servlet,仅用Servlet和jdbc技术不用Spring及其它。根据任一个表名参数利用Connection.getMetaData()获取表的元数据字段结构,通过Response.getWriter()输出网页表单,实现列表、查询、添加、删除和编辑功能。(请帖出源码)

这是提供的demo,希望对你能有用!


import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet {
  
  // 数据库连接信息
  static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
  static final String DB_URL = "jdbc:mysql://localhost/mydatabase";
  static final String USER = "username";
  static final String PASS = "password";

  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    // 获取表名参数
    String tableName = request.getParameter("tableName");

    // 连接数据库
    Connection conn = null;
    Statement stmt = null;
    try{
        Class.forName(JDBC_DRIVER);
        conn = DriverManager.getConnection(DB_URL, USER, PASS);

        // 获取表的元数据信息
        DatabaseMetaData dbmd = conn.getMetaData();
        ResultSet rs = dbmd.getColumns(null, null, tableName, null);

        // 输出网页表单
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>Table " + tableName + "</title></head>");
        out.println("<body>");

        // 列表功能
        out.println("<h2>Table " + tableName + " - List</h2>");
        stmt = conn.createStatement();
        rs = stmt.executeQuery("SELECT * FROM " + tableName);
        out.println("<table>");
        while (rs.next()) {
          out.println("<tr>");
          for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
            out.println("<td>" + rs.getString(i) + "</td>");
          }
          out.println("</tr>");
        }
        out.println("</table>");

        // 查询功能
        out.println("<h2>Table " + tableName + " - Query</h2>");
        out.println("<form method='post'>");
        out.println("Condition: <input type='text' name='condition'><br>");
        out.println("<input type='submit' value='Query'>");
        out.println("</form>");

        // 添加功能
        out.println("<h2>Table " + tableName + " - Add</h2>");
        out.println("<form method='post'>");
        for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
          String columnName = rs.getMetaData().getColumnName(i);
          String columnType = rs.getMetaData().getColumnTypeName(i);
          out.println(columnName + ": ");
          if (columnType.equals("VARCHAR") || columnType.equals("CHAR")) {
            out.println("<input type='text' name='" + columnName + "'><br>");
          } else if (columnType.equals("INT")) {
            out.println("<input type='number' name='" + columnName + "'><br>");
          }
        }
        out.println("<input type='submit' value='Add'>");
        out.println("</form>");

        // 删除功能
        out.println("<h2>Table " + tableName + " - Delete</h2>");
        out.println("<form method='post'>");
        out.println("ID: <input type='number' name='id'><br>");
        out.println("<input type='submit' value='Delete'>");
        out.println("</form>");

        // 编辑功能
        out.println("<h2>Table " + tableName + " - Edit</h2>");
        out.println("<form method='post'>");
        out.println("ID: <input type='number' name='id'><br>");
        for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
          String columnName = rs.getMetaData().getColumnName(i);
          String columnType = rs.getMetaData().getColumnTypeName(i);
          out.println(columnName + ": ");
          if (columnType.equals("VARCHAR") || columnType.equals("CHAR")) {
            out.println("<input type='text' name='" + columnName + "'><br>");
          } else if (columnType.equals("INT")) {
            out.println("<input type='number' name='" + columnName + "'><br>");
          }
        }
        out.println("<input type='submit' value='Edit'>");
        out.println("</form>");

        out.println("</body></html>");

        rs.close();
        stmt.close();
        conn.close();
    } catch(SQLException se) {
        se.printStackTrace
     }
  }
}

以下是一个基于Servlet和JDBC实现的简单示例,实现了列表、查询、添加、删除和编辑功能。假设表名参数为"mytable"。


import java.io.IOException;
import java.sql.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/mytable")
public class MyTableServlet extends HttpServlet {
    private static final String DRIVER_CLASS = "com.mysql.jdbc.Driver";
    private static final String DB_URL = "jdbc:mysql://localhost:3306/mydatabase?useSSL=false";
    private static final String DB_USER = "root";
    private static final String DB_PASSWORD = "password";

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String tableName = request.getParameter("tableName");
        PrintWriter out = response.getWriter();
        Connection conn = null;
        try {
            Class.forName(DRIVER_CLASS);
            conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
            DatabaseMetaData meta = conn.getMetaData();
            ResultSet rs = meta.getColumns(null, null, tableName, null);
            out.println("<html><head><title>" + tableName + "</title></head><body>");
            out.println("<h1>" + tableName + "</h1>");
            out.println("<form method='post' action='mytable'>");

            // 列表
            out.println("<table border='1'>");
            out.println("<tr>");
            while (rs.next()) {
                String columnName = rs.getString("COLUMN_NAME");
                out.println("<th>" + columnName + "</th>");
            }
            out.println("<th>操作</th>");
            out.println("</tr>");
            rs = conn.createStatement().executeQuery("SELECT * FROM " + tableName);
            while (rs.next()) {
                out.println("<tr>");
                for (int i = 1; i <= rs.getMetaData().getColumnCount(); ++i) {
                    String value = rs.getString(i);
                    out.println("<td>" + value + "</td>");
                }
                out.println("<td><a href='mytable?action=edit&id=" + rs.getInt(1) + "'>编辑</a> | " +
                            "<a href='mytable?action=delete&id=" + rs.getInt(1) + "'>删除</a></td>");
                out.println("</tr>");
            }
            out.println("</table>");

            // 查询
            out.println("<h2>查询</h2>");
            rs = meta.getColumns(null, null, tableName, null);
            out.println("<table>");
            while (rs.next()) {
                String columnName = rs.getString("COLUMN_NAME");
                out.println("<tr>");
                out.println("<td>" + columnName + ":</td>");
                out.println("<td><input type='text' name='" + columnName + "'></td>");
                out.println("</tr>");
            }
            out.println("<tr><td colspan='2'><input type='submit' value='查询'></td></tr>");
            out.println("</table>");

            // 添加
            out.println("<h2>添加</h2>");
            rs = meta.getColumns(null, null, tableName, null);
            out.println("<table>");
            while (rs.next()) {
                String columnName = rs.getString("COLUMN_NAME");
                out.println("<tr>");
                out.println("<td>" + columnName + ":</td>");
                out.println("<td><input type='text' name='" + columnName + "'></td>");
                out.println("</tr>");
            }
            out.println("<tr><td colspan='2'><input type='submit' value='添加'></td></tr>");
            out.println("</table>");

            out.println("</form>");
            out.println("</body></html>");
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ignore) {
                }
            }
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String tableName = request.getParameter("tableName");
        String action = request.getParameter("action");
        Connection conn = null;
        try {
            Class.forName(DRIVER_CLASS);
            conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
            if (action != null && action.equals("delete")) {
                String id = request.getParameter("id");
                PreparedStatement ps = conn.prepareStatement("DELETE FROM " + tableName + " WHERE id=?");
                ps.setInt(1, Integer.parseInt(id));
                ps.executeUpdate();
            } else {
                String sql = "INSERT INTO " + tableName + " (";
                String values = "VALUES (";
                ResultSet rs = conn.getMetaData().getColumns(null, null, tableName, null);
                while (rs.next()) {
                    String columnName = rs.getString("COLUMN_NAME");
                    sql += columnName + ",";
                    values += "?,";
                }
                sql = sql.sub

该Servlet首先获取表名参数,连接到数据库获取元数据字段结构,并输出网页表单。其中:

列表功能用SELECT * FROM语句查询表中所有记录,并用HTML表格展示。每一行后面有编辑和删除的链接。
查询功能用DatabaseMetaData.getColumns()方法获取表中所有列的信息,生成查询表单。查询表单提交后,使用输入的值拼接WHERE子句进行查询并展示结果。
添加功能也是用DatabaseMetaData.getColumns()方法生成表单。添加表单提交后,使用拼接好的插入语句执行插入操作。
删除功能使用PreparedStatement构建DELETE语句,并加入id作为参数。在执行语句之前,需要检查是否有id参数被传递。

来自GPT的回答:


```bash
以下是一个使用Servlet和JDBC技术实现增删改查功能的示例代码:

java
Copy code
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/TableServlet")
public class TableServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private Connection conn;

    public TableServlet() {
        super();
    }

    public void init() throws ServletException {
        String url = "jdbc:mysql://localhost:3306/db_name"; // 替换为你的数据库连接信息
        String username = "username"; // 替换为你的数据库用户名
        String password = "password"; // 替换为你的数据库密码

        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(url, username, password);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        String tableName = request.getParameter("table"); // 从请求参数中获取表名
        try {
            DatabaseMetaData metaData = conn.getMetaData();
            ResultSet rs = metaData.getColumns(null, null, tableName, null); // 获取表的元数据

            out.println("<html><head><title>" + tableName + " Table</title></head><body>");

            // 输出表单头部和查询表单
            out.println("<h2>" + tableName + " Table</h2>");
            out.println("<form action=\"TableServlet\" method=\"post\">");
            out.println("<input type=\"hidden\" name=\"table\" value=\"" + tableName + "\">");
            out.println("<input type=\"text\" name=\"searchValue\">");
            out.println("<input type=\"submit\" value=\"Search\">");
            out.println("</form>");

            // 输出表格头部
            out.println("<table border=\"1\"><tr>");
            while (rs.next()) {
                String columnName = rs.getString("COLUMN_NAME");
                out.println("<th>" + columnName + "</th>");
            }
            out.println("<th>Actions</th>");
            out.println("</tr>");

            // 查询并输出表格内容
            Statement stmt = conn.createStatement();
            ResultSet tableData = stmt.executeQuery("SELECT * FROM " + tableName);
            while (tableData.next()) {
                out.println("<tr>");
                rs.beforeFirst();
                while (rs.next()) {
                    String columnName = rs.getString("COLUMN_NAME");
                    String columnValue = tableData.getString(columnName);
                    out.println("<td>" + columnValue + "</td>");
                }
                String id = tableData.getString("id"); // 假设id为主键列名
                out.println("<td><a href=\"TableServlet?action=edit&table=" + tableName + "&id=" + id
                        + "\">Edit</a> | <a href=\"TableServlet?action=delete&table=" + tableName + "&id=" + id
                        + "\">Delete</a></td>");
                out.println("</tr>");
            }
            out.println("</table>");

            // 输出添加表单
            out.println("<h3>Add New " + tableName + "</h3>");
            out.println("<form action=\"TableServlet?action=add&table=" + tableName + "\" method=\"post\">");
            rs.beforeFirst();
            while (rs.next()) {
                String columnName = rs.getString("COLUMN_NAME");
                out.println("<label>" + columnName + ": </label>");
                out.println("<input type=\"text\" name=\"" + columnName + "\" required><br>");
            }
            out.println("<input type=\"submit\" value=\"Add\">");
            out.println("</form>");

            out.println("</body></html>");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String action = request.getParameter("action");
        String tableName = request.getParameter("table");
        if (action.equals("add")) {
            try {
                DatabaseMetaData metaData = conn.getMetaData();
                ResultSet rs = metaData.getColumns(null, null, tableName, null);
                String columnNames = "";
                String columnValues = "";
                while (rs.next()) {
                    String columnName = rs.getString("COLUMN_NAME");
                    columnNames += columnName + ",";
                    columnValues += "'" + request.getParameter(columnName) + "',";
                }
                columnNames = columnNames.substring(0, columnNames.length() - 1);
                columnValues = columnValues.substring(0, columnValues.length() - 1);

                Statement stmt = conn.createStatement();
                stmt.executeUpdate("INSERT INTO " + tableName + " (" + columnNames + ") VALUES (" + columnValues + ")");

                response.sendRedirect("TableServlet?table=" + tableName);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } else if (action.equals("edit")) {
            String id = request.getParameter("id");
            try {
                DatabaseMetaData metaData = conn.getMetaData();
                ResultSet rs = metaData.getColumns(null, null, tableName, null);
                String setValues = "";
                while (rs.next()) {
                    String columnName = rs.getString("COLUMN_NAME");
                    setValues += columnName + "='" + request.getParameter(columnName) + "',";
                }
                setValues = setValues.substring(0, setValues.length() - 1);

                Statement stmt = conn.createStatement();
                stmt.executeUpdate("UPDATE " + tableName + " SET " + setValues + " WHERE id=" + id);

                response.sendRedirect("TableServlet?table=" + tableName);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } else if (action.equals("delete")) {
            String id = request.getParameter("id");
            try {
                Statement stmt = conn.createStatement();
                stmt.executeUpdate("DELETE FROM " + tableName + " WHERE id=" + id);

                response.sendRedirect("TableServlet?table=" + tableName);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public void destroy() {
        try {
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
在这个示例中,我们创建了一个名为TableServlet的Servlet类,它根据传入的表名参数来获取表的元数据,并根据元数据动态生成表单和处理增删改查的操作。在doGet方法中,我们获取表的元数据字段结构并输出网页表单,包括查询表单、列表和添加表单。在doPost方法中,我们处理表单的提交,根据不同的动作(add、edit、delete)执行相应的数据库操作。在init方法中,我们建立数据库连接。在destroy方法中,我们关闭数据库连接。

请注意,这只是一个简单的示例,你可以根据实际情况进行调整和扩展。在使用之前,你需要替换数据库连接信息,并确保你的数据库驱动程序已正确设置。

希望这个示例对你理解使用Servlet和JDBC技术进行增删改查操作有所帮助。

```