struts怎么连接数据库
- 数据库
- 2025-08-16
- 5
以下是针对 Struts 框架连接数据库 的完整技术方案及实现细节,涵盖核心概念、配置步骤、代码示例和最佳实践:
整体架构设计思路
Struts 本身不直接操作数据库,需配合以下组件完成持久化功能:
| 层级 | 作用 | 典型技术选型 |
|————|——————————-|—————————–|
| Model | 封装业务逻辑与数据访问 | JavaBean + DAO/Mapper |
| View | 展示层(JSP/FreeMarker) | El表达式/OGNL |
| Controller | 请求分发与流程控制 | ActionServlet/自定义Action |
| Persistence| 数据库交互 | JDBC/C3P0/Druid/Hibernate |
推荐采用 MVC + DAO模式,将数据库操作封装在独立的 DAO 层,通过 Service 层调用,符合单一职责原则。
详细实施步骤
环境准备 & 依赖管理
必需组件清单:

- Struts Core Library (struts-core.jar)
- JDBC Driver (根据数据库类型选择):
- MySQL: mysql-connector-java.jar
- PostgreSQL: postgresql.jar
- Oracle: ojdbc.jar
- 连接池组件(可选):Apache Commons DBCP2 / C3P0 / Druid
- Logging Framework (SLF4J + Logback)
️ 注意:将上述 JAR 包放入 WEB-INF/lib 目录,Maven 项目则添加对应依赖。
数据库连接池配置(以 Druid 为例)
# druid.properties druid.driverClassName=com.mysql.cj.jdbc.Driver druid.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC druid.username=root druid.password=123456 druid.initialSize=5 druid.minIdle=5 druid.maxActive=20 druid.maxWait=60000 # 超时等待时间(毫秒)
优势:支持监控统计、防泄漏检测、SQL防火墙等功能。

构建 DAO 层(关键步骤)
▶︎ UserDao.java 接口定义
public interface UserDao { List<User> findAll(); User findById(int id); void insert(User user); void update(User user); void delete(int id); }
▶︎ JdbcUserDaoImpl.java 实现类
import org.apache.commons.dbcp2.BasicDataSource; import java.sql.; import java.util.ArrayList; import java.util.List; public class JdbcUserDaoImpl implements UserDao { private BasicDataSource dataSource; // 由 Spring/手动初始化 public void setDataSource(BasicDataSource ds) { this.dataSource = ds; } @Override public List<User> findAll() throws SQLException { String sql = "SELECT FROM users"; try (Connection conn = dataSource.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery()) { List<User> list = new ArrayList<>(); while (rs.next()) { User u = new User(); u.setId(rs.getInt("id")); u.setName(rs.getString("name")); list.add(u); } return list; } } // 其他CRUD方法类似... }
技巧:使用 try-with-resources 确保资源释放,避免内存泄漏。
集成到 Struts Action
▶︎ UserAction.java 控制器
import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.ServletRequestAware; import javax.servlet.http.HttpServletRequest; import java.util.Map; public class UserAction extends ActionSupport implements ServletRequestAware { private UserDao userDao; // 通过 Setter 载入 private HttpServletRequest request; @Override public void setServletRequest(HttpServletRequest request) { this.request = request; } public void setUserDao(UserDao userDao) { this.userDao = userDao; } public String execute() { try { List<User> users = userDao.findAll(); request.setAttribute("users", users); return SUCCESS; // 跳转至 success.jsp } catch (Exception e) { addActionError("数据库查询失败: " + e.getMessage()); return ERROR; } } }
▶︎ struts.xml 配置映射
<struts> <package name="default" namespace="/" extends="struts-default"> <action name="userList" class="com.example.UserAction"> <result name="success">/user/list.jsp</result> <result name="error">/error.jsp</result> </action> </package> </struts>
JSP 页面显示数据
<!-list.jsp --> <%@ taglib uri="/struts-tags" prefix="s" %> <table border="1"> <tr><th>ID</th><th>姓名</th></tr> <s:iterator value="users"> <tr> <td><s:property value="id"/></td> <td><s:property value="name"/></td> </tr> </s:iterator> </table>
高级优化策略
| 优化方向 | 实施方案 | 收益 |
|---|---|---|
| 连接复用 | 使用连接池代替每次新建连接 | QPS 提升 5-10倍 |
| SQL预处理 | PreparedStatement 替代普通 Statement | 防SQL载入 + 执行效率↑ |
| 懒加载 | Hibernate/MyBatis 延迟加载大字段 | 减少不必要的数据传输 |
| 缓存机制 | Ehcache/Redis 缓存热点数据 | 降低数据库压力达70% |
| 分页查询 | PageHelper/MyBatis PageInterceptor | 百万级数据秒级响应 |
常见错误及解决方案
| 现象 | 原因 | 解决方法 |
|---|---|---|
| ClassNotFoundException: Driver | 未正确导入JDBC驱动包 | 检查 lib 目录下是否存在驱动JAR |
| Connection refused | 数据库服务未启动/防火墙拦截 | netstat -an 检查端口连通性 |
| Too many connections | 连接池最大活跃数不足 | 调高 maxActive 参数 |
| Chinese character garbled | 字符编码不一致 | URL/JdbcUrl 添加 ?characterEncoding=UTF-8 |
相关问答 FAQs
Q1: Struts 能否直接操作数据库?为什么需要额外配置?
答:Struts 本质是一个 MVC 框架,专注于请求处理和视图渲染,并不包含数据库操作能力,必须通过以下两种方式之一实现数据持久化:① 自行编写 JDBC 代码(推荐搭配连接池);② 集成 ORM 框架(如 Hibernate),额外配置是为了建立应用程序与数据库之间的物理通道,这是任何 Web 应用访问数据库的必要前提。
Q2: 如何处理数据库事务?
答:对于简单操作可在单个 Action 内隐式提交;复杂场景建议:
- 编程式事务:在 Service 层显式开启/提交/回滚事务 Connection conn = null; try { conn = dataSource.getConnection(); conn.setAutoCommit(false); // 关闭自动提交 // 执行多个SQL操作 conn.commit(); } catch (Exception e) { if (conn != null) conn.rollback(); } finally { // 关闭连接 }
- 声明式事务(推荐):若使用 Spring 管理 Struts,可通过 @Transactional 注解自动管理事务边界。
