在JSP(JavaServer Pages)中与Java连接数据库通常涉及使用JavaBean或Servlet来处理数据库操作,而JSP主要负责展示数据,以下是详细的实现步骤和代码示例,涵盖环境准备、数据库连接、数据操作及常见问题解决。
环境准备
开发工具:安装JDK(建议1.8以上)、IDE(如Eclipse或IntelliJ IDEA)、Tomcat服务器。
数据库:选择MySQL、Oracle等,并创建测试数据库和表,在MySQL中创建:
CREATE DATABASE test_db; USE test_db; CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), email VARCHAR(50)); INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');依赖库:将数据库驱动(如MySQL的
mysql-connector-java-8.0.xx.jar)添加到项目的WEB-INF/lib目录下。
创建数据库连接工具类
在src目录下创建DBUtil.java,封装数据库连接和关闭方法:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBUtil {
private static final String URL = "jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC";
private static final String USER = "root";
private static final String PASSWORD = "password";
public static Connection getConnection() throws SQLException {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
return DriverManager.getConnection(URL, USER, PASSWORD);
} catch (ClassNotFoundException e) {
throw new SQLException("MySQL驱动未找到", e);
}
}
public static void closeConnection(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
} 创建JavaBean处理数据
创建User.java作为实体类,对应数据库表结构:
public class User {
private int id;
private String name;
private String email;
// 构造方法、getter和setter省略
} 创建DAO层操作数据库
创建UserDAO.java,实现数据库增删改查:
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class UserDAO {
public List<User> getAllUsers() {
List<User> users = new ArrayList<>();
String sql = "SELECT * FROM users";
try (Connection conn = DBUtil.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
users.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
}
return users;
}
} 在JSP中调用Java代码
使用JSP脚本片段(不推荐,混合逻辑和视图):

<%@ page import="java.util.*, com.example.*" %> <% UserDAO userDAO = new UserDAO(); List<User> users = userDAO.getAllUsers(); %> <table border="1"> <tr><th>ID</th><th>Name</th><th>Email</th></tr> <% for (User user : users) { %> <tr> <td><%= user.getId() %></td> <td><%= user.getName() %></td> <td><%= user.getEmail() %></td> </tr> <% } %> </table>推荐使用JSTL和EL表达式(分离逻辑与视图):
- 在JSP页面引入JSTL核心标签库:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <% request.setAttribute("users", new UserDAO().getAllUsers()); %> <table border="1"> <tr><th>ID</th><th>Name</th><th>Email</th></tr> <c:forEach var="user" items="${users}"> <tr> <td>${user.id}</td> <td>${user.name}</td> <td>${user.email}</td> </tr> </c:forEach> </table>
- 在JSP页面引入JSTL核心标签库:
常见问题与解决方案
中文乱码问题:
- 原因:数据库、JSP页面、连接字符集不一致。
- 解决:确保数据库和表使用
utf8mb4字符集;JSP页面添加<%@ page contentType="text/html;charset=UTF-8" %>;连接URL中添加useUnicode=true&characterEncoding=UTF-8。
连接池配置(如使用Druid):
- 在
web.xml中配置数据源:<context-param> <param-name>driverClassName</param-name> <param-value>com.mysql.cj.jdbc.Driver</param-value> </context-param> <context-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/test_db</param-value> </context-param> <context-param> <param-name>username</param-name> <param-value>root</param-value> </context-param> <context-param> <param-name>password</param-name> <param-value>password</param-value> </context-param> - 通过
JNDI获取连接池,避免硬编码。
- 在
相关问答FAQs
Q1: JSP中直接写Java代码连接数据库为什么不推荐?
A1: 直接在JSP中编写Java代码会导致逻辑与视图耦合,难以维护和测试,推荐使用MVC模式,由Servlet或JavaBean处理业务逻辑,JSP仅负责展示数据,提高代码可读性和复用性。

Q2: 如何优化数据库连接性能?
A2: 使用连接池(如Druid、HikariCP)管理数据库连接,避免频繁创建和销毁连接,合理设置连接池大小、超时时间等参数,并确保SQL语句高效(如添加索引、避免全表查询)。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复