javaweb连接mysql 实现CRUD
文章目录
1. 创建数据库
//创建user表
creat table user(
id int(11) not null auto_increment KEY,
username varchar(32) not null,
password varchar(20) not null
)
//添加数据
INSERT INTO USER VALUES(1,"wf","123");
INSERT INTO USER VALUES(2,"张飞","123");
INSERT INTO USER VALUES(3,"关羽","123");
2. 创建web工程,导入驱动
- 本次使用maven,选中org.apache.maven创建,配置好tomcat后检测
- 在web-INF中创建新的包lib,将下载好的jar包导入,并且build到module中。
3. jdbc创建和执行过程
(1) 创建Connection对象、SQL查询命令字符串;
(2) 对Connection对象传入SQL查询,获得PreparedStatement对象;
(3) 对PreparedStatement对象执行executeUpdate()或者executeQuery()获得结果;
(4) 先后关闭PreparedStatement对象和Connection对象。
关闭自动提交:setAutoCommit(false) 手动提交:commit();
源码:
<%
Class.forName("com.mysql.jdbc.Driver");
Connection connection =DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123456");
PreparedStatement preparedStatement = connection.prepareStatement("select * from user");
ResultSet resultSet = preparedStatement.executeQuery();
%>
解析:
关于Class.forName(“com.mysql.jdbc.Driver”);实际上就是为了加载类时,调用了Driver的静态代码块中的注册函数,底层代码如下:
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
}
所以用Class.forName实际上就是为了调用这个注册驱动的方法。当然我们也可以直接调用DriverManager类中的registerDriver(new com.mysql.jdbc.Driver())来进行驱动的注册,这样就不用Class.forName了。
Connection类:
- 是java API中提供的一个接口
- 它的实现类由其他厂商完成,用来建立与数据库的连接
- 通常调用Connection的方法例如:Statement()、PreparedStatement()。Statement()方法很少使用,因为它的接口比较少,子方法PreparedStatement()经常被使用
- PreparedStatement比Statement更安全,没有SQL注入问题
- 它的实例对象是一条预编译过的SQL语句
- 可以发送SQL语句到数据库
PreparedStatement接口提供了三种执行SQL语句方法:executeQuery、executeUpdate和execute。使用哪一种方法由SQL语句中的内容决定。
一般select语句使用executeQuery()方法执行,delete、update、insert语句使用executeUpdate()方法执行,execute()方法用于执行多个结果集,也可用于执行delete、update、insert语句。
ResultSet 结果集:
是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,同时还具有操作数据的功能,完成对数据的更新等。
-
可滚动的ResultSet类型
next(),previous(),回到第一行first(),去掉ResultSet中的第几行 absolute(int n),以及移动到相对当前第几行relative(int n),
ResultSet对象的next()方法深入剖析:
最初,指针被置于第一行之前,next方法将指针移动到下一行,当该方法在ResultSet对象中没有下一行是,返回false,所以可以在while循环中使用它来迭代结果集。
While(rs.next()){ //如果返回ture //可以循环取出多行数据 } If(rs.next()){ //如果返回ture 再取出指针所指向的那行数据 }
ResultSet是访问数据库返回的数据表,也就是结果集合。
- 一开始是处于第一行之前,即beforeFirst,第一次使用next()就将指针指向返回结果集的第一行。
- 每使用一次next(),指针指向下一行,可以使用rs.getObject()、getInt()、getString()之类的方法返回该行的某一个字段的值,也就是getObject()方法里面的参数可以传递索引(索引由1开始),即如果你的数据库第一列的数据叫id,那你可以getObject(“id”)或者getObject(1)得到你的rs目前指着的那一条数据的该列的值。
- 当next()成功的时候其实会返回一个布尔值true,当指针指到最后一行的后面时候,即afterLast()就返回布尔值false。
- .第一次调用next()的时候应该是指向第一行数据。next()在指针指向第一行之前到最后一行之间的返回true,也就是当指针已经指向到最后一行的数据集了,再用一次next()是返回true的,但此时再用一次next()就是false,因为执政已经到最后一行的后面了(也就是afterLast)
4. SelectUser剩余代码
<table border="1">
<tr >
<th>id</th>
<th>username</th>
<th>password</th>
<th colspan="2">操作</th>
</tr>
<%
while(resultSet.next()){
%>
<tr>
<td><%=resultSet.getString("id")%></td> <%--或者<%=resultSet.getInt(1)%>--%>
<td><%=resultSet.getString(2)%></td> <%-- 或者<%=resultSet.getString("username")%>--%>
<td><%=resultSet.getString("password")%></td>
<td>
<a href="updateUser.jsp?id=<%= resultSet.getString("id")%>">修改 </a>
<a href="deleteUser.jsp?id=<%= resultSet.getString("id")%>">删除 </a>
</td>
</tr>
<%
}
%>
<tr>
<td colspan="4" align="center"><a href="insertUser.jsp"><input type="submit" value="添加用户"></a> </td>
</tr>
</table>
<%
if (preparedStatement != null){
preparedStatement.close();
}
if (connection !=null){
connection.close();
}
} catch (Exception e){
out.println(e);
}
%>
resultSet.getString()、resultSet.getInt() 括号内可以是int和String类型,int表示列,String表示列名
5. insertUser代码
<%--
Created by IntelliJ IDEA.
User: 王斐
Date: 2022/4/24
Time: 19:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>添加用户</title>
</head>
<body>
<form action="doInsertUser.jsp" method="get" οnsubmit="return check(this)" name="reg">
用户名:<input type="text" name="username" placeholder="请输入用户名"><br>
密码:<input type="password" name="password" placeholder="请输入密码"><br>
<input type="submit" value="添加">
<input type="reset" value="重置">
</form>
</body>
</html>
6. doInsertUser代码
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.PreparedStatement" %>
<%--
Created by IntelliJ IDEA.
User: 王斐
Date: 2022/4/24
Time: 19:56
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/test";
String name ="root";
String password = "*******";
Connection connection = DriverManager.getConnection(url,name,password);
String sql = "insert into user(username, password) values(?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//给sql语句中的问号赋值,获取到的insertUser中的username, 获取到password。
preparedStatement.setString(1,request.getParameter("username"));
preparedStatement.setString(2,request.getParameter("password"));
%>a
<%
int i = preparedStatement.executeUpdate();
if (i > 0 ){
%>
添加成功!!!
<%
}else {%>
添加失败!!!
<%
}
%>
//刷新,三秒后跳转到selectUser界面
<% response.setHeader("refresh","3;url=selectUser.jsp");%>
</body>
</html>
preparedStatement.setString() 这个方法括号内需要填两个类型的数值,int parameterIndex, String x;
将字符串传到sql语句中的第一个?中。
7. updateUser代码
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.ResultSet" %><%--
Created by IntelliJ IDEA.
User: 王斐
Date: 2022/4/24
Time: 21:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>修改用户</title>
</head>
<body>
<%
String id = request.getParameter("id");
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123456");
PreparedStatement preparedStatement = connection.prepareStatement("select * from user where id = ?");
preparedStatement.setString(1,id);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()){
String username = resultSet.getString("username");
String password = resultSet.getString("password");
%>
<%--
doUpdateUser.jsp?id=<%=resultSet.getString("id")%>
--%>
<form action="doUpdateUser.jsp?id=<%=resultSet.getString("id")%>" method="post" >
用户id:<%=request.getParameter("id")%><br>
<%--用户id:<input hidden name="id" value="<%=id%>" /> <%=id%> <br>--%>
请输入新用户名:<input type="text" name="username" value="<%=username%>"><br>
请输入新密码:<input type="password" name="password" value="<%=password%>"><br>
<input type="submit" value="修改">
<input type="reset" value="重置">
</form>
<%
}
%>
</body>
</html>
提交方式不同,post提交会有中文乱码问题,get则不会,get请求在Tomcat8时修复了部分中文乱码问题。
8. doUpdateUser代码
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %><%--
Created by IntelliJ IDEA.
User: 王斐
Date: 2022/4/24
Time: 21:42
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//post请求 需要手动修改乱码问题
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String username = request.getParameter("username");
String password = request.getParameter("password");
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","******");
PreparedStatement preparedStatement = connection.prepareStatement("update user set username = ? , password = ? where id = ?");
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
preparedStatement.setString(3,id);
int i = preparedStatement.executeUpdate();
if (i>0){
response.setHeader("refresh","1;url = selectUser.jsp");
} else {
out.println("没修改成功");
}
//添加时候用的是get请求 修改用的是post
// get请求tomcat8以后已经修复了乱码问题
// post请求需要我们手动去设置
%>
</body>
</html>
当用post请求时,会出现中文乱码问题,必须在获取变量时,提前将其转码
get则不存在这种问题
因为Tomcat8.5时,修复了get请求方法部分中文乱码问题
deleteUser代码:
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.DriverManager" %><%--
Created by IntelliJ IDEA.
User: 王斐
Date: 2022/4/24
Time: 20:43
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?CharacterEncoding=utf-8","root","*********");
//自动提交事务
//connection.setAutoCommit(false);
PreparedStatement preparedStatement = connection.prepareStatement("delete from user where id = ?");
preparedStatement.setString(1,request.getParameter("id"));
int i = preparedStatement.executeUpdate();
// 这是提交事务用的, 默认是自动提交的,
// preparedStatement.close();
// connection.commit();
if (i>0){
response.setHeader("refresh","2;url = selectUser.jsp");
}else {
System.out.println("删除失败");
}
%>
</body>
</html>
eStatement("delete from user where id = ?");
preparedStatement.setString(1,request.getParameter("id"));
int i = preparedStatement.executeUpdate();
// 这是提交事务用的, 默认是自动提交的,
// preparedStatement.close();
// connection.commit();
if (i>0){
response.setHeader("refresh","2;url = selectUser.jsp");
}else {
System.out.println("删除失败");
}
%>
</body>
</html>