jsp怎么连接mysql数据库
先把驱动jar包扔进WEB-INF/lib目录,数据这是数据第一步,也是数据最容易卡住新手的地方。我用的数据是mysql-connector-java-8.0.33.jar,版本别太老,数据8.x的数据驱动类名是com.mysql.cj.jdbc.Driver,跟5.x的数据com.mysql.jdbc.Driver不一样。你要是数据拿旧代码硬套,控制台直接给你甩个ClassNotFoundException,数据那时候别慌,数据先检查jar包在不在。数据
连接代码其实就六行,数据核心是数据DriverManager.getConnection()这个方法。看这段:
Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/testdb?数据useSSL=false&serverTimezone=UTC"; String user = "root"; String password = "123456"; Connection conn = DriverManager.getConnection(url, user, password); 注意URL里的serverTimezone参数,不加它,数据MySQL 8.x会报时区错误。我当初调这个参数调了半小时,最后发现是少了个useSSL=false,本地测试根本不需要SSL加密,加上反而拖慢速度。
获取连接之后,写个Statement或者PreparedStatement就能执行SQL了。我强烈建议直接用PreparedStatement,别图省事用Statement拼接字符串。为啥?防SQL注入是其一,其二是预编译语句处理参数更灵活。比如你要查用户输入的名字:
String sql = "SELECT * FROM users WHERE name = ?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, inputName); ResultSet rs = ps.executeQuery(); while(rs.next()) { out.println(rs.getString("email")); } 那个问号就是占位符,用setString填进去,省得自己加引号转义,多省心。
用完记得关资源,顺序是ResultSet → PreparedStatement → Connection,倒着关。我见过有人只关Connection,结果连接池被占满,页面卡死。要是用try-with-resources语法(Java 7+),自动关闭,代码干净不少:
try (Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery()) { // 处理结果 } catch (SQLException e) { e.printStackTrace(); } 但JSP里写这种Java代码实在不优雅,页面里塞满<% %>标签,维护起来想砸电脑。我见过一个老项目,整个JSP页面全是脚本片段,改个SQL要翻几百行。后来我习惯把数据库操作封装到单独的DAO类里,JSP只负责调用,页面清爽,逻辑也清晰。比如建个UserDao,里面写个findByName(String name)方法,JSP里调用就一行:
<% User user = UserDao.findByName(request.getParameter("name")); %> 这才像话。
还有个坑是字符编码。连接MySQL时URL里加上characterEncoding=utf8,不然中文全变问号。JSP页面顶部也要写<%@ page contentType="text/html;charset=UTF-8" %>,两边编码不一致,乱码没跑。
最后说连接池。别每次请求都新建Connection,性能差得离谱。我试过用Druid或者HikariCP,配置也就十几行,但并发一上来,差距立竿见影。你拿个简单的DriverManager跑单线程测试没问题,一旦有几十个用户同时点,数据库连接数直接爆掉。连接池的好处就是复用连接,省去反复握手的开销。
写JSP数据库连接,说白了就是三步:加载驱动、获取连接、执行SQL。但真正写得好的人,会考虑资源管理、编码、性能。我见过太多人卡在第一步的jar包上,也见过有人把密码硬编码在JSP里,安全漏洞一堆。数据库密码应该放在配置文件中,用JNDI或者环境变量读取。别嫌麻烦,上线之后你就知道这有多重要了。
