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 {@Autowiredprivate 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)@ResponseBodypublic 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方法上加上注解即可  

@Transactionalpublic 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");}
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

年薪又又又刷新认知,最高160万!鸿蒙开发者迎来黄金期!

如今&#xff0c;鸿蒙与安卓彻底切割时间似乎越来越近&#xff0c;一批嗅觉灵敏的互联网厂商已经完成或开始启动开发鸿蒙原生App。随着头部App厂商启动鸿蒙&#xff08;HarmonyOS&#xff09;原生应用开发&#xff0c;鸿蒙开发人才变得紧缺。专家预测&#xff0c;鸿蒙开发的人才…

MySQL免安装版安装教程

官网下载安装包 MySQL :: Download MySQL Community Server (Archived Versions) 选择mysql版本下载 安装配置MySQL 将下载完的Mysql安装包解压到指定目录 打开windos系统的cmd&#xff0c;以管理员身份运行 进入mysql文件夹中的bin目录 安装MySQL的服务mysqld --install 初…

css3实现炫彩字体

这个字体颜色是动态变化的&#xff0c;直接上代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title&…

AliOS编译三方库

文章目录 1、官网教程2、编译NDK2.1 下载ndk2.2 编译环境准备2.3 安装ndk 3 cmake交叉编译3.1 编译工具链3.2 编译三方库 4 自带编译配置文件的交叉编译 1、官网教程 AliOS开发官网链接&#xff1a;AliOS开发者官网 应用开发下NDK开发有相关NDK开发介绍 2、编译NDK 2.1 下载…

【JavaScript】面试手写题精讲之数组(上)

专题缘由 该专题主要是讲解我们在面试的时候碰到一些JS的手写题, 确实这种手写题还是比较恶心的。有些时候好不容易把题目写出来了&#xff0c;突然面试官冷不丁来一句有没有更优的解法&#xff0c;直接让我们僵在原地。为了解决兄弟们的这些困扰&#xff0c;这个专题于是就诞…

【C++】---类和对象(上)入门

一、类的定义 1.那么众所周知&#xff0c;C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解的步骤&#xff0c;通过函数的调用来逐步解决问题 2.而C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间交…

压缩PDF的大小-Adobe Acrobat Pro

经常遇到上传的pdf太大&#xff0c;无法成功上传。 今天找到一个方法&#xff1a; 打开Adobe Acrobat Pro软件 → 文件 → 另存为其他&#xff08;H&#xff09;... →缩小大小的PDF 版本选择 4.0 最低的版本。 文件由9M变为1.5M。

第三百四十八回

文章目录 1. 概念介绍2. 使用方法2.1 List2.2 Map2.3 Set 3. 示例代码4. 内容总结 我们在上一章回中介绍了"convert包"相关的内容&#xff0c;本章回中将介绍collection.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的内容是col…

PLC_博图系列☞FBD

PLC_博图系列☞FBD 文章目录 PLC_博图系列☞FBD背景介绍FBD优势局限性 FBD 元素 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 FBD 背景介绍 这是一篇关于PLC编程的文章&#xff0c;特别是关于西门子的博图软件。我并不是专业的PLC编程人员&#xff0c;也不懂电路…

anomalib1.0学习纪实

回顾&#xff1a;细分、纵深、高端、上游、积累、极致。 回顾&#xff1a;产品化&#xff0c;资本化&#xff0c;规模化&#xff0c;大干快上&#xff0c;小农思维必死无疑。 春节在深圳新地中央&#xff0c;学习anomalib1.0。 一、安装&#xff1a; 1、常规安装 采用的是…

Netty Review - 底层零拷贝源码解析

文章目录 Pre概述源码解析入口索引AbstractNioByteChannel.NioByteUnsafe#readallocHandle.allocate(allocator) 小结传统的零拷贝 Pre Netty Review - 直接内存的应用及源码分析 概述 Netty 的零拷贝技术是通过优化数据传输过程中的数据复制操作&#xff0c;以降低系统的开销…

租赁香港服务器多少钱一个月?24元

阿里云香港服务器2核1G、30M带宽、40GB ESSD系统盘优惠价格24元/月&#xff0c;288元一年&#xff0c;每月流量1024GB&#xff0c;多配置可选&#xff0c;官方优惠活动入口 https://t.aliyun.com/U/bLynLC 阿里云服务器网aliyunfuwuqi.com分享阿里云香港服务器优惠活动、详细配…