当前位置:首页 > 问答 > 正文

怎么用jsp去连mssql数据库,过程和注意点啥的分享

要在一个JSP页面里连接MSSQL数据库,你可以把它想象成几步走:准备东西、建立联系、说句话(执行操作)、然后礼貌地结束,下面我就一步步说,中间需要注意的点也会一起讲。

第一步:准备“桥梁”——数据库驱动jar包

JSP是Java语言,它自己不能直接认识MSSQL数据库,需要一个翻译官,这个翻译官就是一个叫JDBC驱动的东西,对于MSSQL,这个驱动的名字通常是 mssql-jdbc 的jar包。

怎么做:

  1. 你得先去网上找这个jar包,比如去微软的官网或者Maven仓库(一个存放Java库的大仓库)下载,现在最新的版本可能已经到12.x了,但你得看你的MSSQL服务器版本和Java版本,选一个兼容的,有时候用老一点的版本(比如6.0、7.0)反而更稳定,不容易出怪问题。(来源:微软JDBC驱动官方文档的兼容性说明)
  2. 下载下来以后,是一个 .jar 结尾的文件,你不能随便放,得把它放到你的Web项目的 WEB-INF/lib 目录下面,如果你用的是Eclipse、IntelliJ IDEA这些开发工具,通常项目里都有这个文件夹,放进去之后,开发工具一般会自动识别,你的项目就有了和MSSQL对话的能力。

注意点啥:

  • 版本匹配是关键:这是最容易出问题的地方,如果你的MSSQL是比较老的版本(比如SQL Server 2008),你用了最新的JDBC驱动,可能会连不上,报一些看不懂的错误,反过来也一样,所以最好查一下兼容性列表。(来源:实际开发中常见的版本冲突问题)
  • 放对位置:jar包一定要放在 WEB-INF/lib 下,这是Web应用的规矩,放别的地方项目找不到。

第二步:在JSP页面里写连接代码

JSP页面里可以写Java代码(虽然现在不推荐在JSP里写太多Java,但刚开始学可以这么干),连接数据库的代码一般就几行,但每一步都有讲究。

基本过程:

  1. 加载驱动:告诉Java程序:“喂,我们要用那个MSSQL的翻译官了”,代码是:Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
  2. 拼连接地址:就像你要去朋友家,得知道地址一样,这个地址有个固定格式:jdbc:sqlserver://服务器地址:端口号;databaseName=数据库名;,比如你的数据库在你自己的电脑上,端口默认是1433,数据库叫 MyTestDB,那地址就是:jdbc:sqlserver://localhost:1433;databaseName=MyTestDB;
  3. 获取连接:用你的用户名和密码,通过这个地址去建立真正的连接,代码是:Connection conn = DriverManager.getConnection(连接地址, 用户名, 密码);
  4. 创建语句对象:连接上了,你得有个“说话”的工具,才能告诉数据库你要干嘛(是查数据还是改数据),代码是:Statement stmt = conn.createStatement();
  5. 执行SQL语句:用这个“说话”的工具发出命令,比如你想查询用户表里的所有数据:String sql = "SELECT * FROM Users"; ResultSet rs = stmt.executeQuery(sql); 这里 ResultSet 就是装查询结果的一个集合。
  6. 处理结果:你得把 ResultSet 里面的数据一条条拿出来,显示在网页上,通常是用 while(rs.next()) 循环,然后用 rs.getString("字段名") 这样的方法取出每个字段的值。
  7. 最重要的一步:关闭连接:完事之后,一定要把你打开的东西按顺序关掉!就像去别人家做客,走的时候要关门一样,顺序是:先关结果集 rs.close(),再关语句对象 stmt.close(),最后关连接 conn.close()

注意点啥(这里坑最多):

  • 异常处理:上面这些步骤几乎每一步都可能出错(比如网络断了、密码错了、SQL语句写错了),所以必须用 try-catch-finally 块把它们包起来,在 catch 里打印错误信息,方便排查,在 finally 块里去做关闭连接的操作,因为无论是否出错,最后都需要释放资源。(来源:Java编程规范中关于资源管理和异常处理的要求)
  • SQL注入漏洞:上面例子中直接用 Statement 拼接SQL语句是非常危险的!如果用户输入的内容里包含了恶意的SQL代码,比如在登录时用户名输入 ' or '1'='1,就可能绕过登录,甚至删掉你的表,这叫做SQL注入攻击。
    • 解决办法:一定要用 PreparedStatement 来代替 Statement,它就像一个有预留空位的模板,用户输入的数据只会被当作数据来处理,不会被当成代码执行,这是最重要的安全注意事项!(来源:Web应用安全基本准则,如OWASP Top 10中注入攻击长期位列榜首)
  • 资源泄露:如果你不关闭连接,这个连接会一直占着数据库的资源,用户一多,数据库的连接数就被耗尽了,网站就卡死或崩溃了。finally 块里的关闭操作必须保证执行,即使关闭时也可能出错,最好在 finally 里也再套一层 try-catch
  • 连接地址的细节:如果MSSQL服务器实例不是默认实例,或者端口改了,你的连接地址就要写对,有时候还需要加一些参数,encrypt=true 表示要加密连接(现在新版本驱动经常要求这个),trustServerCertificate=true 用于信任服务器证书(在开发测试环境常用),这些参数加在连接字符串的最后。

一个简单的例子(包含了上述注意点):

<%@ page import="java.sql.*" %>
<%
    Connection conn = null;
    PreparedStatement pstmt = null; // 使用PreparedStatement
    ResultSet rs = null;
    try {
        // 1. 加载驱动
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        // 2. 拼连接地址,这里用了PreparedStatement需要的SQL,用?做占位符
        String url = "jdbc:sqlserver://localhost:1433;databaseName=MyTestDB;encrypt=true;trustServerCertificate=true";
        String user = "sa";
        String password = "你的密码";
        // 3. 获取连接
        conn = DriverManager.getConnection(url, user, password);
        // 4. 创建PreparedStatement,SQL中的条件值用?代替
        String sql = "SELECT id, name FROM Users WHERE id > ?";
        pstmt = conn.prepareStatement(sql);
        // 5. 设置参数(第一个参数是第几个问号,从1开始;第二个参数是值)
        pstmt.setInt(1, 10);
        // 6. 执行查询
        rs = pstmt.executeQuery();
        // 7. 处理结果
        while(rs.next()) {
            int id = rs.getInt("id");
            String name = rs.getString("name");
            out.println("ID: " + id + ", Name: " + name + "<br>");
        }
    } catch (Exception e) {
        e.printStackTrace();
        out.println("出错了:" + e.getMessage());
    } finally {
        // 8. 关闭资源,注意顺序和每个close都要try-catch
        try { if (rs != null) rs.close(); } catch (SQLException e) { e.printStackTrace(); }
        try { if (pstmt != null) pstmt.close(); } catch (SQLException e) { e.printStackTrace(); }
        try { if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); }
    }
%>

最后总结一下核心注意点:

  1. 驱动版本要对。
  2. 连接信息(地址、端口、库名)要准。
  3. 必须用PreparedStatement,千万别用Statement拼接字符串,安全第一。
  4. 必须用try-catch-finally处理异常。
  5. 必须在finally里稳妥地关闭所有资源,防止泄露。

虽然现在更高级的做法是把数据库操作写在JavaBean或者专门的DAO类里,JSP只负责显示,但理解这个最原始、最直接的过程,对你搞清楚底层是怎么回事非常有帮助,你先把这个流程跑通,后面再学更规范的分层架构就容易多了。

怎么用jsp去连mssql数据库,过程和注意点啥的分享