当前位置:首页 > 行业动态 > 正文

html访问oracle数据库

通过HTML表单提交请求,由后端(如Java/Python)使用JDBC/ODBC驱动连接Oracle,执行SQL并返回结果,需配置数据库驱动、中间件及安全参数

环境准备

  1. 安装Oracle数据库

    • 下载并安装Oracle数据库(如Oracle 19c)。
    • 配置监听器(listener.ora)和服务命名(tnsnames.ora)。
    • 创建用户并授予权限:
      CREATE USER test_user IDENTIFIED BY password;
      GRANT CONNECT, RESOURCE TO test_user;
  2. 选择后端技术
    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);
        }
    }
  • 处理表单的ServletQueryServlet.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>

关键注意事项

  1. SQL注入防护

    • 使用PreparedStatement替代Statement,避免直接拼接SQL。
    • 示例:pstmt.setString(1, username)自动转义特殊字符。
  2. 字符编码配置

    • Oracle数据库需设置字符集为AL32UTF8
    • Web应用需统一编码为UTF-8:
      request.setCharacterEncoding("UTF-8");
      response.setCharacterEncoding("UTF-8");
  3. 连接池优化

    • 使用连接池(如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);

相关问题与解答

问题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);  // 空闲超时时间(毫秒)
0