Java研学-web操作crud

news2024/12/27 23:59:13

一 思路

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 configuration
        PUBLIC "-//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();
    @Override
    public int add(Employee employee) {
        int row = sqlSession.insert("com.mapper.EmployeeMapper.add", employee);
        return row;
    }
    @Override
    public int delete(Long id) {
        int row= sqlSession.delete("com.mapper.EmployeeMapper.delete",id);
        return row;
    }
    @Override
    public int update(Employee employee) {
        int row= sqlSession.update("com.mapper.EmployeeMapper.update",employee);
        return row;
    }
    @Override
    public List<Employee> list() {
        List<Employee> list = sqlSession.selectList("com.mapper.EmployeeMapper.list");
        return list;
    }
    @Override
    public Employee queryOne(Long id) {
        Employee employee= sqlSession.selectOne("com.mapper.EmployeeMapper.selectOne", id);
        return employee;
    }
}

mapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//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 {
    @Test
    public void add() {
    }
    @Test
    public void delete() {
    }
    @Test
    public void update() {
    }
    @Test
    public void list() {
        EmployeeDao employeeDao=new EmployeeDaoImpl();
        List<Employee> list = employeeDao.list();
        System.out.println(list);
    }
    @Test
    public 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();
    @Override
    protected 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.jsp
            req.getRequestDispatcher("/WEB-INF/views/employee/input.jsp").forward(req,resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /*删除*/
    private void delete(HttpServletRequest req, HttpServletResponse resp) {
        try {
            //获取目标id
            String 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.coloradmin.cn/o/1362484.html

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

相关文章

Guarded Suspension模式--适合等待事件处理

Guarded是被守护、被保卫、被保护的意思&#xff0c; Suspension则是暂停的意思。 如果执行现在的处理会造成问题&#xff0c; 就让执行处理的线程进行等待--- 这就是Guarded Suspension模式。 模式通过让线程等待来保证实例的安全性。 一个线程ClientThread会将请求 Request的…

UE5 给自己的数字人重定向Mixamo动画

1 、准备动画骨格文件&#xff0c;动画文件&#xff0c;下面是Mixamo动画素材下载网站Mixamo动画骨格文件下载网站https://www.mixamo.com/2、下载动画骨格文件&#xff0c;打Mixamo网站&#xff0c;选择Characters骨格菜单&#xff0c;在下面找到对应的骨格。如下图所示&#…

vue3 - Element Plus 切换主题色及el-button hover颜色不生效的解决方法

vue3 - Element Plus 切换主题色及el-button hover颜色不生效的解决方法 GitHub Demo 地址 https://github.com/iotjin/jh-vue3-admin 在线预览 https://iotjin.github.io/jh-vue3-admin/ 如果您想要通过 js 控制 css 变量&#xff0c;可以这样做&#xff1a; // document.do…

Java中的Stack

Java中的Stack 在Java中&#xff0c;Stack 类是一个基于后进先出&#xff08;Last In, First Out&#xff0c;LIFO&#xff09;原则的集合类。它继承自Vector类&#xff0c;但主要被设计为提供栈的行为。 特点和用途 后进先出&#xff1a; 栈是一种后进先出的数据结构&#xff…

ROS学习笔记(11)进一步深入了解ROS第五步

0.前提 我在学习宾夕的ROS公开课的时候发现&#xff0c;外国的对计算机的教育和国内的是完全不一样的&#xff0c;当你接触了外国的课程后回头看自己学的会发现好像自己啥也没学。我这里可以放出来给大家看一下。 1.Python and C 2.Python PDB Tutorial&#xff1a;Python Deb…

Keil使用手册

文章目录 1 设置1.1 背景1.2 Project窗口显示.h文件1.3 注释1.4 Project窗口消失TAB转空格的设置keilsourceInsight 显示cannot evaluate普通局部变量静态全局变量静态局部变量 2 报错与解决2.1 warning&#xff1a;#1-D last line of file ends without anewline2.2 中文乱码 …

科研学习|论文解读——超准确性反馈:使用眼动追踪来检测阅读过程中的可理解性和兴趣

摘要&#xff1a; 了解用户想要什么信息是信息科学和技术面临的最大挑战。隐式反馈是解决这一挑战的关键&#xff0c;因为它允许信息系统了解用户的需求和偏好。然而&#xff0c;可用的反馈往往是有限的&#xff0c;而且其解释也很困难。为了应对这一挑战&#xff0c;我们提出了…

Mac打包Unix可执行文件为pkg

Mac打包Unix可执行文件为pkg 方式一&#xff1a;通过packages页面打包 1.下载packages app Distribution&#xff1a;自定义化更高&#xff0c;包括修改安装页面的内容提示 我这里主要演示Distribution模式的项目&#xff1a;通过unix可执行文件postinstall.sh脚本实现通过ma…

QT项目中添加资源文件和使用qss样式

时间记录&#xff1a;2024/1/6 一、添加使用资源文件 1.1 创建项目并打开项目&#xff08;带ui界面的项目&#xff09; 1.2 使用快捷键Ctrln创建文件&#xff0c;选择"QT"下面的"QT Resource File" 1.3 输入文件名和文件保存路径 1.4 将需要添加的文件…

Call to undefined function app\install\controller\mysqli_connect()

找到php.ini&#xff0c;放开mysqli扩展 https://stackoverflow.com/questions/25281467/fatal-error-call-to-undefined-function-mysqli-connect

FCN学习-----第一课

语义分割中的全卷积网络 CVPR IEEE国际计算机视觉与模式识别会议 PAMI IEEE模式分析与机器智能汇刊 需要会的知识点&#xff1a; 神经网络&#xff1a;前向传播和反向传播 卷积神经网络&#xff1a;CNN&#xff0c;卷积&#xff0c;池化&#xff0c;上采样 分类网络&#xff1a…

物流实时数仓:数仓搭建(DWS)一

系列文章目录 物流实时数仓&#xff1a;采集通道搭建 物流实时数仓&#xff1a;数仓搭建 物流实时数仓&#xff1a;数仓搭建&#xff08;DIM&#xff09; 物流实时数仓&#xff1a;数仓搭建&#xff08;DWD&#xff09;一 物流实时数仓&#xff1a;数仓搭建&#xff08;DWD&am…

进阶C语言学习前序

我们前期用了二十天的时间&#xff0c;学习了各种函数&#xff0c;我们已经初步具有敲写代码的能力&#xff0c;但是我们想要使用C语言去学习单片机的东西还是远远不够的&#xff0c;那么我们就需要深入了解和掌握更加深入的C语言知识&#xff0c;就有了接下来的学习计划&#…

Vmware ESXI上安装的虚拟机无法开启

背景 今天看下了Vmware ESXI上安装的虚拟机&#xff0c;点击无反应&#xff0c;也无法开启&#xff0c;日志提示“已打开电源&#xff0c;无法操作”。 注意 注意查看&#xff0c;虚拟机无法启动提示的内容。(当前磁盘文件是否可以在存储中找到&#xff0c;一般是vmdk结尾的)…

Rocky9.3 安装MySQL后如何设置初始密码

Rocky9.3 安装MySQL后如何设置初始密码 启动MySQL服务查看临时密码设置新密码 启动MySQL服务 安装MySQL后需要看一下服务是否已经启动&#xff1a; systemctl status mysqld如果没有启动的话&#xff0c;需要先启动MySQL服务&#xff1a; systemctl start mysqld # 临时启动…

Java jSerialComm库串口通信(USB RS-485/232) 查询/应答、主动上报模式

Java jSerialComm库串口通信(USB RS-485/232) 查询/应答、主动上报模式 查询/应答模式 要在Java中通过USB RS-485接口发送和接收特定的数据帧&#xff0c;你需要利用适当的串行通信库。在Java中&#xff0c;一个常见的选择是使用RXTX或jSerialComm库。这些库允许Java应用程序与…

LabVIEW开发自动读取指针式仪表测试系统

LabVIEW开发自动读取指针式仪表测试系统 在工业领域&#xff0c;尤其是煤矿、变电站和集气站等环境中&#xff0c;指针式仪表因其简单的结构、抗干扰能力强以及能适应高温高压等恶劣环境条件而被广泛应用于设备运行状态监视。然而&#xff0c;传统的人工读表方式不仅成本高昂&…

Pygame和Cocos2d

Pygame和Cocos2d都是 Python 中常用的游戏引擎&#xff0c;但它们的设计目标、特点和使用场景略有不同。 Pygame与Cocos2d&#xff0c;目前是使用人数最多的两个Python游戏库。根据某知名产品点评网站的数据显示&#xff0c;排名前五的Python 2D游戏库如下图所示。其中&#x…

【linux踩雷】Ubuntu中su root密码无法使用

【linux踩雷】Ubuntu中su root密码无法使用 在ubuntu的安装过程中&#xff0c;没有出现设置root密码&#xff0c;以为密码为空&#xff0c;但是却不能使用 解决方法&#xff1a; 先用sudo passwd更改密码&#xff0c;再去su root就可以了。

python数据可视化之折线图案例讲解

学习完python基础知识点&#xff0c;终于来到了新的模块——数据可视化。 我理解的数据可视化是对大量的数据进行分析以更直观的形式展现出来。 今天我们用python数据可视化来实现一个2023年三大购物平台销售额比重的折线图。 准备工作&#xff1a;我们需要下载用于生成图表的第…