编写单一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技术进行增删改查操作有所帮助。
```