首页 > 其他分享 >SpringBootWeb案例-1(day10)

SpringBootWeb案例-1(day10)

时间:2025-01-07 21:29:44浏览次数:3  
标签:return SpringBootWeb page 案例 day10 private Integer public Result

准备工作

需求 & 环境搭建

需求说明

环境搭建

步骤:

  • 准备数据库表(dept、emp)
  • 创建 springboot 工程,引入对应的起步依赖(web、mybatis、mysql 驱动、lombok)
  • 配置文件 application.properties 中引入 mybatis 的配置信息,准备对应的实体类
  • 准备对应的 Mapper、Service(接口、实现类)、Controller 基础结构


开发规范

开发规范 - Restful

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

注意事项

1、REST 是风格,是约定方式,约定不是规定,可以打破。 2、描述模块的功能通常使用复数,也就是加 s 的格式来描述,表示此类资源,而非单个资源。如: users 、 emps 、 books…

开发规范-统一响应结果

前后端交互统一响应结果 Result

package com.itheima.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {
    private Integer code;//响应码,1 代表成功; 0 代表失败
    private String msg;  //响应信息 描述字符串
    private Object data; //返回的数据

    //增删改 成功响应
    public static Result success(){
        return new Result(1,"success",null);
    }
    //查询 成功响应
    public static Result success(Object data){
        return new Result(1,"success",data);
    }
    //失败响应
    public static Result error(String msg){
        return new Result(0,msg,null);
    }
}

开发流程

部门管理

查询部门

 在类上添加 @Slf4j 注解时,会自动生成 Logger 对象,对象名:log

@Slf4j
@RequestMapping("/depts")
@RestController
public class DeptController {

    //private static Logger log = LoggerFactory.getLogger(DeptController.class);
    
    @Autowired
    private DeptService deptService;

    /**
     * 查询部门数据
     * @return
     */
    //@RequestMapping(value = "/depts",method = RequestMethod.GET) //指定请求方式为GET
    @GetMapping
    public Result list(){
        log.info("查询全部部门数据");
        //调用service查询部门数据
        List<Dept> deptList =  deptService.list();
        return Result.success(deptList);
    }
}    
public interface DeptService {
    /**
     * 查询全部部门数据
     * @return
     */
    List<Dept> list();
}    
@Service
public class DeptServiceImpl implements DeptService {

    @Autowired
    private DeptMapper deptMapper;

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

前后端联调

将资料中提供的“前端工程” 文件夹中的压缩包,拷贝到一个没有中文不带空格的目录下,解压。

启动 nginx,访问测试:http://localhost:90

浏览器可能缓存了旧的页面(比如你以前部署的“上一个项目”),因此你看到的是旧内容,而不是当前项目。尝试以下操作:

  • 清除浏览器缓存。
  • 使用无痕模式打开 localhost:90
  • 或者在浏览器地址栏中添加 ?nocache=1,例如:http://localhost:90/?nocache=1

删除部门

@Slf4j
@RequestMapping("/depts")
@RestController
public class DeptController {

    //private static Logger log = LoggerFactory.getLogger(DeptController.class);
    
    @Autowired
    private DeptService deptService;

    /**
     * 删除部门
     * @return
     */
    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id){
        log.info("根据id删除部门:{}",id);
        //调用service删除部门
        deptService.delete(id);
        return Result.success();
    }
}    
public interface DeptService {
    /**
     * 删除部门
     * @param id
     */
    void delete(Integer id);
}    
@Service
public class DeptServiceImpl implements DeptService {

    @Autowired
    private DeptMapper deptMapper;

    @Override
    public void delete(Integer id) {
        deptMapper.deleteById(id);
    }
}    
@Mapper
public interface DeptMapper {
    /**
     * 根据ID删除部门
     * @param id
     */
    @Delete("delete from dept where id = #{id}")
    void deleteById(Integer id););
}    

新增部门

@Slf4j
@RequestMapping("/depts")
@RestController
public class DeptController {

    //private static Logger log = LoggerFactory.getLogger(DeptController.class);
    
    @Autowired
    private DeptService deptService;

    /**
     * 新增部门
     * @return
     */
    @PostMapping
    public Result add(@RequestBody Dept dept){
        log.info("新增部门: {}" , dept);
        //调用service新增部门
        deptService.add(dept);
        return Result.success();
    }
}    

@RequestMapping

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

员工管理

分页查询

package com.itheima.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
 * 分页查询结果封装类
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean {
    private Long total;//总记录数
    private List rows;//数据列表
}
public interface EmpMapper {
    /**
     * 查询总记录数
     * @return
     */
    //@Select("select count(*) from emp")
    //public Long count();

    /**
     * 分页查询,获取列表数据
     * @param start
     * @param pageSize
     * @return
     */
    //@Select("select * from emp limit #{start},#{pageSize}")
    //public List<Emp> page(Integer start, Integer pageSize);

    /**
     * 员工信息查询
     * @return
     */
    //@Select("select * from emp")
    public List<Emp> list(String name, Short gender,LocalDate begin,LocalDate end);
/**
 * 员工管理Controller
 */
@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {

    @Autowired
    private EmpService empService;

    @GetMapping
    public Result page(@RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "10") Integer pageSize,
                       String name, Short gender,
                       @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                       @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){
        log.info("分页查询, 参数: {},{},{},{},{},{}",page,pageSize,name,gender,begin,end);
        //调用service分页查询
        PageBean pageBean = empService.page(page,pageSize,name,gender,begin,end);
        return Result.success(pageBean);
    }
public interface EmpService {
    /**
     * 分页查询
     * @param page
     * @param pageSize
     * @return
     */
    PageBean page(Integer page, Integer pageSize,String name, Short gender,LocalDate begin,LocalDate end);
@Service
public class EmpServiceImpl implements EmpService {

    @Autowired
    private EmpMapper empMapper;

    @Override
    public PageBean page(Integer page, Integer pageSize) {
        //1. 获取总记录数
        Long count = empMapper.count();

        //2. 获取分页查询结果列表
        Integer start = (page - 1) * pageSize;
        List<Emp> empList = empMapper.page(start, pageSize);

        //3. 封装PageBean对象
        PageBean pageBean = new PageBean(count, empList);
        return pageBean;
    }

 

@RequestParam 的属性defaultValue可以来设置参数的默认值。 

 

分页插件PageHelper

PageHelper 是 Mybatis 的一款功能强大、方便易用的分页插件,支持任何形式的单标、多表的分页查询。
官网:https://pagehelper.github.io/

分页查询-实现

 

/**
 * 员工管理
 */
@Mapper
public interface EmpMapper {
    /**
     * 员工信息查询
     * @return
     */
    //@Select("select * from emp")
    public List<Emp> list();
}
@Service
public class EmpServiceImpl implements EmpService {

    @Autowired
    private EmpMapper empMapper;

    @Override
    public PageBean page(Integer page, Integer pageSize) {
        //1. 获取总记录数
        Long count = empMapper.count();

        //2. 获取分页查询结果列表
        Integer start = (page - 1) * pageSize;
        List<Emp> empList = empMapper.page(start, pageSize);

        //3. 封装PageBean对象
        PageBean pageBean = new PageBean(count, empList);
        return pageBean;
    }
}

 

分页查询(带条件)

条件分页查询-思路

<?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.itheima.mapper.EmpMapper">
    
    <!--条件查询-->
    <select id="list" resultType="com.itheima.pojo.Emp">
        select *
        from emp
        <where>
            <if test="name != null and name != ''">
                name like concat('%',#{name},'%')
            </if>
            <if test="gender != null">
                and gender = #{gender}
            </if>
            <if test="begin != null and end != null">
                and entrydate between #{begin} and #{end}
            </if>
        </where>
        order by update_time desc
    </select>

</mapper>

删除员工

 

上一节

Mybatis(day09)-CSDN博客

下一节

标签:return,SpringBootWeb,page,案例,day10,private,Integer,public,Result
From: https://blog.csdn.net/qq_45452617/article/details/144973605

相关文章

  • 解锁编程智慧:23种设计模式案例分享
    为什么要学习设计模式?你可以把设计模式想象成一些做饭的菜谱。当我们需要做一道菜(开发一个功能)时,如果按照自己的想法随意添加调料(编写代码),很可能做出的菜味道不好(功能不稳定或有bug)。但是,如果我们按照一个成功的菜谱(设计模式)来做,就能更容易地做出美味的菜肴(开发出稳定的功能)。......
  • vue3的element-plus侧边菜单栏测试案例
    未正确集成element-plus的先看前面的随笔集成后没问题,下面案例才能正常运行展示<scriptlang="ts"setup>import{Document,MenuasIconMenu,Location,Setting,}from'@element-plus/icons-vue'consthandleOpen=(key:string,keyPath:string[])=>{......
  • 谷歌地图案例 | Argos:利用 Google 地图平台将实体店和线上购物的优势融为一体
    关于ArgosArgos是英国零售巨头之一,每年拥有近2900万实体店顾客和超过10亿在线访客。其使命是提供卓越的便利、选择和价值。行业:零售和消费品。  GoogleCloud结果通过直观、易用的Google地图,将“跳出率”降低12%,每年留住数百万客户让顾客可以......
  • 76页智能工厂规划及实施案例学习智能工厂规划
        智能工厂规划及实施中,综合布线系统作为核心基础设施,扮演着至关重要的角色。该系统以标准化、统一化、简化的方式,精心布置建筑物内外的通信网络,涵盖网络、电话、监控、电源及照明等多个子系统,确保信息传输的高效与稳定。综合布线不仅是物理线路的集合,更是智慧工厂信......
  • 20个电商主题模版及案例预览
    本篇主要介绍20个适合做跨境电商网站的WordPress主题。该主题需要考虑几个方面:响应式设计、与WooCommerce插件兼容、用户体验、加载速度、SEO优化、多语言支持。如有技术问题,可以联系我们。跨境电商主题应该具备的特点响应式设计:确保主题在不同设备(如手机、平板和桌......
  • MSE+Range案例
    MSE的demo实现思路:首先准备fmp4格式的视频地址或者切片,接着将MSE挂载到video上,创建createObjectURL转二进制数据,fetch请求在线地址,分段请求,监听这个数据流的获取状态,当这个ReadyState为open的时候, sourceBuffer.appendBuffer(buf)处理接收到的数据,否则mediaSource.endOfStream......
  • 【金融行业】2024中国网络安全产业势能榜优能企业 · 金融行业典型案例展示
    金融行业一直是信息安全的重点领域,随着金融科技的快速发展和数字货币的崛起,金融机构面临着前所未有的挑战。数据泄露、网络攻击等安全事件的频发,促使金融企业加强安全保障。然而,信息安全的提高不仅仅是防止外部威胁的关键,更重要的是确保业务在突发事件或安全事件发生时的连续性和......
  • 「全网最细 + 实战源码案例」设计模式——外观模式
    概念外观模式是一种结构型模式,为复杂的子系统提供一个统一的接口,使得子系统的功能对外界更加简单、易用。与真实世界的类比当你通过打电话给商店下达订单时,接线员就是该商店所有服务和部门的外观。接线员为你提供了一个包含购物系统、支付网关、送货等服务的简单语言接口......
  • 同事申请邓白氏码,我却收到谷歌警告案例解析
    近期,一位朋友遇到了一个关于邓白氏码的典型案例,颇具借鉴意义。今天分享出来,希望能够对大家在申请和使用邓白氏码的过程中有所帮助!案例回顾这位朋友的谷歌开发者账号今年10月刚刚完成公司组织资料验证,本以为可以高枕无忧了,可万万没想到,仅仅过了两个多月,12月13号就收到了一份......
  • 【案例实操】Stable Diffusion 将产品白底图变成电商模特场景图全流程思路分享
    大家好我是AIGC阿道夫前言:在电商的视觉战场上,产品展示图的吸引力关乎成败。白底图虽简洁,却难在竞争中脱颖而出。本案例实操将为你揭秘如何利用StableDiffusion扭转乾坤,把单调白底图转化为吸睛的电商模特场景图,开启创意无限的电商视觉营销新篇章。今天分享一下SD模特......