Java Web —— 第七天(Mybatis案例 部门管理)

news2024/11/15 19:44:26

环境搭建

准备数据库表(dept、emp)

-- 部门管理
create table dept(
    id int unsigned primary key auto_increment comment '主键ID',
    name varchar(10) not null unique comment '部门名称',
    create_time datetime not null comment '创建时间',
    update_time datetime not null comment '修改时间'
) comment '部门表';

insert into dept (id, name, create_time, update_time) values(1,'学工部',now(),now()),(2,'教研部',now(),now()),(3,'咨询部',now(),now()), (4,'就业部',now(),now()),(5,'人事部',now(),now());



-- 员工管理(带约束)
create table emp (
  id int unsigned primary key auto_increment comment 'ID',
  username varchar(20) not null unique comment '用户名',
  password varchar(32) default '123456' comment '密码',
  name varchar(10) not null comment '姓名',
  gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',
  image varchar(300) comment '图像',
  job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师',
  entrydate date comment '入职时间',
  dept_id int unsigned comment '部门ID',
  create_time datetime not null comment '创建时间',
  update_time datetime not null comment '修改时间'
) comment '员工表';

INSERT INTO emp
	(id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES
	(1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),
	(2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),
	(3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),
	(4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),
	(5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),
	(6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),
	(7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),
	(8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),
	(9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),
	(10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),
	(11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,now(),now()),
	(12,'hebiweng','123456','鹤笔翁',1,'12.jpg',5,'2008-08-18',3,now(),now()),
	(13,'fangdongbai','123456','方东白',1,'13.jpg',5,'2012-11-01',3,now(),now()),
	(14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,now(),now()),
	(15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),
	(16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2007-01-01',2,now(),now()),
	(17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());



创建springboot工程,引入对应的起步依赖 (web、mybatis、mysql驱动、lombok)

配置文件application.properties中引入mybatis的配置信息,准备对应的实体类

# 驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据库连接的URL
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
# 连接数据库的用户名
spring.datasource.username=root
# 连接数据库的密码
spring.datasource.password=123456
# 配置MyBatis的日志,指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#开启mybatis的驼峰命名自动映射开关
mybatis.configuration.map-underscore-to-camel-case=true

导入准备对应的Mapper、Service(接口、实现类)、Controller基础结构

开发规范

案例基于当前最为主流的前后端分离模式进行开发

开发规范-Restful

REST(REpresentational State Transfer) ,表述性状态转换,它是一种软件架构风格

注意事项

REST是风格,是约定方式,约定不是规定,可以打破

描述模块的功能通常使用复数,也就是加s的格式来描述,表示此类资源,而非单个资源。如: users、emps、books...

查询部门数据

DeptController 类

package com.example.controller;

import com.example.pojo.Dept;
import com.example.pojo.Result;
import com.example.service.DeptService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;


/**
 * @author hyk~
 */
@Slf4j
@RestController
public class DeptController {
    @Autowired
    private DeptService deptService;
    //private static Logger log = LoggerFactory.getLogger(DeptController.class);
    //@RequestMapping(value = "/depts",method = RequestMethod.GET)  //指定请求方式为GET
    @GetMapping("/depts")
    public Result list(){
        log.info("查询全部部门数据");
        //调用Service查询部门数据
        List<Dept> deptList = deptService.list();

        return Result.success(deptList); 
    }
}

DeptServiceImpl 类 

@Service
public class DeptServiceImpl implements DeptService {

    @Autowired
    private DeptMapper deptMapper;

    @Override
    public List<Dept> list() {
        return deptMapper.list();
    }
}

DeptMapper 类 


@Mapper
public interface DeptMapper {
    //查询全部部门数据
    @Select("select * from dept")
    List<Dept> list();
}

根据id删除部门数据

DeptController类
    //根据id删除部门
    @DeleteMapping("/{id}")
    public Result deleteDept(@PathVariable Integer id) { //@PathVariable 通过该注解来获取路径中id的值/{id}
        log.info("根据id删除部门数据:{}", id);
        //调用Service删除部门
        deptService.DeleteDept(id);
        return Result.success();
    }
DeptService接口
         //根据id删除部门信息
        void DeleteDept(Integer id);
DeptServiceImpl实现类
@Override
public void DeleteDept(Integer id) {
    deptMapper.DeleteDept(id);
}
DeptMapper接口
     //根据Id删除部门信息
    @Delete("delete from dept where id = #{id}")
    void DeleteDept(Integer id);

整体代码(增删改查)

DeptController类(处理请求,返回响应)
package com.example.controller;

import com.example.pojo.Dept;
import com.example.pojo.Emp;
import com.example.pojo.Result;
import com.example.service.DeptService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Insert;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author hyk~
 */
@Slf4j
@RestController
@RequestMapping("/depts")
public class DeptController {
    @Autowired
    private DeptService deptService;

    //private static Logger log = LoggerFactory.getLogger(DeptController.class);
    //@RequestMapping(value = "/depts",method = RequestMethod.GET)  //指定请求方式为GET
    @GetMapping
    public Result list() {
        log.info("查询全部部门数据");
        //调用Service查询部门数据
        List<Dept> deptList = deptService.list();

        return Result.success(deptList);
    }

    //根据id删除部门
    @DeleteMapping("/{id}")
    public Result deleteDept(@PathVariable Integer id) { //@PathVariable 通过该注解来获取路径中id的值/{id}
        log.info("根据id删除部门数据:{}", id);
        //调用Service删除部门
        deptService.DeleteDept(id);
        return Result.success();
    }

    //添加部门
    @PostMapping
    public Result addDept(@RequestBody Dept dept) {
        log.info("添加部门数据{}", dept);
        deptService.addDept(dept);
        return Result.success();
    }

    @GetMapping("/{id}")
    public Result selectByDeptId(@PathVariable Integer id) {
        //日志记录
        log.info("根据id查询部门:{}", id);
        //调用service层功能
        Dept dept = deptService.selectByDeptId(id);
        //响应
        return Result.success(dept);
    }

    @PutMapping
    public Result update(@RequestBody Dept dept) {
        //日志记录
        log.info("修改部门:{}", dept);
        //调用service层功能
        deptService.update(dept);
        //响应
        return Result.success();
    }
}
DeptService接口(业务逻辑)
    package com.example.service;
    import com.example.pojo.Dept;
    import org.springframework.stereotype.Service;
    import java.util.List;

    /**
     * @author hyk~
     */
    @Service
    public interface DeptService {
        //查询全部部门数据
        List<Dept> list();

        //根据id删除部门信息
        void DeleteDept(Integer id);

        //添加部门信息
        void addDept(Dept dept);
        
        //根据ID查询部门
        Dept selectByDeptId(Integer id);

        //修改部门
        void update(Dept dept);
    }

DeptServiceImpl实现类
package com.example.service.impl;

import com.example.mapper.DeptMapper;
import com.example.mapper.EmpMapper;
import com.example.pojo.Dept;
import com.example.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

/**
 * @author hyk~
 */
@Service
public class DeptServiceImpl implements DeptService {

    @Autowired
    private DeptMapper deptMapper;

    //查询
    @Override
    public List<Dept> list() {
        return deptMapper.list();
    }

    //删除
    @Override
    public void DeleteDept(Integer id) {
        deptMapper.DeleteDept(id);
    }

    //新增
    @Override
    public void addDept(Dept dept) {
        dept.setCreateTime(LocalDateTime.now());
        dept.setUpdateTime(LocalDateTime.now() );
        deptMapper.addDept(dept);
    }

    //根据id查询
    @Override
    public Dept selectByDeptId(Integer id) {
        return deptMapper.selectByDeptId(id);
    }

    //修改
    @Override
    public void update(Dept dept) {
        //设置修改时间为当前
        dept.setUpdateTime(LocalDateTime.now());
        deptMapper.update(dept);
    }
}
DeptMapper接口(数据访问)
package com.example.mapper;

import com.example.pojo.Dept;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * @author hyk~
 */
@Mapper
public interface DeptMapper {
    //查询全部部门数据
    @Select("select * from dept")
    List<Dept> list();

    //根据Id删除部门信息
    @Delete("delete from dept where id = #{id}")
    void DeleteDept(Integer id);

    //添加部门信息
    @Insert(" insert into dept(name, create_time, update_time) values(#{name},#{createTime},#{updateTime});")
    void addDept(Dept dept);

    //根据id查询数据 数据回显 方便用户修改
    @Select("select * from dept where id=#{id}")
    Dept selectByDeptId(Integer id);

    //修改数据
    @Update("update dept set name = #{name},update_time=now() where id =#{id}")
    void update(Dept dept);
}

总结

1.开发流程

明确需求

接口文档

思路分析

接口开发

2.接口调试

postman测试

前后端联调

3.日志小技巧
@slf4j
@RestController
public class DeptController {

}

注意事项

一个完整的请求路径,应该是类上的 @RequestMapping 的value属性 + 方法上的 @RequestMapping的value属性。

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

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

相关文章

网络分层(基础概念)

网络互连模型: OSI 参考模型 1.物理层 2.数据链路层 3.网络层 4.运输层5.会话层6.表示层7.应用层 TCP/IP协议: 1.网络接口层 2.网际层 3.运输层 4.应用层 1,物理层 定义接口标准、结缆标准、传输速率、传输方式等。 信道 信息传输的通道&#xff0c;一条传输介质上可以有…

武汉流星汇聚:体育热潮驱动市场新高峰,体育用品迎来发展黄金期

在全球体育产业的蓬勃发展中&#xff0c;法国作为体育大国&#xff0c;其深厚的体育文化底蕴和广泛的运动普及度&#xff0c;为体育用品市场注入了源源不断的活力。随着足球、徒步、网球等运动的持续升温&#xff0c;以及国际体育赛事如奥运会的临近&#xff0c;体育用品市场正…

量子加密算法:保障信息安全的新利器

随着信息技术的飞速发展&#xff0c;信息安全问题日益凸显。量子加密算法作为一种新型加密技术&#xff0c;以其独特的优势逐渐成为保障信息安全的重要手段。本文将简要介绍量子加密算法的原理、特点及其在我国的应用前景。 一、量子加密算法的原理 量子加密算法是基于量子力学…

Graphpad Prism for Mac 医学绘图软件教程

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件…

智慧楼宇公厕系统小程序,提高卫生间管理使用效率

在当今的智慧楼宇中&#xff0c;公厕系统的管理和使用效率成为了衡量楼宇品质的重要指标之一。智慧楼宇公厕系统小程序的出现&#xff0c;为解决这一问题带来了全新的思路和方法。 一、检查公厕环境数据 智慧公厕系统不仅关注如厕的基本需求&#xff0c;还注重提升如厕环境的质…

你了解大模型的偏见吗

随着AI大模型在各个领域的广泛应用&#xff0c;它们的偏见问题逐渐引起关注。 这些偏见可能无意中影响生成内容的公正性&#xff0c;误导用户决策&#xff0c;甚至加剧社会不平等。 AI偏见不仅会损害公众对技术的信任&#xff0c;还可能在关键领域如招聘、教育和医疗中产生不…

自定义树工具v2.0+评论回复功能开发

文章目录 1.新增评论回复1.EasyCode生成代码2.SaveShareCommentReplyReq.java3.ShareCommentReplyController.java4.ShareCommentReplyService.java5.ShareCommentReplyServiceImpl.java6.ShareMomentMapper.java 增加动态回复数7.ShareMomentMapper.xml8.测试1.评论2.评论记录…

CTFSHOW misc入门中misc8解法

第一步:下载misc8压缩包后解压缩&#xff0c;发现是一张misc8.png图片 第二步&#xff1a;老规矩&#xff0c;还是在kali里用binwalk命令查看文件是否包含隐藏文件&#xff0c;发现有两个png文件 第三步&#xff1a;使用binwalk -e 命令看是否能进行解析文件&#xff0c;结果不…

Emacs29.x版本之重要特性及用法实例(一百六十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

如何提升网络对AI大模型流量的承载能力?

前言 随着AI大模型的兴起&#xff0c;数据中心正在经历前所未有的变革。AI模型的规模巨大并持续快速增长。自2017年起&#xff0c;AI模型的规模每半年翻一番&#xff0c;从初代Transformer的6500万增长到GPT-4的1.76万亿&#xff0c;预计下一代大语言模型的尺寸将达到10万亿。…

CSE12 Lab 4: Simple CSV File Analysis

This file shows the stock returns from an investment portfolio over a year. The “A” column contains the stock name and the “B” column indicates the returns in USD (You can assume that there are no negative stock returns in any of our CSV data files ).…

深度解析|comfyui画面词云效果工作流搭建和讲解

前言 本篇文章共分为4部分&#xff1a; 工作流展示 工作流节点逻辑梳理 工作流拆解搭建 总结 我会对里面的重要的节点做详细的说明和解释&#xff0c;希望大家看完之后能学会并自己进行搭建&#xff0c;可以把出图效果放评论区一起学习探讨哦。 1.工作流效果展示 今天我…

45.【C语言】指针(重难点)(H)

目录&#xff1a; 22.函数指针变量 *创建 *使用 *两段代码分析 23.函数指针数组 *基本用法 *作用 往期推荐 22.函数指针变量 *创建 类比数组指针变量的定义&#xff1a;存放数组地址的指针变量&#xff0c;同理函数指针变量存放函数的地址 格式 函数的返回类型 (*指针变量的…

【python报错已解决】“string indices must be integers”

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 你是否在处理Python字符串时遇到了“string indices must be integers”的错误&#xff1f;这个错误可能会让你的代码运行…

[SWPU2019]Network

TTL加密 python脚本解密 import binasciif open(attachment_3.txt, "r") str Binary number while 1:num f.readline()if not num:breakif num.rstrip() 63: # 去掉每行后面的空格Binary 00elif num.rstrip() 127:Binary 01elif num.rstrip() 191:Bi…

C++那些事之helgrind并发编程检测

C那些事之helgrind并发编程检测 大纲 死锁数据竞争提问 通常我们在写多线程程序的时候很容易遇到两个问题&#xff1a; 死锁了&#xff0c;不知道什么原因导致数据不一致&#xff0c;多个线程没保护数据 那么有没有工具来检测这两种场景呢 答案是有的&#xff0c;我们可以使用v…

【Qt】常用控件QProgreeBar

常用控件QProgreeBar 使用QProgressBar表示一个进度条&#xff01;&#xff01;&#xff01; QProgressBar的核心属性 属性说明 minimum 进度条最⼩值 maximum 进度条最⼤值 value 进度条当前值 alignment ⽂本在进度条中的对⻬⽅式. Qt::AlignLeft : 左对⻬Qt::Align…

Unity(2022.3.38LTS) - 性能分析器

目录 一. 简介 二. 打开分析器 1. 打开 2.在目标平台上分析应用程序 三. 分析分析器 四. 模块详细介绍 1.Asset Loading Profiler 模块 2.Audio Profiler 模块 3.CPU Usage Profiler 模块 4.File Access Profiler 模块 5.Global Illumination Profiler 模块 6.GPU …

多线程任务中设置MDC的实践

多线程任务中设置MDC的实践 引言 在当今的软件开发中&#xff0c;日志记录是不可或缺的一部分。日志不仅仅是调试工具&#xff0c;还在系统监控、性能分析、故障排除中扮演着关键角色。尤其在多线程环境中&#xff0c;日志的上下文信息一致性至关重要。MDC&#xff08;Mapped…

WPF 动画 插值动画、关键帧动画、路径动画

WPF动画&#xff0c;分为三种&#xff1a;插值动画、关键帧动画、路径动画 2.1 插值动画&#xff1a;     1&#xff09;定义&#xff1a;插值动画是指&#xff0c;属性值从某一个值&#xff0c;经过一段时间后&#xff0c;连续变化值另一个值的动画。         例…