7.15 SpringBoot项目实战 【学生入驻】(上):从API接口定义 到 Mybatis查询 串讲

CSDN成就一亿技术人

文章目录

  • 前言
  • 一、service层 和 dal层
    • 方式一、Example方式
    • 方式二、Mybatis XML方式
    • 方式三、Mybatis 注解方式
  • 二、web层 StudentController
  • 最后


前言

接下来我们实战【学生入驻】,对于C端学生端,一切交互开始于知道 当前学生是否入驻是否有借阅资格,所以SpringBoot后端需要提供给vue前端的第一个API是:当前登录的学生信息(是否入驻、是否有借阅资格)!

所以,本文将使用SpringBoot实现C端学生端第一个接口:查询学生信息和借阅资格!复习一下SpringBoot接口API的定义 以及Mybatis三种基础查询方式的使用,当然会做一点补充!一期已经过了一大半,继续加油,Let’s Go!


一、service层 和 dal层

首先创建service层接口StudentService,根据需求,我们是需要根据用户id查询学生信息, 所以定义如下:

public interface StudentService {StudentBO getStudent(Integer userId);
}

对于使用Mybatis查询学生信息的实现,根据前面的积累,我们至少有三种方式

方式一: 使用Mybatis官方代码生成器Mybatis Generator (MBG)自动生成的Example方式

详见:5.6 Mybatis代码生成器Mybatis Generator (MBG)实战详解

方式二: 使用Mybatis XML方式,需要自定义StudentMapperExt和StudentMapperExt.xml

详见:5.3 Mybatis映射文件 - 零基础入门,轻松学会查询的select标签和resultMap标签

方式三: 使用Mybatis 注解方式

详见:5.2 Mybatis快速入门,轻松学会常用12种注解开发

都是基础,所以接下来,我将把三种方式逐一实现:

定义实现类 StudentServiceImpl

@Service
public class StudentServiceImpl implements StudentService {@Overridepublic StudentBO getStudent(Integer userId) {return null;}
}

方式一、Example方式

StudentServiceImpl中注入Mybatis mapper

@Autowired
private StudentMapper studentMapper;

按userId查询学生

StudentExample example = new StudentExample();
example.createCriteria().andUserIdEqualTo(userId);
List<Student> studentList = studentMapper.selectByExample(example);

最后使用拷贝工具类,将PO转为BO:

CopyUtils.copy(studentList.get(0), StudentBO::new);

完整的实现代码:

@Service
public class StudentServiceImpl implements StudentService {@Autowiredprivate StudentMapper studentMapper;@Overridepublic StudentBO getStudent(Integer userId) {// 方式一:Example方式// 如果userId=1,相当于SQL: select * from student where user_id=1StudentExample example = new StudentExample();example.createCriteria().andUserIdEqualTo(userId);List<Student> studentList = studentMapper.selectByExample(example);if (CollectionUtils.isEmpty(studentList)) {return null;}return CopyUtils.copy(studentList.get(0), StudentBO::new);}
}

方式二、Mybatis XML方式

第一步:在dal层创建接口:StudentMapperExt,及对应的xml文件:StudentMapperExt.xml,如下:

在这里插入图片描述

第二步:定义查询方法,通过MybatisX插件自动生成select标签

Student selectByUserId(@Param("userId") Integer userId);

点击MybatisX插件的Generate statement

在这里插入图片描述

自动在StudentMapperExt.xml中生成select标签:

在这里插入图片描述

第三步,写查询SQL:

<select id="selectByUserId" resultMap="org.tg.book.dal.mapper.mbg.StudentMapper.BaseResultMap">select<include refid="org.tg.book.dal.mapper.mbg.StudentMapper.Base_Column_List" />from studentwhere user_id = #{userId}
</select>

这里用到了<include>标签,通过refid引入的是<sql>标签名(<sql>标签定义的是sql语句),这样的好处是多个select等标签通过<sql>标签可以重用一段相同的sql语句!例如这里的Base_Column_List对应的是sql语句的查询列sql:

在这里插入图片描述

另外,我用resultMap替换了自动生成的resultType属性,因为resultMap标签更强大,推荐使用!

然后就可以在StudentServiceImpl中注入Mybatis mapper及使用:

@Autowired
private StudentMapperExt studentMapperExt;@Override
public StudentBO getStudent(Integer userId) {// 方式二:XML方式Student student = studentMapperExt.selectByUserId(userId);return CopyUtils.copy(student, StudentBO::new);
}

方式二,我推荐的方式,从单一职责原则来看,dal层和service层各司其责:service层更专注于业务逻辑,dal层更专注于数据访问!

方式三、Mybatis 注解方式

在方式二创建的StudentMapperExt中创建一个新的查询方法:

@Select("select * from student where user_id =#{userId}")
Student selectByUserId3(@Param("userId") Integer userId);

同样可以使用@Results定义结果映射,具体实现参考【5.2】,我这里就省略了~

StudentServiceImpl 中调用与方式二相同:

@Autowired
private StudentMapperExt studentMapperExt;@Override
public StudentBO getStudent(Integer userId) {// 方式三:注解方式Student student = studentMapperExt.selectByUserId3(userId);return CopyUtils.copy(student, StudentBO::new);
}

二、web层 StudentController

service层实现以后,我们通过创建StudentController对外提供restful API,代码如下:

@RestController
@RequestMapping("/student")
@Validated
public class StudentController {@Autowiredprivate StudentService studentService;@GetMappingpublic TgResult<StudentBO> getStudent() {Integer userId = AuthContextInfo.getAuthInfo().loginUserId();StudentBO studentBO = studentService.getStudent(userId);return TgResult.ok(studentBO);}
}

对于StudentController上的三个注解,复习一下:

  • @RestController 等同于@Controller + @ResponseBody,用于定义SpringBoot项目的控制器类
  • @RequestMapping 用于处理请求映射,定义请求路径,也就是这个类中的接口前缀均为/student开头
  • @Validated 这是利用Spring Validation做参数校验的注解(当前API用不上,一般习惯先定义上)

对于GET请求,使用@GetMapping注解,这里没加子路径,大部分情况是需要加的,例如:@GetMapping("/test")

代码具体实现讲解:

  • 通过AuthContextInfo.getAuthInfo().loginUserId()获取当前登录的userId
  • 通过studentService.getStudent(userId)获取userId对应的学生信息
  • 通过TgResult.ok(studentBO)返回封装的通用请求结果

最后

看到这,觉得有帮助的,刷波666,感谢大家的支持~

想要看更多实战好文章,还是给大家推荐我的实战专栏–>《基于SpringBoot+SpringCloud+Vue前后端分离项目实战》,由我和 前端狗哥 合力打造的一款专栏,可以让你从0到1快速拥有企业级规范的项目实战经验!

具体的优势、规划、技术选型都可以在《开篇》试读!

订阅专栏后可以添加我的微信,我会为每一位用户进行针对性指导!

另外,别忘了关注我:天罡gg ,怕你找不到我,发布新文不容易错过: https://blog.csdn.net/scm_2008

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

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

相关文章

LeetCode 753. 破解保险箱【欧拉回路,DFS】困难

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

java字符串压缩和字符串解压

java字符串压缩和字符串解压 运行效果 java工具类 CompressUtil.java import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import org.apache.commons.codec.binary.Base64;import java.io.BufferedReader; import java.io.Byte…

el-form自定义规则后表单验证validate不生效的问题

1.首先放出结论&#xff0c;自定义验证规则必须降所有的可能全部都return callback出去&#xff0c;不然不会走validate 错误示范 // template <el-formref"ruleFormRef":model"ruleForm":rules"rules"label-width"120px"class&qu…

力扣:105. 从前序与中序遍历序列构造二叉树(Python3)

题目&#xff1a; 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&am…

Visio——绘制倾斜线段

一、形状 -> 图表和数学图形 -> 多行 二、放置多行线&#xff0c;可以发现存在两个折点 三、选择多行线&#xff0c;右键选择删除点&#xff0c;即可得到倾斜线段

C进阶-数据的存储

数据类型介绍 内置类型&#xff1a; //数据类型中的内置类型 // char //字符数据类型 // short //短整型 // int //整型 // long //长整型 // long long //更长的整型 // float //单精度浮点数 // double //双精度浮点数 //数据类型中的内置类型 单位是字节 // char //字…

PyCharm 手动下载插件

插件模块一直加载失败&#xff0c;报错信息&#xff1a; Marketplace plugins are not loaded. Check the internet connection and refresh. 尝试了以下方法&#xff0c;均告失败&#xff1a; pip 换源Manage Plugin Repositories...HTTP 代理设置...关闭三个防火墙 最后选…

《动手学深度学习 Pytorch版》 7.4 含并行连接的网络(GoogLeNet)

import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l7.4.1 Inception块 GoogLNet 中的基本卷积块叫做 Inception 块&#xff08;大概率得名于盗梦空间&#xff09;&#xff0c;由 4 条并行路径组成。 前 3 条路径使用窗口…

华为云云耀云服务器L实例评测|使用云耀云服务器L实例,自行搭建NextCloud

背景 本人是搞分布式存储的&#xff0c;一心想搭个网盘&#xff0c;发现L实例里面就有个网盘实例最低配置是2核4G&#xff0c;为了节省成本&#xff0c;选个【2核2G】的配置&#xff0c;一样可以搭起来。 简介 Nextcloud是一款开源免费的私有云存储网盘项目&#xff0c;可以让…

clickhouse学习之路----clickhouse的特点及安装

clickhouse学习笔记 反正都有学不完的技术&#xff0c;不如就学一学clickhouse吧 文章目录 clickhouse学习笔记clickhouse的特点1.列式存储2. DBMS 的功能3.多样化引擎4.高吞吐写入能力5.数据分区与线程级并行 clickhouse安装1.关闭防火墙2.CentOS 取消打开文件数限制3.安装依…

DATE和LocalDateTime在Java中有什么区别

在Java中&#xff0c;Date和LocalDateTime是两个表示日期和时间的类&#xff0c;它们有以下区别&#xff1a; 类型&#xff1a;Date是Java旧版提供的日期和时间类&#xff0c;而LocalDateTime是Java 8引入的新日期和时间API中的类。 不可变性&#xff1a;Date是可变类&#x…

深入理解C#中委托的使用及不同类型委托的应用示例

在C#中&#xff0c;委托是一种强大而灵活的机制&#xff0c;可以引用一个或多个方法&#xff0c;并允许以类似函数指针的方式进行调用。委托在事件处理、回调函数和多线程编程等场景中非常有用。本文将深入探讨C#中委托的使用&#xff0c;并介绍不同类型委托的应用示例。 目录…

Fiddler抓包工具配置+Jmeter基本使用

一、Fiddler抓包工具的配置和使用 在编写网关自动化脚本之前&#xff0c;得先学会如何抓包&#xff0c;这里以Fiddler为例。会抓包的同学可以跳过这一步&#xff0c;当然看看也是没坏处的…… 局域网络配置 将要进行抓包的手机与电脑连入同一局域网&#xff0c;电脑才能够抓到…

【深度学习实验】前馈神经网络(八):模型评价(自定义支持分批进行评价的Accuracy类)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. __init__(构造函数) 2. update函数(更新评价指标) 5. accumulate(计算准确率) 4. reset(重置评价指标) 5. 构造数据进行测试 6. 代码整合 一、实验介绍 本文将实…

react多条件查询

1、声明一个filter常量 2.filter接受&#xff08;condition,data&#xff09;两个参数 3、调用data里面的filter进行筛选 4、任意一个item当筛选条件 5、使用object.key获取对象所有key 6、对每个key使用Array.prototype.every&#xff08;&#xff09;方法判断是否满足条…

华为数通方向HCIP-DataCom H12-821题库(单选题:361-380)

第361题 如图所示是一台路由器的BGP输出信息。那么以下关于这段信息的描述,错误的是哪一项? <Huawei>display bgp error Error Type: Peer Error Peer Address:10.1.1.2 VRFName:Public Error Info: Router-ID conflictA、该路由器邻居地址是10.1.1.2 B、Error Type显…

电脑计算机xinput1_3.dll丢失的解决方法分享,四种修复手段解决问题

日常生活中可能会遇到的问题——xinput1_3.dll丢失的解决方法。我相信&#xff0c;在座的很多朋友都曾遇到过这个问题&#xff0c;那么接下来&#xff0c;我将分享如何解决这个问题的解决方法。 首先&#xff0c;让我们来了解一下xinput1_3.dll文件。xinput1_3.dll是一个动态链…

【数据结构】什么是数据结构?

数据结构(Data Structure)是计算机存储,组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合. 这么讲可能有些抽象,放一张图大家可能好理解一点: 上图依次是数据结构中逻辑结构中的:集合结构,线性结构,树形结构,图形结构. 而: 数据结构是一门研究非数值计算的程…

分库分表MySQL

目录 Mycat入门 分片配置 分片配置(配置Mycat的用户以及用户的权限) 启动服务 登录Mycat Mycat配置 schema.xml 1.schema标签:配置逻辑库,逻辑表的相关信息 1-1.核心属性 1-2.table标签 2.datanode标签:配置数据节点的相关信息 核心属性 3.datahost标签:配置的是节…

【性能测试】JMeter:集合点,同步定时器的应用实例!

一、集合点的定义 在性能测试过程中&#xff0c;为了真实模拟多个用户同时进行操作以度量服务器的处理能力&#xff0c;可以考虑同步虚拟用户以便恰好在同一时刻执行操作或发送请求。 通过插入集合点可以较真实模拟多个用户并发操作。 (注意&#xff1a;虽然通过加入集合点可…