上一篇
html访问oracle数据库
- 行业动态
- 2025-04-25
- 3177
通过HTML表单提交请求,由后端(如Java/Python)使用JDBC/ODBC驱动连接Oracle,执行SQL并返回结果,需配置数据库驱动、中间件及安全参数
环境准备
安装Oracle数据库
- 下载并安装Oracle数据库(如Oracle 19c)。
- 配置监听器(
listener.ora
)和服务命名(tnsnames.ora
)。 - 创建用户并授予权限:
CREATE USER test_user IDENTIFIED BY password; GRANT CONNECT, RESOURCE TO test_user;
选择后端技术
HTML无法直接访问数据库,需通过后端语言(如Java、PHP、Python)桥接,以下是常见方案:
| 技术栈 | 说明 |
|————–|———————————————————————-|
| Java + JSP | 使用JDBC连接Oracle,适合企业级应用。 |
| PHP | 通过oci8
扩展或PDO_OCI驱动连接Oracle。 |
| Python | 使用cx_Oracle
库,轻量级脚本开发。 |
| Node.js | 通过oracledb
模块实现异步操作。 |
实现步骤(以Java+JSP为例)
配置JDBC驱动
- 下载Oracle JDBC驱动(如
ojdbc8.jar
),放入Web应用的/WEB-INF/lib
目录。 - 在
web.xml
中配置数据源(可选):<resource-ref> <description>Oracle DB Connection</description> <res-ref-name>jdbc/oracle</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
编写后端代码
数据库连接工具类(
DBUtil.java
):public class DBUtil { private static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl"; private static final String USER = "test_user"; private static final String PASSWORD = "password"; public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }
处理表单的Servlet(
QueryServlet.java
):@WebServlet("/query") public class QueryServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String sql = "SELECT FROM users WHERE username LIKE ?"; try (Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { String username = request.getParameter("username"); pstmt.setString(1, "%" + username + "%"); ResultSet rs = pstmt.executeQuery(); // 将结果转为JSON格式 JSONArray json = new JSONArray(); while (rs.next()) { JSONObject obj = new JSONObject(); obj.put("id", rs.getInt("id")); obj.put("username", rs.getString("username")); json.put(obj); } response.setContentType("application/json"); response.getWriter().print(json.toString()); } catch (SQLException e) { e.printStackTrace(); } } }
前端页面与交互
HTML表单(
index.html
):<form id="searchForm"> 用户名: <input type="text" name="username" /> <button type="button" onclick="submitForm()">查询</button> </form> <div id="results"></div> <script> function submitForm() { const formData = new FormData(document.getElementById("searchForm")); fetch("/query", { method: "POST", body: formData }) .then(response => response.json()) .then(data => { const results = document.getElementById("results"); results.innerHTML = "<ul>" + data.map(item => `<li>${item.id} ${item.username}</li>`).join("") + "</ul>"; }); } </script>
关键注意事项
SQL注入防护
- 使用
PreparedStatement
替代Statement
,避免直接拼接SQL。 - 示例:
pstmt.setString(1, username)
自动转义特殊字符。
- 使用
字符编码配置
- Oracle数据库需设置字符集为
AL32UTF8
。 - Web应用需统一编码为UTF-8:
request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8");
- Oracle数据库需设置字符集为
连接池优化
- 使用连接池(如HikariCP、DBCP)提升性能:
HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:orcl"); config.setUsername("test_user"); config.setPassword("password"); HikariDataSource ds = new HikariDataSource(config);
- 使用连接池(如HikariCP、DBCP)提升性能:
相关问题与解答
问题1:如何防止Oracle数据库的SQL注入攻击?
解答:
- 始终使用
PreparedStatement
或存储过程,避免字符串拼接。 - 示例:
String sql = "SELECT FROM users WHERE id = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, userInputId); // 自动处理引号和转义
问题2:为什么推荐使用连接池而非每次新建连接?
解答:
- 性能提升:连接池复用已有连接,减少TCP握手和Oracle认证开销。
- 资源管理:限制最大连接数,避免数据库连接耗尽。
- 示例配置(HikariCP):
config.setMaximumPoolSize(10); // 最大并发连接数 config.setIdleTimeout(60000); // 空闲超时时间(毫秒)