SSM整合进阶操作

SSM整合: http://t.csdnimg.cn/0lgfl


响应格式统一

我们要保证一个项目中所有接口返回的数据格式的统一。这样无论是前端还是移动端开发获取到我们的数据后都能更方便的进行统一处理。

所以我们定义以下结果封装类

/**
 * 在将Java对象转换为JSON格式时,只有非null属性才会被包含在生成的JSON对象中。
 * 这对于减少JSON数据大小,以及避免由于不必要的null值导致的问题非常有用。
 *
 * @JsonInclude(JsonInclude.Include.NON_NULL)
 */
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseResult<T> {
    /**
     * 状态码
     */
    private Integer code;
    /**
     * 提示信息,如果有错误时,前端可以获取该字段进行提示
     */
    private String msg;
    /**
     * 查询到的结果数据,
     */
    private T data;

    public ResponseResult(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public ResponseResult(Integer code, T data) {
        this.code = code;
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public ResponseResult(Integer code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
}

 修改接口

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/user/{id}")
    public ResponseResult findById(@PathVariable("id") Integer id) {
        User user = userService.findById(id);
        if (user == null) {
            //说明没有对应的用户
            return new ResponseResult(500, "没有该用户");
        }
        return new ResponseResult(200, "操作成功", user);
    }
}

 

查询所有用户

UserMapper接口

List<User> findAll();

 UserMapper.xml

<?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.yu.dao.UserMapper">

    <select id="findAll" resultType="com.yu.pojo.User">
        select * from user
    </select>

</mapper>

UserService接口

List<User> findAll();

 UserServiceImpl实现类

 public List<User> findAll() {
      return userMapper.findAll();
  }

controller

  @GetMapping("/user")
  public ResponseResult findAll(){
      List<User> list = userService.findAll();
      return new ResponseResult(200,"操作成功",list);
  }

 

分页查询用户

分页查询的结果除了要包含查到的用户数据外还要有当前页数,每页条数,总记录数这些分页数据。

分页数据封装类

public class PageResult<T> {

    private Integer currentPage;

    private Integer pageSize;

    private Integer total;

    private List<T> data;

    public PageResult(Integer currentPage, Integer pageSize, Integer total, List<T> data) {
        this.currentPage = currentPage;
        this.pageSize = pageSize;
        this.total = total;
        this.data = data;
    }

    public Integer getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(Integer currentPage) {
        this.currentPage = currentPage;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getTotal() {
        return total;
    }

    public void setTotal(Integer total) {
        this.total = total;
    }

    public List<T> getData() {
        return data;
    }

    public void setData(List<T> data) {
        this.data = data;
    }
}
UserService接口
PageResult findByPage(Integer pageSize, Integer pageNum);
UserServiceImpl实现类
  public PageResult findByPage(Integer pageSize, Integer pageNum) {
        PageHelper.startPage(pageNum,pageSize);
        List<User> list = userMapper.findAll();
        PageInfo pageInfo = new PageInfo(list);
        PageResult pageResult = new PageResult(pageInfo.getPageNum(),pageInfo.getPageSize(), (int) pageInfo.getTotal(),list);
        return pageResult;
    }

Controller

 @GetMapping("/user/{pageSize}/{pageNum}")
    public ResponseResult findByPage(@PathVariable("pageSize") Integer pageSize,@PathVariable("pageNum") Integer pageNum){
        PageResult pageResult =  userService.findByPage(pageSize,pageNum);
        return new ResponseResult(200,"操作成功",pageResult);
    }

插入用户

 UserMapper接口

 void insertUser(User user);

mapper.xml映射文件

<insert id="insertUser">
      insert into user values(null,#{username},#{age},#{address})
</insert>
UserService接口
 void insertUser(User user);
UserServiceImpl实现类
public void insertUser(User user) {
        userMapper.insertUser(user);
    }

Controller

    @PostMapping("/insertUser")
    public ResponseResult insertUser(@RequestBody User user){
        userService.insertUser(user);
        return new ResponseResult(200,"操作成功");
    }
}
{
    "username":"奇遇少年666",
    "age":20,
    "address":"星球"
}

 

删除用户

  UserMapper接口

void deleteUser(Integer id);

mapper.xml映射文件

 <delete id="deleteUser">
       delete from user where id = #{id}
  </delete>
UserService接口
  void deleteUser(Integer id);
UserServiceImpl实现类
 public void deleteUser(Integer id) {
        userMapper.deleteUser(id);
    }

Controller

 @DeleteMapping("/user/{id}")
    public ResponseResult deleteUser(@PathVariable("id") Integer id){
        userService.deleteUser(id);
        return new ResponseResult(200,"操作成功");
    }

 

更新用户

 

  UserMapper接口

  void updateUser(User user);

mapper.xml映射文件

<update id="updateUser">
        update user set username = #{username},age = #{age},address = #{address} where id = #{id}
</update>
UserService接口
void updateUser(User user);
UserServiceImpl实现类
 public void updateUser(User user) {
        userMapper.updateUser(user);
    }

Controller

 @PutMapping("/user")
    public ResponseResult updateUser(@RequestBody User user){
        userService.updateUser(user);
        return new ResponseResult(200,"操作成功");
    }
{   
    "id":1,
    "username":"奇遇少年",
    "age":20,
    "address":"星球"
}

 

 

异常统一处理

我们可以使用@ControllerAdvice实现对异常的统一处理。让异常出现时也能返回响应一个JSON。

代码如下

@ControllerAdvice
public class GlobalControllerAdvice {
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ResponseResult handleException(Exception e){
        return new ResponseResult(500,e.getMessage());
    }
}

拦截器

public class YuHandlerInterceptor implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

 spring-mvc.xml

  <!--配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <!--配置排除拦截的路径-->
            <!--<mvc:exclude-mapping path="/"/>-->
            <!--配置拦截器对象注入容器-->
            <bean class="com.yu.interceptor.YuHandlerInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

声明式事务

已经做好了相应的配置,只要在service方法上加上注解即可  


    @Transactional
    public void testAddUser() {
        userMapper.insertUser(new User(null,"奇遇少年",18,"长沙"));
//        System.out.println(1/0);
        userMapper.insertUser(new User(null,"奇遇少女",18,"长沙"));
    }

AOP

注意,自己去使用AOP进行增强时,应该是对Service进行增强。不能对Controller进行增强,因为切面类会被放入父容器,而我们的Controller是在子容器中的。父容器不能访问子容器。

并且我们如果需要对Controller进行增强,使用拦截器也会更加的好用。

@Aspect
@Component
public class YuAspect {

    //定义切点
    @Pointcut("execution(* com.yu.service..*.*(..))")
    public void pt(){

    }

    //进行增强
    @Before("pt()")
    public void before(){
        System.out.println("before");
    }
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

理解并实现OpenCV中的图像平滑技术

导读 图像模糊&#xff08;也称为图像平滑&#xff09;是计算机视觉和图像处理中的基本操作之一。模糊图像通常是噪声减少、边缘检测和特征提取等应用的第一步。在本博客中&#xff0c;我们将重点介绍如何使用Python中的OpenCV库应用多种模糊技术。 理论概述&#xff1a; 基本…

杨中科 ASP.NET DI综合案例

综合案例1 需求说明 1、目的:演示DI的能力; 2、有配置服务、日志服务&#xff0c;然后再开发一个邮件发送器服务。可以通过配置服务来从文件、环境变量、数据库等地方读取配置&#xff0c;可以通过日志服务来将程序运行过程中的日志信息写入文件、控制台、数据库等。 3、说明…

【Linux】 Linux 小项目—— 进度条

进度条 基础知识1 \r && \n2 行缓冲区3 函数介绍 进度条实现版本 1代码实现运行效果 版本2 Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&#xff01;&#xff01;&#xff01; 基础知识 1 \r &&a…

一文读懂深度学习中的各种卷积 !!

文章目录 前言 1、卷积与互相关 2、3D 卷积 3、转置卷积&#xff08;去卷积&#xff09; 4、扩张卷积 5、可分卷积 6、分组卷积 前言 我们都知道卷积的重要性&#xff0c;但你知道深度学习领域的卷积究竟是什么&#xff0c;又有多少种类吗&#xff1f;研究学者Kunlun Bai发布了…

2月12号

第一种判断方式 if (n 10) 更好&#xff0c;因为它具有更好的可读性、可以避免误操作&#xff0c;并符合常见的编程习惯和约定

DSA 经典数据结构与算法 学习心得和知识总结(三) |有向无环图及其应用

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《算法导论》第三版 就是这本被封神的杰作&#xff0c;就是它&#x1f926; 2、参考书籍&#xff1a;《数据结构》严奶奶版 3、参考书…

SpringCloud-搭建Nacos配置中心

一、Nacos 功能介绍 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是阿里巴巴开源的一个分布式服务注册、配置管理&#xff0c;以及服务健康管理平台。在微服务架构中&#xff0c;配置管理是至关重要的一环&#xff0c;Nacos 提供了可靠、动态的配置…

月薪30K-100K,新一波工作机会来了,你准备好了吗

纯血版鸿蒙发布&#xff0c;开启一个新时代 1月18日下午&#xff0c;在“鸿蒙千帆起”发布会上&#xff0c;华为揭秘鸿蒙生态和纯血鸿蒙星河版HarmonyOS NEXT进阶的新进展。“几年来&#xff0c;在众多伙伴和开发者的共同努力下&#xff0c;鸿蒙生态设备数已达8亿&#xff0c;…

Windows下体验Stable Diffusion 近距离感受AI魔法绘画

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 往期专栏回顾 专栏描述Java项目实战介绍Java组件安装、使用;手写框架等Aws服务器实战Aws Linux服务器上操作ngin…

快速入门ESP32——移植LVGL(保姆级教程)

相关文章 快速入门ESP32——开发环境配置Arduino IDE 快速入门ESP32——开发环境配置PlatformIO IDE 快速入门ESP32—— platformIO添加开源库和自己的开发库 快速入门ESP32—— 解决platformIO添加开源库下载失败的问题 快速入门ESP32——点亮你的第一个LCD屏幕 快速入门ESP32…

RK3568笔记十五:触摸屏测试

若该文为原创文章&#xff0c;转载请注明原文出处。 使用正点原子的ATK-RK3568板子&#xff0c;一直在测试屏幕和视频&#xff0c;突然想到触摸屏测试&#xff0c;一直没有用过&#xff0c;原子给的demo跑的是QT系统&#xff0c;触摸功能是正常的&#xff0c;测试一下&#xf…

解密ERP业务架构:打造高效运营与持续增长的关键

在当今竞争激烈的商业环境中&#xff0c;企业需要有效管理和整合各个部门的业务流程和信息&#xff0c;以实现高效运营和持续增长。而ERP&#xff08;企业资源规划&#xff09;系统作为一种集成的业务管理平台&#xff0c;扮演着至关重要的角色。本文将探讨ERP业务架构的重要性…

【革新你的社交形象】用AI创意头像应用,让你的头像独一无二!

在这个数字化时代&#xff0c;社交媒体已经成为我们生活中不可或缺的一部分。你是否曾经为了找到一个既能表达自己个性&#xff0c;又足够吸引眼球的头像而苦恼&#xff1f;现在&#xff0c;有了我们全新推出的AI创意头像应用&#xff0c;你的这一困扰将成为过去&#xff01; …

VBA技术资料MF119:数据验证的添加与删除

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

线程池(图解,本质,模拟实现代码)

目录 线程池 介绍 图解 过程 本质 模拟实现 思路 注意点 解决方法 代码 pthread_pool.hpp task.hpp main.cpp 示例 线程池 介绍 线程池是一种并发编程的设计模式&#xff0c;用于管理和重复使用线程&#xff0c;以提高多线程应用程序的性能和效率 线程池主要用于…

C++ “雪花算法“原理

C雪花算法并不是传统的数据结构与算法而是一种崭新的分布式算法 属于深层次C 本篇文章就来描述一下雪花算法 什么是雪花算法: 雪花算法&#xff08;Snowflake&#xff09;是Twitter开源的一种分布式唯一ID生成算法。它可以在不依赖于数据库等其他存储设施的情况下&#xff0c…

指针的经典笔试题

经典的指针试题&#xff0c;让你彻底理解指针 前言 之前对于指针做了一个详解&#xff0c;现在来看一些关于指针的经典面试题。 再次说一下数组名 数组名通常表示的都是首元素的地址&#xff0c;但是有两个意外&#xff0c;1.sizeof&#xff08;数组名&#xff09;这里数组名…

ES入门知识点总结

目录 倒排索引 倒排索引 Elasticsearch的倒排索引是一种数据结构&#xff0c;用于加快基于文本的搜索操作。它的主要优势在于能够快速找到包含特定单词的文档。 倒排索引的构建过程如下&#xff1a; 文档分词&#xff1a;将文档内容分割成单独的词&#xff08;或者更小的词元…

Java的异常体系

一、体系简介 java中的Exception类的子类不仅仅只是像上图所示只包含IOException和RuntimeException这两大类&#xff0c;事实上Exception的子类很多很多&#xff0c;主要可概括为&#xff1a;运行时异常与非运行时异常。 在上述体系中&#xff0c;Error表示严重的系统错误&am…

【前端高频面试题--Vue路由篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;前端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac;前端高频面试题--Vue路由篇 对Vue-Router的理解Vue路由懒加载的实现路由的hash和history模式如何获…