Java Web —— 第七天(Mybatis案例1)

news2024/11/15 9:39:59

环境搭建

准备数据库表(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/2058035.html

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

相关文章

Ubuntu24.04安装MYSQL8.0

更新源 sudo apt update安装mysql服务 默认安装最新版本 sudo apt install mysql-server检查安装版本 mysql --version检查mysql运行状态 systemctl status mysql开启远程访问&#xff0c;在ubuntu下mysql默认是只允许本地访问 sudo vim /etc/mysql/mysql.conf.d/mysqld.…

jdbc连接池之C3P0

C3P0&#xff1a;JDBC 连接池概述 C3P0 是一个开源的 JDBC 连接池库&#xff0c;用于管理数据库连接的获取与释放。它提供了连接池的自动管理和高效复用&#xff0c;从而减少了创建数据库连接所需的时间和资源消耗。C3P0 的核心功能是优化和管理数据库连接&#xff0c;以提高应…

python : Requests请求库入门使用指南 + 简单爬取豆瓣影评

Requests 是一个用于发送 HTTP 请求的简单易用的 Python 库。它能够处理多种 HTTP 请求方法&#xff0c;如 GET、POST、PUT、DELETE 等&#xff0c;并简化了 HTTP 请求流程。对于想要进行网络爬虫或 API 调用的开发者来说&#xff0c;Requests 是一个非常有用的工具。在今天的博…

如何取消Excel表格的“打开密码”

在日常工作和学习中&#xff0c;Excel表格作为一种强大的数据处理工具&#xff0c;被广泛应用。而我们为了保护excel文件中的数据&#xff0c;会为Excel设置打开密码&#xff0c;但随着时间和需求的变化&#xff0c;当我们需要取消密码保护时要怎么做呢&#xff1f; 方法一&…

【前端基础篇】HTML零基础速通

文章目录 前言HTML结构认识HTML标签 HTML文件基本结构标签层次结构 快速生成代码框架HTML常见标签注释标签标题标签段落标签换行标签格式化标签图片标签超链接标签表格标签基本使用合并单元格 列表标签表单标签form标签input标签 label标签select标签textarea标签无语义标签 HT…

ESP RainMaker OTA 自动签名功能的安全启动

【如果您之前有关注乐鑫的博客和新闻&#xff0c;那么应该对 ESP RainMaker 及其各项功能有所了解。如果不曾关注&#xff0c;建议先查看相关信息&#xff0c;知晓本文背景。】 在物联网系统的建构中&#xff0c;安全性是一项核心要素。乐鑫科技对系统安全给予了极高的重视。ES…

AgileTC测试用例管理平台的基本使用

1. 背景 使用企业微信在线文档对测试用例进行管理&#xff0c;存在以下问题&#xff0c;比如新建版本&#xff0c;每次都要设置下执行测试用例那一栏&#xff0c;要提供通过、失败、阻塞等选项&#xff0c;操作异常繁琐&#xff0c;比如版本管理问题&#xff0c;多个版本之后&a…

【企业高性能web服务器】

目录 一、Nginx 介绍1、 Nginx 功能介绍2、基础特性3、Nginx 模块介绍 二、Nginx 编译安装1、编写systemd服务 三、平滑升级和回滚1、平滑升级的流程2、升级2、回滚 四、 Nginx 核心配置详解1、实现 nginx 的高并发配置2、Nginx 账户认证功能3、nginx作为下载服务器配置 五、re…

为了改善您的网络安全状况,请专注于数据

有效地融合、管理和使用企业数据是一项艰巨的任务。企业拥有大量的数据&#xff0c;但这些数据存在于各自为政的系统和应用程序中&#xff0c;需要高技能的数据科学家进行大量的手动操作。工程师和分析师从所有数据中提取价值。 数据准备是一项基本且必要的任务&#xff0c;但…

IOS 11 通用Base控制器封装

整体规划 BaseController&#xff1a;把viewDidLoad逻辑拆分为三个方法&#xff0c;方便管理。 BaseCommonController&#xff1a;不同项目可以复用的逻辑&#xff0c;例如&#xff1a;设置背景颜色方法等 BaseLogicController&#xff1a;本项目的通用逻辑&#xff0c;主要…

Spring的核心启动流程

前言 Spring启动时候整个入口是这么一个方法 AbstractApplicationContext#refresh 总共有12个方法&#xff0c;也就是启动时的核心步骤 AbstractApplicationContext有众多实现&#xff0c;这里我选择SpringBoot Web应用默认的实现来讲 AnnotationConfigServletWebServerAppli…

MySQL系列—MySQL编译安装常见问题(或缺少依赖)及解决方法,MySQL 编译安装时需要安装的依赖(全)

MySQL系列—MySQL编译安装常见问题(或缺少依赖)及解决方法 MySQL 编译安装时需要安装的依赖(全)&#xff1a; yum install -y cmake yum install ncurses ncurses-devel -y yum install -y libarchive yum install -y gcc gcc-c yum install -y openssl openssl-devel yum inst…

Python.NET:打开Python与.NET世界互通的大门

Python.NET 是一个强大的工具&#xff0c;它为 Python 程序员提供了一种与 .NET 公共语言运行时 (CLR) 无缝集成的途径。它就像一座桥梁&#xff0c;将 Python 的灵活性与 .NET 的强大功能连接起来&#xff0c;为开发者提供了前所未有的自由和可能性。 1. Python.NET 的核心价值…

内核代码中的路障宏

路障宏包含&#xff1a; mb()/rmb()/wmb barrier() __asm__:GCC关键字&#xff0c;用来声明一个内联汇编表达式。 __volatile__:告诉编译器&#xff0c;不要优化后面表达式中的内联汇编代码。 内联汇编表达式中的(“memory”):告诉GCC如下两个条件 If your assembler ins…

Flink常见数据源开发(DataStream API)

前言 一个 Flink 程序,其实就是对 DataStream 的各种转换。具体来说,代码基本上都由以下几部分构成,如下图所示: 获取执行环境(execution environment)读取数据源(source)定义基于数据的转换操作(transformations)定义计算结果的输出位置(sink)触发程序执行(exec…

Veritas NBU8.3.0.2安装Media Server(篇三)

一、环境自检阶段 1、Media角色地址为192.168.189.3&#xff0c;计算机名称为bakmedia&#xff0c;域名为sszz.com 2、防火墙均已关闭 二、hosts解析配置 在安装之前需要在hosts文件中配置解析&#xff0c;master和media都需要配置&#xff1b;后期如果备份客户端也需要为客户…

虚幻游戏开发| 编辑器内正常运行但打包出错

示例错误1 在编辑器里可以正常跳转关卡&#xff0c;但是在打包模式不能。 需要去projectsetting把需要跳转的关卡添加到maps list 编辑器内运行正常&#xff0c;但打包后出现报错或者不同的表现&#xff0c;其他原因汇总&#xff1a; 1. 资源加载问题 延迟加载&#xff1a;…

STM32 内部FLASH详解

目录 STM32 内部FLASH详解 1. STM32 FLASH简介 2. STM32 FLASH与SRAM 3. STM32 FLASH 容量、内容介绍 4. STM32 FLASH 读写注意事项 5. STM32 FLASH 基本结构 6. STM32 FLASH 读写步骤 6.1 FLASH 解除或添加 读、写保护的方法 6.2 FLASH 如何使用指针 读写存储器的方法…

Java | Leetcode Java题解之第354题俄罗斯套娃信封问题

题目&#xff1a; 题解&#xff1a; class Solution {public int maxEnvelopes(int[][] envelopes) {if (envelopes.length 0) {return 0;}int n envelopes.length;Arrays.sort(envelopes, new Comparator<int[]>() {public int compare(int[] e1, int[] e2) {if (e1[…

JMeter的安装和使用

&#x1f4a5; 该系列属于【SpringBoot基础】专栏&#xff0c;如您需查看其他SpringBoot相关文章&#xff0c;请您点击左边的连接 目录 一、安装 1. 下载 2. 解压 3. 修改配置 4. 运行 二、使用 1. 添加线程组 2. 添加http取样器 3. 添加监听报告 4. 添加监听结果树 …