JAVA Spring MVC+Mybatis Spring MVC的工作流程*,多表连查

目录

注解总结

将传送到客户端的数据转成json数据

**描述一下Spring MVC的工作流程**


1。属性赋值

BeanUtils.copyProperties(addUserDTO,user);

添加依赖:
    spring web、mybatis framework、mysql driver

@Controller和@ResponseBody优化


直接改成@RestController,每个方法上,就不需要加@ResponseBody

@RestController是组合注解,就等于:@Controller + @ResponseBody

@RequestMapping作用在类上,(value = "/v1/users/"),表示公共路径

添加该注解后,所有的接口上,不用再添加@Mapper注解了

防止自动装配@Autowired UserMapper userMapper;报错,可以添加value=false,表示不管是否装配成功,都不会不错

注解总结

        @Controller 注解
        标注一个类;
        表示该类是一个控制器,负责处理用户的请求,并将处理结果生成响应返回给客户端。


        @RequestMapping 注解
        请求注解;
        添加在控制器类或控制器方法上;
        将HTTP请求映射到控制器中的方法,指定处理请求的路径
        控制器类上:为整个控制器指定一个基础路径
        控制器方法上:指定相对于基础路径的具体路径


        @ResponseBody 注解
        响应注解;
        添加在控制器方法上;
        可以使控制器方法通过返回值的方式将响应返回给客户端。

        @RestController 注解
        作用于类上;
        作用是将类中的方法返回值直接作为HTTP响应的内容;
        在控制器类中加入该注解后,无需在每个方法上添加 @ResponseBody 注解;
        可以让Spring框架自动将方法的返回值序列化并填充到HTTP响应中,实现Web服务端点的快速       

        开发。
        

        @MapperScan 注解说明
        添加在 Spring配置类 上;
        用于告诉 Spring 扫描 MyBatis Mapper 接口并创建对应的 Mapper 实现;
        可以指定扫描 MyBatis 映射器接口的包名。

将传送到客户端的数据转成json数据,使用@ResponseBody或@RestController

**描述一下Spring MVC的工作流程**

        1. 客户端发送请求至前端控制器DispatcherServlet
        2. DispatcherServlet收到请求后,调用处理器映射器HandlerMapping
        3. HandlerMapping根据请求URL找到具体的Controller。
        4. Controller处理请求,并返回ModelAndView,其中的View只是视图名,并不指向具体的视图

        组件
        5. DispatcherServlet通过ViewReslover(视图解析器)确定负责显示数据的具体View
        6. DispatcherServlet对View进行渲染视图(即将Model填充至视图组件中),并将完整的视图

        响应到客户端

指定post请求方法:

    @RequestMapping(value = "insert",method = RequestMethod.POST)
//    @ResponseBodypublic String addUser(AddUserDTO addUserDTO){User user=new User();BeanUtils.copyProperties(addUserDTO,user);user.setCreated(new Date());userMapper.insertUser(user);return "添加成功";}

        或者:@PostMapping(value = "insert"),是一样的效果,只接受post请求

@PathVariable表示路径参数

uid 
@GetMapping("/v1/users/{uid}")
public void xxx(@PathVarable Integer uid){}

1、MyBatisConfig

//@Configuration :设置自动扫描 标识此类为配置类,工程启动时,会自动加载此类 //@MapperScan: 1、自动扫描注解,一旦添加该注解,会为指定包路径及子孙中所有接口添加@Mapper注解 // 2、添加该注解后,所有的接口上,不用再添加@Mapper注解了

package cn.tedu._05mvcboot02.config;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;//@Configuration :设置自动扫描 标识此类为配置类,工程启动时,会自动加载此类
//@MapperScan: 1、自动扫描注解,一旦添加该注解,会为指定包路径及子孙中所有接口添加@Mapper注解
//             2、添加该注解后,所有的接口上,不用再添加@Mapper注解了
@Configuration
@MapperScan(value = "cn.tedu._05mvcboot02")
public class MyBatisConfig {
}

UserController

package cn.tedu._05mvcboot02.controller;import cn.tedu._05mvcboot02.mapper.UserMapper;
import cn.tedu._05mvcboot02.pojo.dto.AddUserDTO;
import cn.tedu._05mvcboot02.pojo.entity.User;
import cn.tedu._05mvcboot02.pojo.vo.UserListVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Date;
import java.util.List;//@Controller
@RestController
@RequestMapping(value = "/v1/users/")
public class UserController {@Autowired UserMapper userMapper;@RequestMapping(value = "insert")
//    @ResponseBodypublic String addUser(AddUserDTO addUserDTO){User user=new User();BeanUtils.copyProperties(addUserDTO,user);user.setCreated(new Date());userMapper.insertUser(user);return "添加成功";}@RequestMapping(value = "userList")
//    @ResponseBodypublic List<UserListVO> getUserList(){return userMapper.getUserList();}@RequestMapping(value = "deleteUser")
//    @ResponseBodypublic String deleteUserById(Integer id){return "删除成功"+userMapper.deleteUserById(id);}@RequestMapping(value = "update")
//    @ResponseBodypublic String updateUser(User user){return "更新成功:"+userMapper.updateUser(user);}}

UserMapper

package cn.tedu._05mvcboot02.mapper;import cn.tedu._05mvcboot02.pojo.entity.User;
import cn.tedu._05mvcboot02.pojo.vo.UserListVO;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Controller;import java.util.List;@Mapper
public interface UserMapper {int insertUser(User user);List<UserListVO> getUserList();int deleteUserById(Integer id);int updateUser(User user);}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.tedu._05mvcboot02.mapper.UserMapper"><insert id="insertUser">INSERT INTO mvcdb.user(username, password, nickname, created)VALUES (#{username}, #{password}, #{nickname}, #{created})</insert><select id="getUserList" resultType="cn.tedu._05mvcboot02.pojo.vo.UserListVO">SELECT username, passwordFROM mvcdb.user</select><delete id="deleteUserById">DELETEFROM mvcdb.userWHERE id = #{id}</delete><update id="updateUser" >UPDATE mvcdb.user<set><if test="username!=null">username=#{username}</if>,<if test="password!=null">password=#{password}</if>,<if test="nickname!=null">nickname=#{nickname}</if>,<if test="created!=null">created=#{created}</if></set>WHERE id=#{id}</update></mapper><?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.tedu._05weibo.mapper.WeiboMapper"><insert id="insert">INSERT INTO blog.weibo(content, created, user_id)VALUES (#{content}, #{created}, #{userId})</insert>获取微博<select id="selectIndex" resultType="cn.tedu._05weibo.pojo.vo.WeiboIndexVO">SELECT w.id,w.content,u.nicknameFROM blog.user uJOIN blog.weibo w on u.id = w.user_id</select>根据id获取详情<select id="selectById" resultType="cn.tedu._05weibo.pojo.vo.WeiboIndexVO">SELECT w.id,w.content,w.created,u.nicknameFROM blog.user uJOIN blog.weibo w on u.id = w.user_idWHERE w.id=#{id}
</mapper>

application.properties

server.port=8080#???????
spring.datasource.url=jdbc:mysql://localhost:3306/mvcdb?characterEncodeing=utf8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123zhang
#xml????
mybatis.mapper-locations=classpath:mappers/*.xml

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

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

相关文章

H2数据库中一条insert语句到生成java对象到数据写入磁盘的完整步骤

H2 数据库将 SQL 语句转换为磁盘存储的全过程可以分为以下 8 个关键步骤&#xff0c;我们以 INSERT INTO users (id, name) VALUES (1, Alice) 为例详细说明&#xff1a; 1. SQL 解析与语法树生成 词法分析&#xff1a;拆分语句为 INSERT、INTO、users 等 Token语法分析&#…

重磅升级!Google Play商店改版上线

5 月 21 日消息&#xff0c;Android Headline 今天&#xff08;5 月 21 日&#xff09;发布博文&#xff0c;报道称在 2025 年 I/O 开发者大会上&#xff0c;谷歌宣布更新 Google Play 应用商店&#xff0c;在优化用户体验的同时&#xff0c;提升开发者收益。 本次更新中&…

Docker面试题(1)

什么是Docker 一个容器化平台 形式是容器 将你的应用程序及所有依赖项打包在一起 确保应用程序在任何环境中无缝运行 什么是Docker镜像 Docker镜像是Docker容器的源代码 用于创建容器 使用build命令创建镜像 什么是 Docker容器 包括应用程序及所有的依赖项 作为操作系统的独立进…

Ulisses Braga-Neto《模式识别和机器学习基础》

模式识别和机器学习基础 [专著] Fundamentals of pattern recognition and machine learning / (美)乌利塞斯布拉加&#xff0d;内托(Ulisses Braga-Neto)著 ; 潘巍[等]译 推荐这本书&#xff0c;作者有自己的见解&#xff0c;而且提供代码。问题是难度高&#xff0c;对于初学…

RabbitMQ的简介

三个概念 生产者&#xff1a;生产消息的服务消息代理&#xff1a;消息中间件&#xff0c;如RabbitMQ消费者&#xff1a;获取使用消息的服务 消息队列到达消费者的两种形式 队列&#xff08;queue&#xff09;:点对点消息通信&#xff08;point-to-point&#xff09; 消息进入队…

自动切换剪贴板路径中反斜杠为正斜杠

有时候需要将我们常见的win全路径中反斜杠为正斜杠&#xff0c;每次用记事本&#xff0c;编辑替换非常麻烦&#xff0c;于是写了这个工具&#xff0c;能自动修改剪贴板中的数据&#xff0c;只需要运行一下即可。 实现效果&#xff0c;将类似于下面的路径&#xff1a; C:\User…

【时时三省】Python 语言----文件

目录 1,文件打开 2, 文件关闭 3, 文件写入 4, 文件读出 5, 文件定位 6, 文件重命名 7, 复制文件 山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 1,文件打开 file = open(file, mode, buffering, encoding, errors, newline, closefd, opener) 2, 文…

React 个人笔记 Hooks编程

作用 配合函数式编程&#xff0c;保证在不产生类的时候完成一个整体的组件 常用组件 useStateuseContextuseReduceruseEffectuseMemouseCallback 前三个值为自变量 后三者为因变量 前三者相当于其他编程函数的变量声明&#xff0c;而后三者相当于对变量进行了(if now ! pr…

logits是啥、傅里叶变换

什么是logtis&#xff1f; 在深度学习的上下文中&#xff0c;logits 就是一个向量&#xff0c;下一步通常被投给 softmax/sigmoid 的向量。。 softmax的输出是分类任务的概率&#xff0c;其输入是logits层。 logits层通常产生-infinity到 infinity的值&#xff0c;而softmax层…

Adobe Illustrator学习备忘

1.移动画板&#xff1a;需按住空格键加鼠标一块才能拖动 2.放大缩小画板&#xff1a;按住Alt键加鼠标滚轮 3.撤回&#xff1a;CtrlZ 4.钢笔练习网站&#xff1a;The Bzier Game

【初识】内网渗透——基础概念,基本工具使用

目录 一、域&#xff0c;工作组&#xff0c;域控制器&#xff0c;活动目录相关概念&#xff1a; 域环境&#xff1a; 工作组&#xff1a; 域控制器DC&#xff1a; 活动目录AD&#xff1a; 二、内网的基本场景&#xff1a; 三、内网渗透基本测试方案&#xff1a; #案例1一基本信…

remove_const的工作原理及c++的类型推导

author: hjjdebug date: 2025年 05月 21日 星期三 12:51:57 CST descrip: remove_const的工作原理及c的类型推导 文章目录 1. 简单的程序代码.2.std::remove_const_t 到底是怎样工作的&#xff1f;2.1 测试代码2.2 类型推导的调试手段.2.2.1 给类模板添加成员函数,让它打印信息…

人脸识别,使用 deepface + api + flask, 改写 + 调试

1. 起因&#xff0c; 目的&#xff0c; 感受: github deepface 这个项目写的很好&#xff0c; 继续研究使用这个项目&#xff0c;改写 api。增加一个前端 flask app 2. 先看效果 3. 过程: 大力改写原始项目中 api 这部分的代码&#xff0c; 原始项目的文件结构太繁杂了: 我把…

三维表面轮廓仪的维护保养是确保其长期稳定运行的关键

三维表面轮廓仪是一种高精度测量设备&#xff0c;用于非接触式或接触式测量物体表面的三维形貌、粗糙度、台阶高度、纹理特征等参数。其主要基于光学原理进行测量。它利用激光或其他光源投射到被测物体表面&#xff0c;通过接收反射光或散射光&#xff0c;结合计算机图像处理技…

Lambda表达式的高级用法

今天来分享下Java的Lambda表达式&#xff0c;以及它的高级用法。 使用它可以提高代码的简洁度&#xff0c;使代码更优雅。 一、什么是lambda表达式 Lambda 表达式是 Java 8 引入的特性&#xff0c;用于简化匿名内部类的语法&#xff0c;使代码更简洁&#xff0c;尤其在处理函…

31-35【动手学深度学习】深度学习硬件

1. CPU和GPU 1.1 CPU CPU每秒钟计算的浮点运算数为0.15&#xff0c;GPU为12。GPU的显存很低&#xff0c;16GB&#xff08;可能32G封顶&#xff09;&#xff0c;CPU可以一直插内存。 左边是GPU&#xff08;只能做些很简单的游戏&#xff0c;视频处理&#xff09;&#xff0c;中…

【MySQL成神之路】MySQL常见命令汇总

目录 MySQL常用命令总结 1. 数据库操作 2. 表操作 3. 数据操作&#xff08;DML&#xff09; 4. 索引与优化 5. 用户与权限管理 6. 备份与恢复 7. 事务控制 8. 常用函数 9. 系统状态与日志 总结 MySQL常用命令总结 MySQL作为最流行的关系型数据库之一&#xff0c;提供…

Dify的大语言模型(LLM) AI 应用开发平台-本地部署

前言 今天闲着&#xff0c;捣鼓一下 Dify 这个开源平台&#xff0c;在 mac 系统上&#xff0c;本地部署并运行 Dify 平台&#xff0c;下面记录个人在本地部署Dify 的过程。 Dify是什么&#xff1f; Dify是一个开源的大语言模型&#xff08;LLM&#xff09;应用开发平台&#…

【论文阅读】针对BEV感知的攻击

Understanding the Robustness of 3D Object Detection with Bird’s-Eye-View Representations in Autonomous Driving 这篇文章是发表在CVPR上的一篇文章&#xff0c;针对基于BEV的目标检测算法进行了两类可靠性分析&#xff0c;即恶劣自然条件以及敌对攻击。同时也提出了一…

SonarQube的核心作用与用途

SonarQube作为一个开源的代码质量管理平台&#xff0c;致力于持续分析代码的健康状态&#xff0c;帮助开发团队提升代码质量。以下是其核心作用与用途的详细说明&#xff1a; 1、静态代码分析 SonarQube通过静态代码分析技术&#xff0c;自动识别代码中的潜在问题。它能够检测…