idea配置jdbc
下载驱动

配置jdbc
下面演示的时候用的是mysql-connector-java-5.1.38.jar。实际更推荐用8.x以上的版本比如如mysql-connector-j-8.4.0.jar,不过mysql-connector-java-5.1.38.jar依然能用。在project structure中选择libraries然后选择添加java

选择提前下载好的驱动

配置进Libraries

配置进Modules

配置进Artifact

可以看到项目库里面已经有对应的jar包添加进来

到这里我们的idea已经配置好了jdbc相关环境
测试
由于我们测试的时候是要和数据库打交道所以这里我们需要再数据库中新建表并添加数据
新建数据库
首先新建数据库jspdb

新建表
新建表users

可以在右边的红框中输入下面的sql语句建表users
bash
-- 创建 users 表
CREATE TABLE IF NOT EXISTS users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
number VARCHAR(20) NOT NULL,
email VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
添加数据
输入下面的sql语句
bash
-- 插入测试数据
INSERT INTO users (name, number, email) VALUES
('张三', '13800138001', 'zhangsan@example.com'),
('李四', '13900139002', 'lisi@example.com'),
('王五', '13700137003', 'wangwu@example.com'),
('赵六', '13600136004', 'zhaoliu@example.com'),
('孙七', '13500135005', 'sunqi@example.com'),
('测试用户', '15888888888', 'test@example.com');
或者直接在cmd中输入上述代码也可以

最后数据表的数据如下

导出数据库
点击右键选择转储SQL然后点击结构和数据,会生成对应的.sql文件

导入数据库
点击右键选择运行SQL文件

选择需要导入的.sql文件即可

编写第一个测试页面
创建jdbc.jsp

代码如下
java
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
String name = request.getParameter("username");
if(name!= null && !name.isEmpty()){
// 8.x版本
Class.forName("com.mysql.cj.jdbc.Driver");
// 5.x版本
// Class.forName("com.mysql.jdbc.Driver");
// 8.x版本
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jspdb","root","123456");
// 5.x版本
// Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jspdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8","root","123456");
String sql = "select * from users where name =?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,name);
ResultSet rs = ps.executeQuery();
while (rs.next()){
out.println(rs.getString("name")+rs.getString("number"));
}
ps.close();
conn.close();
}
%>
<form action="jdbc.jsp">
<input type="text" name="username" required placeholder="请输入用户名" /><br>
<input type="submit" value="提交">
</form>
</body>
</html>
其中如果是用5.x的驱动需要将useSSL设为false比如Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jspdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8","root","123456");。因为5.x并不支持像8.x的安全协议。否则可能会报错
bash
类型 异常报告
消息 在 [15] 行处理 [/jdbc.jsp] 时发生异常
描述 服务器遇到一个意外的情况,阻止它完成请求。
例外情况
org.apache.jasper.JasperException: 在 [15] 行处理 [/jdbc.jsp] 时发生异常
12: String name = request.getParameter("username");
13: if(name!= null && !name.isEmpty()){
14: Class.forName("com.mysql.jdbc.Driver");
15: Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jspdb","root","123456");
16: String sql = "select * from users where name =?";
17: PreparedStatement ps = conn.prepareStatement(sql);
18: ps.setString(1,name);
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:581)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:457)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:349)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:300)
javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
根本原因。
javax.servlet.ServletException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 355 milliseconds ago. The last packet sent successfully to the server was 348 milliseconds ago.
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:625)
org.apache.jsp.jdbc_jsp._jspService(jdbc_jsp.java:173)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:62)
javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:349)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:300)
javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
根本原因。
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 355 milliseconds ago. The last packet sent successfully to the server was 348 milliseconds ago.
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.lang.reflect.Constructor.newInstance(Constructor.java:423)
com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:981)
com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:164)
com.mysql.jdbc.MysqlIO.negotiateSSLConnection(MysqlIO.java:4801)
com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1643)
com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1215)
com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2255)
com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2286)
com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2085)
com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:795)
com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.lang.reflect.Constructor.newInstance(Constructor.java:423)
com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:400)
com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:327)
java.sql.DriverManager.getConnection(DriverManager.java:664)
java.sql.DriverManager.getConnection(DriverManager.java:247)
org.apache.jsp.jdbc_jsp._jspService(jdbc_jsp.java:138)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:62)
javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:349)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:300)
javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
根本原因。
javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
sun.security.ssl.HandshakeContext.<init>(HandshakeContext.java:172)
sun.security.ssl.ClientHandshakeContext.<init>(ClientHandshakeContext.java:106)
sun.security.ssl.TransportContext.kickstart(TransportContext.java:245)
sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:410)
sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:389)
com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:149)
com.mysql.jdbc.MysqlIO.negotiateSSLConnection(MysqlIO.java:4801)
com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1643)
com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1215)
com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2255)
com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2286)
com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2085)
com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:795)
com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.lang.reflect.Constructor.newInstance(Constructor.java:423)
com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:400)
com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:327)
java.sql.DriverManager.getConnection(DriverManager.java:664)
java.sql.DriverManager.getConnection(DriverManager.java:247)
org.apache.jsp.jdbc_jsp._jspService(jdbc_jsp.java:138)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:62)
javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:349)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:300)
javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
):注意 主要问题的全部 stack 信息可以在 server logs 里查看
运行
访问http://localhost:8085/jsp03/jdbc.jsp

输入张三并提交

可以看到已经准确查询出相关信息