当前位置:首页 > 数据库 > 正文

struts怎么连接数据库

Struts需配合JDBC/JNDI配置数据源,通过DAO层操作 数据库,Action调用Service完成增删改查,结果经OGNL绑定

以下是针对 Struts 框架连接数据库 的完整技术方案及实现细节,涵盖核心概念、配置步骤、代码示例和最佳实践:


整体架构设计思路

Struts 本身不直接操作数据库,需配合以下组件完成持久化功能:

| 层级 | 作用 | 典型技术选型 |

|————|——————————-|—————————–|

| Model | 封装业务逻辑与数据访问 | JavaBean + DAO/Mapper |

| View | 展示层(JSP/FreeMarker) | El表达式/OGNL |

| Controller | 请求分发与流程控制 | ActionServlet/自定义Action |

| Persistence| 数据库交互 | JDBC/C3P0/Druid/Hibernate |

推荐采用 MVC + DAO模式,将数据库操作封装在独立的 DAO 层,通过 Service 层调用,符合单一职责原则。


详细实施步骤

环境准备 & 依赖管理

必需组件清单

struts怎么连接数据库 第1张

  • 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防火墙等功能。

struts怎么连接数据库 第2张

构建 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 内隐式提交;复杂场景建议:

  1. 编程式事务:在 Service 层显式开启/提交/回滚事务 Connection conn = null; try { conn = dataSource.getConnection(); conn.setAutoCommit(false); // 关闭自动提交 // 执行多个SQL操作 conn.commit(); } catch (Exception e) { if (conn != null) conn.rollback(); } finally { // 关闭连接 }
  2. 声明式事务(推荐):若使用 Spring 管理 Struts,可通过 @Transactional 注解自动管理事务边界。

struts怎么连接数据库 第3张

0