javaweb连接mysql 实现CRUD

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工程,导入驱动

  1. 本次使用maven,选中org.apache.maven创建,配置好tomcat后检测

请添加图片描述

  1. 在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是访问数据库返回的数据表,也就是结果集合。

    1. 一开始是处于第一行之前,即beforeFirst,第一次使用next()就将指针指向返回结果集的第一行。
    2. 每使用一次next(),指针指向下一行,可以使用rs.getObject()、getInt()、getString()之类的方法返回该行的某一个字段的值,也就是getObject()方法里面的参数可以传递索引(索引由1开始),即如果你的数据库第一列的数据叫id,那你可以getObject(“id”)或者getObject(1)得到你的rs目前指着的那一条数据的该列的值。
    3. 当next()成功的时候其实会返回一个布尔值true,当指针指到最后一行的后面时候,即afterLast()就返回布尔值false。
    4. .第一次调用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>
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王斐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值