使用Servlet完成单表的CRUD
- 实现步骤
- 第一步:准备一张数据库表。(sql脚本)
- 第二步:准备一套HTML页面(项目原型)【前端开发工具使用HBuilder】
- 第三步:分析我们这个系统包括哪些功能
- 第四步:在IDEA当中搭建开发环境
- 第五步:实现第一个功能:查看部门列表
- 第六步:查看部门详情。
- 第七步:删除部门
- 第九步:跳转到修改部门的页面
- 第十步:修改部门
使用纯粹的Servlet完成单表【对部门的】的增删改查操作。(B/S结构的。)
实现步骤
第一步:准备一张数据库表。(sql脚本)
部门表
drop table if exists dept;
create table dept(deptno int primary key,dname varchar(255),loc varchar(255)
);
insert into dept(deptno, dname, loc) values(10, 'XiaoShouBu', 'BEIJING');
insert into dept(deptno, dname, loc) values(20, 'YanFaBu', 'SHANGHAI');
insert into dept(deptno, dname, loc) values(30, 'JiShuBu', 'GUANGZHOU');
insert into dept(deptno, dname, loc) values(40, 'MeiTiBu', 'SHENZHEN');
commit;
select * from dept;+--------+------------+-----------+
| deptno | dname | loc |
+--------+------------+-----------+
| 10 | XiaoShouBu | BEIJING |
| 20 | YanFaBu | SHANGHAI |
| 30 | JiShuBu | GUANGZHOU |
| 40 | MeiTiBu | SHENZHEN |
+--------+------------+-----------+
第二步:准备一套HTML页面(项目原型)【前端开发工具使用HBuilder】
- 把HTML页面准备好
- 然后将HTML页面中的链接都能够跑通。(页面流转没问题。)然后,具体哪一些数据是动态的,哪一些是静态的,到时候再分析
- 应该设计哪些页面呢?
- 欢迎页面:index.html
- 列表页面:list.html(以列表页面为核心,展开其他操作。)
- 新增页面:add.html
- 修改页面:edit.html
- 详情页面:detail.html
欢迎页面:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>欢迎使用oa系统</title></head><body><a href="list.html">查看部门列表</a></body>
</html>
列表页面:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>部门列表页面</title></head><body><h1 align="center">部门列表</h1><hr /><table border="1px" align="center" width="50%"><tr><th>序号</th><th>部门编号</th><th>部门名称</th><th>操作</th></tr><tr><td>1</td><td>10</td><td>销售部</td><td><a href="">删除</a><a href="edit.html">修改</a><a href="detail.html">详情</a></td></tr><tr><td>2</td><td>20</td><td>研发部</td><td><a href="">删除</a><a href="edit.html">修改</a><a href="detail.html">详情</a></td></tr><tr><td>3</td><td>30</td><td>运营部</td><td><a href=>删除</a><a href="edit.html">修改</a><a href="detail.html">详情</a></td></tr></table><a href="add.html" >新增部门</a></body>
</html>
目前页面都是写死的,后续的话,需要动态获取数据,比如说,我们在销售部那里点击修改,那么跳出的数据,部门名称就应该是销售部,点击哪一个部门,显示就应该是哪一个部门。这些值都是通过数据库查出来的,动态展示
修改部门的时候,部门编号是不能修改的,因为我们修改数据的时候,是通过部门编号作为筛选条件,来进行修改的
新增页面:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>新增部门</title></head><body><form action="list.html" method="get">部门编号<input type="text" name="deptno" /><br />部门名称<input type="text" name="dname" /><br />部门位置<input type="text" name="loc" /><br /><input type="submit" value="保存" /> <br /></form></body>
</html>
修改页面:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>修改部门</title></head><body><form action="list.html" method="get">部门编号<input type="text" name="deptno" value="20" readonly=""/><br />部门名称<input type="text" name="dname" value="销售部"/><br />部门位置<input type="text" name="loc" value="北京"/><br /><input type="submit" value="修改" /> <br /></form></body>
</html>
详情页面:
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>部门详情</title></head><body><h1>部门详情</h1><hr />部门编号:20<br />部门名称:销售部<br />部门位置:北京<br /><input type="button" value="后退" onclick="window.history.back()" /></body>
</html>
第三步:分析我们这个系统包括哪些功能
- 什么叫做一个功能呢?
- 只要 这个操作连接了数据库,就表示一个独立的功能。
- 包括哪些功能?
- 查看部门列表
- 新增部门
- 删除部门
- 查看部门详细信息
- 跳转到修改页面
- 修改部门
第四步:在IDEA当中搭建开发环境
- 创建一个webapp(给这个webapp添加servlet-api.jar和jsp-api.jar到classpath当中。)
- 向webapp中添加连接数据库的jar包(mysql驱动)
- 必须在WEB-INF目录下新建lib目录,然后将mysql的驱动jar包拷贝到这个lib目录下。这个目录名必须叫做lib,全部小写的。
- JDBC的工具类
package com.bjpowernode.oa.utils;import java.sql.*;
import java.util.ResourceBundle;/**JDBC工具类* @author zengyihong* @create 2022--03--10 20:21*/
public class DBUtils {//静态变量,在类加载时执行,自上而下的顺序//根据属性配置文件的key获取valueprivate static ResourceBundle boundle=ResourceBundle.getBundle("resources.jdbc");private static String driver=boundle.getString("driver");private static String url=boundle.getString("url");private static String user=boundle.getString("user");private static String password=boundle.getString("password");static {try {//连接数据库的驱动,不能写死,以后可能连接其他数据库,比如Oracle//OCP开闭原则:对扩展开放,对修改关闭(功能扩展的时候,不需要修改Java源代码)//Class.forName("com.mysql.jdbc.Driver");Class.forName(driver);} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 注册驱动只需要一次,可以使用静态代码块*/public static Connection getConnection() throws SQLException {Connection conn= DriverManager.getConnection(url,user,password);return conn;}/*** 释放资源* @param conn 连接对象* @param ps 数据库操作对象* @param rs 结果集对象*/public static void close(Connection conn, Statement ps, ResultSet rs){if (rs !=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}try {if (ps !=null){ps.close();}} catch (SQLException e) {e.printStackTrace();}try {if (rs !=null){rs.close();}} catch (SQLException e) {e.printStackTrace();}}}
- 将所有HTML页面拷贝到web目录下。
第五步:实现第一个功能:查看部门列表
我们应该怎么去实现一个功能呢?
- 建议:你可以从后端往前端一步一步写。也可以从前端一步一步往后端写。都可以。但是千万要记住不要想起来什么写什么。你写代码的过程最好是程序的执行过程。也就是说:程序执行到哪里,你就写哪里。这样一个顺序流下来之后,基本上不会出现什么错误、意外。
- 从哪里开始?
- 假设从前端开始,那么一定是从用户点击按钮那里开始的。
- 第一:先修改前端页面的超链接,因为用户先点击的就是这个超链接。
- 因为查看部门列表是要和数据库进行交互的,里面的数据不能是写死的,要实时更新数据,所以需要执行一个Java程序
<a href="/oa/dept/list">查看部门列表</a>
- 第二:编写web.xml文件
<servlet><servlet-name>list</servlet-name><servlet-class>com.bjpowernode.oa.web.action.DeptListServlet</servlet-class></servlet><servlet-mapping><servlet-name>list</servlet-name>
<!--不需要加项目名 路径不能乱写,要和前端的页面路径对应--><url-pattern>/dept/list</url-pattern></servlet-mapping>
- 第三:编写DeptListServlet类继承HttpServlet类。然后重写doGet方法。
- 因为点击超链接是get请求
- 再来回忆一下通信原理
package com.bjpowernode.oa.web.action;import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;public class DeptListServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}
}
- 第四:在DeptListServlet类的doGet方法中连接数据库,查询所有的部门,动态的展示部门列表页面.
分析list.html页面中哪部分是固定死的,哪部分是需要动态展示的。
list.html页面中的内容所有的双引号要替换成单引号,因为out.print("")这里有一个双引号,容易冲突。
现在写完这个功能之后,你会有一种感觉,感觉开发很繁琐,只使用servlet写代码太繁琐了。
public class DeptListServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取应用的根路径String contextPath = request.getContextPath();response.setContentType("text/html;charset=UTF-8");PrintWriter writer = response.getWriter();writer.println(" <!DOCTYPE html> ");writer.println("<html>");writer.println("<head>");writer.println(" <meta charset='utf-8'>");writer.println(" <title>部门列表页面</title>");writer.println("</head>");writer.println("<body>");writer.println("<h1 align='center'>部门列表</h1>");writer.println("<hr />");writer.println("<table border='1px' align='center' width='50%'>");writer.println("");writer.println(" <tr>");writer.println("");writer.println(" <th>序号</th>");writer.println(" <th>部门编号</th>");writer.println(" <th>部门名称</th>");writer.println(" <th>操作</th>");writer.println("");writer.println(" </tr>");/*** 要分析页面哪些部分是静态的,哪些部分是动态的*///连接数据库,查询所有数据Connection conn=null;PreparedStatement ps=null;ResultSet rs=null;try {//获取连接conn= DBUtils.getConnection();//获取预编译的数据库操作对象String sql="select deptno,dname,loc from dept";ps = conn.prepareStatement(sql);//执行sql语句rs=ps.executeQuery();//处理结果集int i=0;while (rs.next()){String deptno=rs.getString("deptno");String dname = rs.getString("dname");String loc = rs.getString("loc");writer.println(" <tr>");writer.println(" <td>"+(++i)+"</td>");writer.println(" <td>"+deptno+"</td>");writer.println(" <td>"+dname+"</td>");writer.println(" <td><a href=''>删除</a>");writer.println(" <a href='edit.html'>修改</a>");/*** 点击详情的时候,我们点击哪一个部门,就应该显示相应部门的信息*/writer.println(" <a href='detail.html'>详情</a></td>");writer.println(" </tr>");}} catch (SQLException e) {e.printStackTrace();}finally {//释放资源DBUtils.close(conn,ps,rs);}//<!-- 往下都是固定死的-->writer.println("</table>");writer.println("<a href='add.html' >新增部门</a>");writer.println("");writer.println("");writer.println("</body>");writer.println("</html>");}}
先来回顾一下,之前准备数据库中的表的数据
+--------+------------+-----------+
| deptno | dname | loc |
+--------+------------+-----------+
| 10 | XiaoShouBu | BEIJING |
| 20 | YanFaBu | SHANGHAI |
| 30 | JiShuBu | GUANGZHOU |
| 40 | MeiTiBu | SHENZHEN |
+--------+------------+-----------+
写这个小功能的体会:我们可以先写出静态页面,然后根据这个页面来分析,哪些部分是需要动态展示的,也就是要和数据库连接的,哪些部分是固定死的,再根据我们的分析去操作,这样思路会比较清晰,不然的话,可能东写一个,西写一个,最后自己都乱了。
第六步:查看部门详情。
建议:从前端往后端一步一步实现。首先要考虑的是,用户点击的是什么?用户点击的东西在哪里?
- 一定要先找到用户点的“详情”在哪里。找了半天,终于在后端的java程序中找到了
<a href='写一个路径'>详情</a>
详情 是需要连接数据库的,所以这个超链接点击之后也是需要执行一段java代码的。所以要将这个超链接的路径修改一下。
注意:修改路径之后,这个路径是需要加项目名的。"/oa/dept/detail"
技巧:
out.print("<a href='"+contextPath+"/dept/detail?deptno="+deptno+"'>详情</a>");
重点:向服务器提交数据的格式:uri?name=value&name=value&name=value&name=value
- 这里的问号,必须是英文的问号。不能中文的问号。
解决404的问题。写web.xml文件。
<servlet><servlet-name>detail</servlet-name><servlet-class>com.bjpowernode.oa.web.action.DeptDetailServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>detail</servlet-name><url-pattern>/dept/detail</url-pattern>
</servlet-mapping>
编写一个类:DeptDetailServlet继承HttpServlet,重写doGet方法。
中文思路(思路来源于:你要做什么?目标:查看部门详细信息。)第一步:获取部门编号第二步:根据部门编号查询数据库,获取该部门编号对应的部门信息。第三步:将部门信息响应到浏览器上。(显示一个详情。)
package com.bjpowernode.oa.web.action;import com.bjpowernode.oa.utils.DBUtils;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** @author zengyihong* @create 2022--03--11 19:14*/
public class DeptDetailServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter writer = response.getWriter();writer.println(" <!DOCTYPE html>");writer.println("<html>");writer.println(" <head>");writer.println(" <meta charset='utf-8'>");writer.println(" <title>部门详情</title>");writer.println(" </head>");writer.println(" <body>");writer.println(" <h1>部门详情</h1>");writer.println(" <hr />");//获取部门编号// /oa/dept/detail?deptno=30//显然提交的是30,但是服务器获取的是30这个字符串String deptno = request.getParameter("deptno");//连接数据库,根据相关部门来查询部门信息Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;//部门编号是主键,所以查询出来的记录最多就一条try {conn = DBUtils.getConnection();String sql = "select dname,loc from dept where deptno=?";ps = conn.prepareStatement(sql);ps.setString(1, deptno);rs = ps.executeQuery();if (rs.next()) {String dname = rs.getString("dname");String loc = rs.getString("loc");writer.println(" 部门编号:" + deptno + "<br />");writer.println(" 部门名称:" + dname + "<br />");writer.println(" 部门位置:" + loc + "<br />");}} catch (SQLException e) {e.printStackTrace();} finally {DBUtils.close(conn, ps, rs);}writer.println(" <input type='button' value='后退' οnclick='window.history.back()' />");writer.println(" </body>");writer.println("</html>");}}
接下来,看看效果
点击后退
可以看出,点击不同部门的详情,就会对应相应的信息
如果程序出现错误,显示4开头的错误代码,一般是前端代码问题,如果是5开头的错误代码,一般是Java程序出现问题
第七步:删除部门
- 怎么开始?从哪里开始?从前端页面开始,用户点击删除按钮的时候,应该提示用户是否删除。因为删除这个动作是比较危险的。任何系统在进行删除操作之前,是必须要提示用户的,因为这个删除的动作有可能是用户误操作。(在前端页面上写JS代码,来提示用户是否删除。)
<a href="javascript:void(0)" onclick="del(30)" >删除</a><script type="text/javascript">function del(dno){//弹出确认框,用户点击确定,返回true,点击取消,返回falsevar ok=window.confirm("亲,删了不可恢复哦");//在JS代码中如何发送请求给服务器//四种写法都可以//document.location.href="请求路径";// document.location="请求路径";
// window.location.href="请求路径";
// window.location="请求路径";
//我们在点击删除的时候,要把删除哪一个部门的编号传进去document.location.href="/oa/dept/delete?deptno="+dno;}
</script>
以上的前端程序要写到后端的java代码当中:
- DeptListServlet类的doGet方法当中,使用out.print()方法,将以上的前端代码输出到浏览器上。
解决404的问题:
http://localhost:8080/oa/dept/delete?deptno=30
web.xml文件
<servlet><servlet-name>delete</servlet-name><servlet-class>com.bjpowernode.oa.web.action.DeptDelServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>delete</servlet-name><url-pattern>/dept/delete</url-pattern>
</servlet-mapping>
编写DeptDelServlet继承HttpServlet,重写doGet方法。
package com.bjpowernode.oa.web.action;import com.bjpowernode.oa.utils.DBUtils;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;/*** @author zengyihong* @create 2022--03--12 11:33*/
public class DeptDeleteServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//根据部门编号,删除部门//获取部门编号String deptno = request.getParameter("deptno");//连接数据库删除数据Connection conn=null;PreparedStatement ps=null;int count=0;try {conn= DBUtils.getConnection();//关闭自动提交,就是开启事务conn.setAutoCommit(false);String sql="delete from dept where deptno =?";ps=conn.prepareStatement(sql);ps.setString(1,deptno);//返回的是影响数据库表中多少条记录count = ps.executeUpdate();conn.commit();} catch (SQLException e) {//遇到异常要回滚if (conn !=null){try {conn.rollback();} catch (SQLException ex) {ex.printStackTrace();}}e.printStackTrace();}finally {DBUtils.close(conn,ps,null);}if (count == 1){//删除成功//仍然跳转到部门列表页面//部门列表页面的显示需要执行另外一个Servlet,怎么办?转发request.getRequestDispatcher("/dept/list").forward(request,response);}else {request.getRequestDispatcher("/error.html").forward(request,response);}}
}
删除成功或者失败的时候的一个处理(这里我们选择了转发,并没有使用重定向机制。)
// 判断删除成功了还是失败了。
if (count == 1) {//删除成功//仍然跳转到部门列表页面//部门列表页面的显示需要执行另一个Servlet。怎么办?转发。request.getRequestDispatcher("/dept/list").forward(request, response);
}else{// 删除失败request.getRequestDispatcher("/error.html").forward(request, response);
}
第八步:新增部门
- 注意:最后保存成功之后,转发到 /dept/list 的时候,会出现405,为什么?
- 第一:保存用的是post请求。底层要执行doPost方法。
- 第二:转发是一次请求,之前是post,之后还是post,因为它是一次请求。
- 第三:/dept/list Servlet当中只有一个doGet方法。
- 怎么解决?两种方案
- 第一种:在/dept/list Servlet中添加doPost方法,然后在doPost方法中调用doGet。
- 第二种:重定向。
- 注意:最后保存成功之后,转发到 /dept/list 的时候,会出现405,为什么?
第九步:跳转到修改部门的页面
package com.bjpowernode.oa.web.action;import com.bjpowernode.oa.utils.DBUtils;import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class DeptEditServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取应用的根路径。String contextPath = request.getContextPath();response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.print("<!DOCTYPE html>");out.print("<html>");out.print(" <head>");out.print(" <meta charset='utf-8'>");out.print(" <title>修改部门</title>");out.print(" </head>");out.print(" <body>");out.print(" <h1>修改部门</h1>");out.print(" <hr >");out.print(" <form action='"+contextPath+"/dept/modify' method='post'>");// 获取部门编号String deptno = request.getParameter("deptno");// 连接数据库,根据部门编号查询部门的信息。Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {conn = DBUtils.getConnection();String sql = "select dname, loc as location from dept where deptno = ?";ps = conn.prepareStatement(sql);ps.setString(1, deptno);rs = ps.executeQuery();// 这个结果集中只有一条记录。if(rs.next()){String dname = rs.getString("dname");String location = rs.getString("location"); // 参数"location"是sql语句查询结果列的列名。// 输出动态网页。out.print(" 部门编号<input type='text' name='deptno' value='"+deptno+"' readonly /><br>");out.print(" 部门名称<input type='text' name='dname' value='"+dname+"'/><br>");out.print(" 部门位置<input type='text' name='loc' value='"+location+"'/><br>");}} catch (SQLException e) {e.printStackTrace();} finally {DBUtils.close(conn, ps, rs);}out.print(" <input type='submit' value='修改'/><br>");out.print(" </form>");out.print(" </body>");out.print("</html>");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}
第十步:修改部门
package com.bjpowernode.oa.web.action;import com.bjpowernode.oa.utils.DBUtils;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;/*** @author zengyihong* @create 2022--03--13 8:35*/
public class DeptModifyServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//解决请求体的乱码问题request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");//获取表单数据String deptno = request.getParameter("deptno");String dname = request.getParameter("dname");String loc = request.getParameter("loc");//连接数据库,执行更新语句Connection conn = null;PreparedStatement ps = null;int count=0;try {conn = DBUtils.getConnection();String sql = "update dept set dname=?,loc=? where deptno=? ";ps = conn.prepareStatement(sql);ps.setString(1, dname);ps.setString(2, loc);ps.setString(3, deptno);count = ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {DBUtils.close(conn, ps, null);}if (count==1){//更新成功//跳到列表页面 部门列表页面是通过Java程序动态生成的,需要请求转发,所以需要执行另外一个servletrequest.getRequestDispatcher("/dept/list").forward(request,response);}else{request.getRequestDispatcher("/error.html").forward(request,response);}}}
大家还是需要自己动手练习
这里使用的是纯粹的Servlet技术,比较麻烦,后续还会改造一下这个小项目
使用Servlet完成单表的CRUD相关推荐
- 如何使用纯Servlet做一个单表的CRUD操作
目录 第一步:准备一张数据库表.(sql脚本) 第二步:准备一套HTML页面(项目原型)[前端开发工具使用HBuilder] 第三步:分析我们这个系统包括哪些功能? 第四步:在IDEA当中搭建开发环境 ...
- springdata jpa单表操作crud
spring data jpa 1. 项目搭建 1.1 配置 1.2 实体类 1.3 继承JpaRepository接口 2. 批量新增 3. 查询 4. 修改 by hql 5. 删除 by hql ...
- Spring + JDBC + Struts联合开发(实现单表的CRUD)
这里使用Spring + JDBC +Struts,完成新闻表的添加,修改,删除和查询功能. 建立数据库: [sql] view plain copy CREATE TABLE news_type ( ...
- jdbc-01入门操作-实现对单表的CRUD操作和单元测试
0 后台数据库表 表如下图所示,模拟一个电商系统的用户表 所对应的表代码是 CREATE TABLE `easybuy_user` (`id` int(20) NOT NULL AUTO_INCREM ...
- 手写ORM框架----(数据库单表CRUD万能框架)
目录 一.准备 1.1 ORM介绍 1.2 准备工作 二.手写ORM的CRUD 2.1 数据库准备 2.2 所需注解 2.3 实体类student 2.4 CRUD 2.4.1 添加功能 2.4.2 ...
- hibernate课程 初探单表映射3-1 hibernate单表操作简介
本章简介: 1 单一主键 2 基本类型 3 对象类型 4 组件属性 5 单表操作CRUD实例 转载于:https://www.cnblogs.com/1446358788-qq/p/8232078.h ...
- SSM8==纯注解SSM项目:实现单表CRUD、事务、自定义异常和统一异常处理、RESTFUL风格接口、统一返回值格式(状态码、内容、消息)、JSON传参、axios、vue.js、elementUI
环境:IDEA2021+JDK8+MAVEN3.8+TOMCAT7插件 前端:axios.vue.js.elementUI 后端:见POM.XML相关依赖,主要有数据库MySQL5.7 ,数据源Dru ...
- 在Servlet中处理表单提交的数据
Servlet的主要功能是处理客户端的表单请求数据,在Servlet中首先对这些数据进行验证,可能会封装到JavaBean,接下来调用数据库的业务逻辑方法将数据保存或者进行其他操作,最后Servlet ...
- 【小项目】SSM 实现单表 CRUD
SSM 实现单表 CRUD 文章目录 SSM 实现单表 CRUD 一.数据库 二.后端 1.依赖项 2.项目结构 3.Student.java 实体类 4.StudentDao 接口 5.Studen ...
最新文章
- pandas统计缺失值的个数
- vmalloc 实现
- 【web开发学习笔记】Structs2 Result学习笔记(三)带參数的结果集
- 为何采用双亲委派机制
- Actor-ES框架:Ray-Handler之CoreHandler编写
- VMware 虚拟机占用磁盘空间
- docker 本地部署 mysql_Docker 部署Mysql 服务和Redis 服务的方法
- 动态规划 —— 区间 DP —— 石子合并三讲
- [Z]在线版本控制之SubVersion与MyEclipse整合
- 移动端的头部标签和meta
- TestStand-调用LabVIEW
- unity 实现PPT动画效果切换图片
- 我所知道坦克大战(单机版)之 让子弹飞、让坦克控制子弹开炮
- javascript之DOM简介
- java毕业设计考研资源共享系统mybatis+源码+调试部署+系统+数据库+lw
- stm32f103zet6驱动超声波之 USART
- 最新2023年3月编程排行榜出炉,Python太牛了
- 如何修改localhost为自己指定的域名
- 基于 FPGA 使用 Verilog 实现 DS18B20 温度采集以及数码管显示项目源码【免费——互相学习】
- 思科服务器的ip怎么配置文件,思科无线AP初始配置IP
热门文章
- 基于Golang的对象序列化的程序包开发——myJsonMarshal
- 提交表单自动刷新_Web自动化测试:元素的基础操作和浏览器基础操作
- libgstreamer-1.0.so.0: cannot open shared object file: No such file or directory
- vue实现文件上传功能
- 数据结构与算法之美day 6: 如何实现LRU缓存淘汰算法?
- Docker学习(一)-----Docker简介与安装
- 基于Android和SpringBoot的购物App
- TVM cmake示例展示
- GPU加速库AmgX
- CodeGen标记循环