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

news2025/1/11 9:49:26

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 {
    
    @Override
    public 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 {

    @Autowired
    private StudentMapper studentMapper;

    @Override
    public StudentBO getStudent(Integer userId) {
        // 方式一:Example方式
        // 如果userId=1,相当于SQL: select * from student where user_id=1
        StudentExample 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 student
    where 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 {

    @Autowired
    private StudentService studentService;

    @GetMapping
    public 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.coloradmin.cn/o/1037526.html

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

相关文章

【重新定义matlab强大系列十五】非线性数据拟合和线性拟合-附实现过程

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

人绒毛膜促性腺激素(HCG)介绍

人绒毛膜促性腺激素 HCG&#xff09;是妊娠期产生的一种肽类激素&#xff0c;由受孕后不久的胚胎产生&#xff0c;随后由合胞体滋养层&#xff08;胎盘的一部分&#xff09;合成。它的作用是防止卵子黄体的解体&#xff0c;从而维持孕酮的分泌&#xff0c;而孕酮对人类怀孕至关…

常用圆圈字符“圆圈字符替换器”

本文收录了162个常用圆圈字符&#xff0c;文内有“圆圈字符自动替换器”。 (本笔记适合熟悉字符串数据类型的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#x…

分享从零开始学习网络设备配置--任务3.6 使用默认及浮动路由实现网络连通

任务描述 某公司随着规模的不断扩大&#xff0c;现有北京总部和天津分部2个办公地点&#xff0c;分部与总部之间使用路由器互联。该公司的网络管理员经过考虑&#xff0c;决定在总部和分部之间的路由器配置默认路由和浮动路由&#xff0c;减少网络管理&#xff0c;提高链路的可…

PHP8中伪变量“$this->”和操作符“::”的使用-PHP8知识详解

对象不仅可以调用自己的变量和方法&#xff0c;也可以调用类中的变量和方法。PHP8通过伪变量“$this->”和操作符“::”来实现这些功能。 1.伪变量“$this->” 在通过对象名->方法调用对象的方法时&#xff0c;如果不知道对象的名称&#xff0c;而又想调用类中的方法…

互联网医院|互联网医院系统引领医疗科技新风潮

互联网的迅速发展已经改变了人们的生活方式&#xff0c;而医疗领域也不例外。近年来&#xff0c;互联网医院应运而生&#xff0c;为患者和医生提供了更便捷、高效的医疗服务。本文将深入探讨互联网医院的系统特点、功能以及未来的发展方向&#xff0c;为您展现医疗行业的新时代…

代码随想录算法训练营第23期day4| 24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

目录 一、&#xff08;leetcode 24&#xff09;两两交换链表中的节点 二、&#xff08;leetcode 19&#xff09;删除链表的倒数第N个节点 思路 三、&#xff08;leetcode 160&#xff09;链表相交 四、&#xff08;leetcode 142&#xff09;环形链表II 思路 一、&#xf…

使用华为eNSP组网试验⑴-通过Vlan进行网络设备间通讯

在2019年学习网络的时候是从思科产品开始学的&#xff0c;那个时候接触了思科的6506、4506、3750、3550、2950&#xff0c;因为网络设备多&#xff0c;基本上是在多余的设备上直接操作&#xff0c;掌握后再上现场设备中去操作。当时使用了思科的模拟器CISCO Packet Tracer&…

驱动开发练习,platform实现如下功能

实验要求 驱动代码 #include <linux/init.h> #include <linux/module.h> #include <linux/platform_device.h> #include <linux/mod_devicetable.h> #include <linux/of_gpio.h> #include <linux/unistd.h> #include <linux/interrupt…

google sitemap Sitemap could not be read

google一直也不提示具体原因。直到换个域名&#xff0c;发现可以提交sitemap。去别就是没有www的可以&#xff0c;带www的不行。应为sitemap的地址带www&#xff0c;但是sitemap里面的url内容是不带www&#xff0c;属于非法格式&#xff0c;所以一直报错。更正了sitemap地址后&…

数据库常用指令

检查Linux系统是否已经安装了MySQL&#xff1a; sudo service mysql start

89. 格雷编码

解题思路&#xff1a; 解法一&#xff1a;找规律&#xff0c;2-4位格雷码的码表如下图所示&#xff08;二进制表示&#xff09;&#xff1a; 可以发现&#xff0c;n位格雷码序列可以由n-1位格雷码序列得到&#xff0c;满足递归规则&#xff0c;具体构造规则如下&#xff1a; …

golang 通过案列感受下内存分析

package main // 声音文件所在的包&#xff0c;每个go文件必须有归属的包 import ("fmt" )// 引入程序中需要用的包&#xff0c;为了使用包下的函数&#xff0c;比如&#xff1a;Printinfunc exchangeNum(num1 int, num2 int){var t intt num1num1 num2num2 t }…

stc8H驱动并控制三相无刷电机综合项目技术资料综合篇

stc8H驱动并控制三相无刷电机综合项目技术资料综合篇 🌿相关项目介绍《基于stc8H驱动三相无刷电机开源项目技术专题概要》 🔨停机状态,才能进入设置状态,可以设置调速模式,以及转动方向。 ✨所有的功能基本已经完成调试,目前所想到的功能基本已经都添加和实现。引脚利…

【云原生】聊聊为什么需要docker以及其基础架构

为什么需要docker 在没有docker之前&#xff0c;我们开发、测试、生产其实是根据不同的服务器进行配置的&#xff0c;很可能因为软件配置不同而导致的生产事故&#xff0c;那么如果能较好的解决软件和配置等封装成一个可运行的软件&#xff0c;无需关注配置&#xff0c;那么是…

<十三>objectARX开发:模拟实现CAD的移动Move命令

一、目的 实现类似于CAD的移动命令,选择对象,移动到指定位置,移动过程中对象跟随鼠标移动。效果如下: 二、关键步骤 选择对象,打开实体判断类型:acedEntSel()、acdbOpenObject()、isKindOf()。指定基点:acedGetPoint()。移动模型,追踪光标移动对象实体:acedGrRead()…

gitee生成公钥和远程仓库与本地仓库使用验证

参考文档&#xff1a; https://help.gitee.com/base/account/SSH%E5%85%AC%E9%92%A5%E8%AE%BE%E7%BD%AE(1)通过命令ssh-keygen 生成SSH key -t key类型 -c注释 ssh-keygen -t ed25519 -C "Gitee SSH Key" (2)按三次回车 (3)查看生成的 SSH 公钥和私钥&#xff1a; …

SOLIDWORKS Simulation:优化设计的利器

SOLIDWORKS Simulation是SOLIDWORKS软件家族中的一员&#xff0c;是一款强大的工程仿真分析工具。它通过模拟和分析&#xff0c;帮助工程师们更好地理解和评估设计方案的性能&#xff0c;并通过优化设计来提高产品质量和效率。这篇文章我们将介绍SOLIDWORKS Simulation的特点、…

Android问题笔记 - kotlin中使用Java接口,报错Parameter specified as non-null is null 快速解决

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…