在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语句高效(如添加索引、避免全表查询)。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复