Java研学-web操作crud

一 思路

1 组件

  页面显示:JSP
  接受用户请求:Servlet
  和数据库交互:MyBatis
在这里插入图片描述

2 基础准备

① 创建 web 项目,导入需要依赖的 jar 包,放入 web/WEB-INF/lib目录中在这里插入图片描述
② 创建数据库表

CREATE TABLE employee(
`id` bigint(11) NOT NULL auto_increment,`name` varchar(50) default NULL,`salary` double(10,2) default NULL,PRIMARY KEY  (`id`)
);INSERT INTO `employee` VALUES (1,'大黄', 8848.00);
INSERT INTO `employee` VALUES (2,'a黄', 8848.00);
INSERT INTO `employee` VALUES (3,'b黄', 8848.00);
INSERT INTO `employee` VALUES (4,'c黄', 8848.00);
INSERT INTO `employee` VALUES (5,'d黄', 8848.00);
INSERT INTO `employee` VALUES (6,'e黄', 8848.00);
INSERT INTO `employee` VALUES (7,'f黄', 8848.00);
INSERT INTO `employee` VALUES (8,'g黄', 8848.00);
INSERT INTO `employee` VALUES (9,'h黄', 8848.00);

③ 创建表对应的实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {private Long id;private String name;private double salary;
}

④ MyBatis 配置文件实现

db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///play_web
jdbc.user=root
jdbc.password=root

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><properties resource="db.properties"></properties><typeAliases><package name="com.domain"/></typeAliases><environments default="dev"><environment id="dev"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.user}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers><mapper resource="mappers/EmployeeMapper.xml"></mapper></mappers>
</configuration>

⑤ 抽取工具类

MybatisUtil

package com.util;
public class MybatisUtil {private static  SqlSessionFactory factory=null;static {try {InputStream rs = Resources.getResourceAsStream("mybatis-config.xml");factory = new SqlSessionFactoryBuilder().build(rs);} catch (IOException e) {e.printStackTrace();}}public static SqlSession getSqlSession(){return factory.openSession(true);}
}

StringUtil – 判空

public class StringUtil {//判断输入的表单参数是否为空public static boolean hasLength(String s){return s!=null && s.trim().length()!=0;
}}

⑥ 根据实体类创建 dao 包以及接口

Dao

package com.dao;
import com.domain.Employee;
import java.util.List;
public interface EmployeeDao {// 增int add(Employee employee);// 删int delete(Long id);// 改int update(Employee employee);// 查全部List<Employee> list();// 根据id查Employee queryOne(Long id);
}

impl

package com.dao.impl;
import com.dao.EmployeeDao;
import com.domain.Employee;
import com.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class EmployeeDaoImpl implements EmployeeDao {/*定义成员变量*/private SqlSession sqlSession= MybatisUtil.getSqlSession();@Overridepublic int add(Employee employee) {int row = sqlSession.insert("com.mapper.EmployeeMapper.add", employee);return row;}@Overridepublic int delete(Long id) {int row= sqlSession.delete("com.mapper.EmployeeMapper.delete",id);return row;}@Overridepublic int update(Employee employee) {int row= sqlSession.update("com.mapper.EmployeeMapper.update",employee);return row;}@Overridepublic List<Employee> list() {List<Employee> list = sqlSession.selectList("com.mapper.EmployeeMapper.list");return list;}@Overridepublic Employee queryOne(Long id) {Employee employee= sqlSession.selectOne("com.mapper.EmployeeMapper.selectOne", id);return employee;}
}

mapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mapper.EmployeeMapper"><!--增加商品--><insert id="add">insert into employee (name,salary)values(#{name},#{salary})</insert><!--修改--><update id="update">update employee set name=#{name},salary=#{salary} WHERE id=#{id}</update><!--删除--><delete id="delete">delete from employee WHERE id=#{id}</delete><!--根据id查询--><select id="queryOne" resultType="employee">SELECT * from employee WHERE id=#{id}</select><!--查询所有--><select id="list" resultType="employee">SELECT * from employee</select>
</mapper>

⑦ 日志文件 – log4j.properties

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.domain=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

⑧ 生成测试类 EmployeeDaoImplTest,查看后台功能是否实现

package com.dao.impl;
import com.dao.EmployeeDao;
import com.domain.Employee;
import org.junit.Test;
import java.util.List;
public class EmployeeDaoImplTest {@Testpublic void add() {}@Testpublic void delete() {}@Testpublic void update() {}@Testpublic void list() {EmployeeDao employeeDao=new EmployeeDaoImpl();List<Employee> list = employeeDao.list();System.out.println(list);}@Testpublic void queryOne() {}
}

二 前台实现

1 请求分发器

  使用一个 Servlet 类来处理一张表的所有请求操作,即通过增加一个参数,用参数值来区分一个Servlet 中来区分不同的操作crud

package com.web.servlet;import com.dao.EmployeeDao;
import com.dao.impl.EmployeeDaoImpl;
import com.domain.Employee;
import com.util.StringUtil;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;@WebServlet("/employee")
public class EmployeeServlet extends HttpServlet {// 创建Dao对象private EmployeeDao employeeDao=new EmployeeDaoImpl();@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 设置编码格式req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");// 获取请求分发的参数String cmd=req.getParameter("cmd");if("delete".equals(cmd)){// 调用删除delete(req,resp);}else if("input".equals(cmd)){// 跳转增加input(req,resp);}else if("saveOrUpdate".equals(cmd)){// 跳转修改saveOrUpdate(req,resp);}else {// 查所有list(req,resp);}}/*查询所有*/private void list(HttpServletRequest req, HttpServletResponse resp) {try {// 调用Dao查所有方法List<Employee> list=employeeDao.list();// 将查询结果存储到请求作用域req.setAttribute("list",list);// 转发到列表页面req.getRequestDispatcher("/WEB-INF/views/employee/list.jsp").forward(req,resp);} catch (ServletException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*增加修改保存*/private void saveOrUpdate(HttpServletRequest req, HttpServletResponse resp) {//封装员工对象Employee employee=new Employee();/*将参数的获取及封装对象过程抽取成一个方法*/req2employee(req,employee);/*根据请求中是否携带id判断执行增加或者修改操作*/String id = req.getParameter("id");if (StringUtil.hasLength(id)){employee.setId(Long.valueOf(id));//执行修改employeeDao.update(employee);}else{//调用dao方法执行增加保存操作employeeDao.add(employee);}try {//跳转到查询resp.sendRedirect("/employee");} catch (IOException e) {e.printStackTrace();}}/*封装的获取请求参数的方法*/private void req2employee(HttpServletRequest req, Employee employee) {//获取请求中表单参数String name = req.getParameter("name");//验证输入的表单参数不能为空if (StringUtil.hasLength(name)){//设置员工的名称employee.setName(name);}String salary = req.getParameter("salary");if (StringUtil.hasLength(salary)){employee.setSalary(Double.valueOf(salary));}}/*跳转到编辑页面*/private void input(HttpServletRequest req, HttpServletResponse resp) {//根据请求中是否携带id判断是增加或者修改操作String id = req.getParameter("id");if (StringUtil.hasLength(id)){//请求中携带了id执行修改//根据id查询商品Employee employee = employeeDao.queryOne(Long.valueOf(id));//将查询的商品存储到作用域req.setAttribute("employee",employee);}try {//跳转到WEB-INF下面的页面:input.jspreq.getRequestDispatcher("/WEB-INF/views/employee/input.jsp").forward(req,resp);} catch (Exception e) {e.printStackTrace();}}/*删除*/private void delete(HttpServletRequest req, HttpServletResponse resp) {try {//获取目标idString id = req.getParameter("id");//调用删除方法int row = employeeDao.delete(Long.valueOf(id));//删除完毕跳转到查询resp.sendRedirect("/employee");} catch (IOException e) {e.printStackTrace();}}
}

2 前端crud实现

① input.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>员工信息编辑页面</title>
</head>
<body>
<h3>员工信息编辑</h3>
<form action="/employee?cmd=saveOrUpdate" method="post"><input type="hidden" name="id" value="${employee.id}"><p>姓名:<input type="text" name="name" value="${employee.name}"></p><%--step="0.01"表示接受小数点后两位--%><p>工资:<input type="number" step="0.01" name="salary" value="${employee.salary}"></p><p><input type="submit" value="保存"></p>
</form>
</body>
</html>

② list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入核心标签库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>员工信息页面</title>
</head>
<body>
<center><h3>员工列表</h3><p><a href="/employee?cmd=input">增加员工</a></p><table border="1px" cellpadding="0" cellspacing="0"width="800px"><tr><th>序号</th><th>姓名</th><th>工资</th><th>操作</th></tr><%--动态展示商品列表数据--%><c:forEach items="${list}" varStatus="vs" var="employee"><tr class="trClass"><td>${vs.count}</td><td>${employee.name}</td><td>${employee.salary}</td><td><a href="/employee?cmd=input&id=${employee.id}">修改员工信息</a>&nbsp;&nbsp;
<%--                    <a href="/product?cmd=delete&id=${product.id}">删除商品</a>--%><a href="#" onclick="deleteTr(${employee.id})">删除员工信息</a></td></tr></c:forEach></table>
</center><%--鼠标移动到当前行,实现背景颜色高亮显示--%>
<script>//获取所有的行元素:不包含表头var trs = document.getElementsByClassName("trClass");//遍历行元素集合for(var i=0;i<trs.length;i++){//鼠标移入:当前行高亮,背景变成灰色trs[i].onmouseover=function (){this.style.backgroundColor="gray";}//鼠标移出:恢复原来背景颜色trs[i].onmouseout=function (){this.style.backgroundColor="";}}
</script><%--删除确认表--%>
<script>function deleteTr(id){//确认删除var b= window.confirm("确认删除选中的员工信息吗?");if(b){//确定删除,执行后台删除操作window.location="/employee?cmd=delete&id="+id;}}
</script>
</body>
</html>

③ index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>员工信息管理</title></head><body><a href="/employee">员工信息管理</a></body>
</html>

三 小结

1 目录结构图

目录结构图

2 注意

  不需要数据共享的跳转直接使用重定向即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/601838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P12 音视频复合流——TS流讲解

前言 从本章开始我们将要学习嵌入式音视频的学习了 &#xff0c;使用的瑞芯微的开发板 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_C…

限制选中指定个数CheckBox控件(1/2)

限制选中指定个数CheckBox控件&#xff08;1/2&#xff09; 实例需求&#xff1a;工作表中有8个CheckBox控件&#xff08;下文中简称为控件&#xff09;&#xff0c;现在需要实现限制用户最多只能勾选4个控件。 Dim OnDic As Object Sub CheckboxeEvent()Dim oCB As CheckBox…

OpenSource - File Preview 文件预览组件

文章目录 file-preview-spring-boot-starterkkFileView file-preview-spring-boot-starter https://github.com/wb04307201/file-preview-spring-boot-starter https://gitee.com/wb04307201/file-preview-spring-boot-starter 一个文档在线预览的中间件&#xff0c;可通过简…

hyperf 十九 数据库 二 模型

教程&#xff1a;Hyperf 一、命令行 symfony/console-CSDN博客 hypery 十一、命令行-CSDN博客 hyperf console 执行-CSDN博客 根据之前应该能了解到命令行的基本实现&#xff0c;和hyperf中命令行的定义。 1.1 命令初始化 hyperf.php中系统初始化中通过ApplicationFacto…

乐理燥废笔记

乐理燥废笔记 文章目录 终止式小调音阶转调不协和和弦进行大小转调1251 1451转调我的霹雳猫阿诺三全音代理五声音阶又怎样和弦附录&#xff1a;压缩字符串、大小端格式转换压缩字符串浮点数压缩Packed-ASCII字符串 大小端转换什么是大端和小端数据传输中的大小端总结大小端转换…

Golang高质量编程与性能调优实战

1.1 简介 高质量&#xff1a;编写的代码能否达到正确可靠、简洁清晰的目标 各种边界条件是否考虑完备异常情况处理&#xff0c;稳定性保证易读易维护 编程原则 简单性 消除多余的重复性&#xff0c;以简单清晰的逻辑编写代码不理解的代码无法修复改进 可读性 代码是写给人看…

Copilot在IDEA中的应用:提升编码效率的得力助手

Copilot在IDEA中的应用&#xff1a;提升编码效率的得力助手 前言: 欢迎来到本篇博客&#xff0c;今天我们将深入探讨 GitHub Copilot 在 IntelliJ IDEA 中的应用。GitHub Copilot 是一款由 GitHub 与 OpenAI 共同开发的人工智能代码生成工具&#xff0c;它能够根据上下文提示…

vue 异步加载组件

当页面引入多个组件并且有默认不展示的组件则可以进行异步加载&#xff08;引入的组件不进行初步渲染&#xff0c;只有需要的时候才加载&#xff09; 首先引入 defineAsyncComponent import { defineAsyncComponent } from "vue"; 然后引入组件 组件名自定义&…

【MybatisPlus Docker】

文章目录 MyBatisPlusMyBatisPlus 注解WrapperMybatisPlus批量插入(saveBatch)MyBatisPlus 分页插件 DockerDockerfileDocker网络Docker部署项目 黑马微服务文档 MyBatisPlus MyBatisPlus 注解 TableName TableId TableField MyBatisPlus也支持手写SQL的 mybatis-plus:map…

金山云升级全栈云计算体系,做人工智能时代云上“助力者”

随着云原生、AIGC、大模型等新兴技术的迅速发展&#xff0c;智能化时代开启。云计算也正全面步入3.0时代&#xff0c;即云计算和人工智能深度融合的阶段。在这个阶段&#xff0c;人工智能技术成为云计算进一步释放潜力的核心推动力。 2024年1月4日&#xff0c;金山云举办了「云…

水母目标检测数据集VOC格式500张

水母&#xff0c;一种美丽而神秘的海洋生物&#xff0c;以其独特的形态和生态习性而备受瞩目。 水母的体型呈伞状&#xff0c;身体透明&#xff0c;有各种颜色和花纹。它们没有骨骼&#xff0c;身体由胶状物质组成&#xff0c;非常柔软和脆弱。水母通过触手上的刺细胞释放毒素…

从零学Java Object类

Java Object类 文章目录 Java Object类Object类Object类中的方法1 getClass()方法2 hashCode()方法3 toString()方法4 equals()方法面试题: 和 equals 方法的区别? 5 finalize()方法&#xff08;JDK1.9放弃 了解即可&#xff09; Object类 所有类的直接或间接继承Object&…

TypeScript 从入门到进阶之基础篇(四) symbol类型篇

系列文章目录 TypeScript 从入门到进阶系列 TypeScript 从入门到进阶之基础篇(一) ts基础类型篇TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇TypeScript 从入门到进阶之基础篇(三) 元组类型篇TypeScript 从入门到进阶之基础篇(四) symbol类型篇 持续更新中… 文章目录 …

win10关闭打开文件安全警告

1.使用场景 在流水线上&#xff0c;因车间刷软件的程序不能下发到每一台电脑上&#xff0c;会使用共享文件夹的形式来共享程序。每次打开会弹出一下窗口&#xff0c;影响员工生产。 需要将安全警告关闭。2.解决步骤 1.winR键打开运行窗口&#xff0c;输入gpedit.msc&#xff…

云原生学习系列之基础环境准备(单节点安装kubernetes)

一、环境要求 操作系统CentOS 7.x-86_x64 硬件配置&#xff1a;内存2GB或2G&#xff0c;CPU 2核或CPU 2核&#xff0c;需要在虚拟机中提前设置好&#xff0c;不然后续会报错 二、系统初始化 1、设置主机名 # 在master节点执行 hostnamectl set-hostname master01 2、配置主…

HTML的简单介绍

文章目录 1. HTML1.1 HTML 基础认识1.2 快速生成代码框架1.3 HTML 基础标签 1. HTML 1.1 HTML 基础认识 什么是HTML呢&#xff1f; HTML叫做超文本标记语言。超文本&#xff1a;例如图片&#xff0c;视频&#xff0c;文本&#xff0c;声音&#xff0c;表格&#xff0c;链接等…

C++的一点知识记录

时间记录&#xff1a;2024/1/6 类定义&#xff0c;一般在头文件中进行定义不进行实现&#xff0c;在源文件中进行实现 class Person{ public://公共属性和方法定义区Person();//构造函数定义~Person(){};//析构函数加实现int age;//定义属性void printAge();//定义方法 protec…

计算机环境安全

操作系统安全----比如windows,linux 安全标识--实体唯一性 windows---主体&#xff1a;账户&#xff0c;计算机&#xff0c;服务 安全标识符SID-Security Identifier 普通用户SID是1000&#xff0c;管理用SID是500 linux---主体&#xff1a;用户&#xff0c;用户组&#xf…

【前端】[vue3] vue-router使用

提示&#xff1a;我这边用的是typeScript语法&#xff0c;所以js文件的后缀都是ts。 安装vue-router&#xff1a; &#xff08;注意&#xff1a;vue2引用vue-router3 vue3才引用vue-router4&#xff09; npm install vue-router4src文件夹下面创建 router/index.ts&#xff08;…

hb_zhyu编程的一路

人生历程&#xff1a; 开始&#xff1a; 走上编程或许并不是我的一开始的意愿&#xff0c;在小学我第一次接触积木编程&#xff0c;或许是它简单&#xff0c;又或许是我天赋异禀&#xff0c;在第一次接触就展现出异于常人的能力&#xff0c;并且产生浓厚的兴趣。 当我几乎可…