springboot中controller层接收参数,servers层调用mapper层,一条sql搞定排序

news2025/1/11 2:32:56

前言
很多小伙伴们在公司不管是测试C端产品还是B端产品,都会测到排序的业务需求;那么我们就会好奇排序是如何实现的呢?下面我们开始介绍代码的实现

数据库建表
我们需要创建一个书籍book表结构,如下图所示

CREATE TABLE `book` (
`id` int(11) NOT NULL AUTO_INCREMENT comment '主键自增id',
`book_no` varchar(200) comment '书的编号',
`book_name` varchar(200) NOT NULL comment '书名',
`book_author` varchar(200) DEFAULT NULL comment '书的作者',
`book_publish` varchar(200) DEFAULT NULL comment '书的出版社',
`book_category` int(11) DEFAULT NULL comment '书的分类',
`book_price` varchar(20) DEFAULT NULL comment '书的价格',
`book_introduction` text DEFAULT NULL comment '书的介绍',
create_time timestamp not null default current_timestamp comment '创建时间',
update_time timestamp not null default current_timestamp on update current_timestamp comment '更新时间',
PRIMARY KEY (`id`),
KEY `book_category` (`book_category`) USING BTREE,
CONSTRAINT `book_ibfk_1` FOREIGN KEY (`book_category`) REFERENCES `book_category` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 comment '书的信息';

向book表里插入数据

insert into book(book_no,book_name,book_author,book_publish,book_category,book_price,book_introduction) 
values('1111','巨人的陨落','肯.福莱特','江苏凤凰文艺出版社',1,'129','一本文学巨作');
insert into book(book_no,book_name,book_author,book_publish,book_category,book_price,book_introduction) 
values('2222','巨人的陨落2','肯.福莱特','江苏凤凰文艺出版社',1,'129','一本文学巨作');
insert into book(book_no,book_name,book_author,book_publish,book_category,book_price,book_introduction)
values('3333','巨人的陨落3','肯.福莱特','江苏凤凰文艺出版社',1,'129','一本文学巨作');
insert into book(book_no,book_name,book_author,book_publish,book_category,book_price,book_introduction) 
values('4444','巨人的陨落4','肯.福莱特','江苏凤凰文艺出版社',1,'129','一本文学巨作');
insert into book(book_no,book_name,book_author,book_publish,book_category,book_price,book_introduction)
values('5555','巨人的陨落5','肯.福莱特','江苏凤凰文艺出版社',1,'129','一本文学巨作');
insert into book(book_no,book_name,book_author,book_publish,book_category,book_price,book_introduction) 
values('6666','巨人的陨落6','肯.福莱特','江苏凤凰文艺出版社',1,'129','一本文学巨作');
insert into book(book_no,book_name,book_author,book_publish,book_category,book_price,book_introduction) 
values('7777','巨人的陨落7','张三','江苏凤凰文艺出版社',1,'129','一本文学巨作');

创建mapper.xml文件

include标签语法:include是引用SQL代码,refid 是引用的sql的id名称,一定要唯一
where标签语法:是顶层的遍历标签,需要配合if标签使用,单独使用无意义。
if标签语法:主要用来进行条件查询或者解决空值插入。具体语法为:<if test="校验条件">sql语句</if>

<?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.o2o.mapper.BookMapper">
    <!-- 书籍对象映射 -->
    <resultMap id="bookMap" type="com.o2o.data.Book">
        <id column="id" property="id"/>
        <id column="book_no" property="bookNo"/>
        <id column="book_name" property="bookName"/>
        <id column="book_author" property="bookAuthor"/>
        <id column="book_publish" property="bookPublish"/>
        <id column="book_category" property="bookCategory"/>
        <id column="book_price" property="bookPrice"/>
        <id column="book_introduction" property="bookIntroduction"/>
        <id column="category_name" property="categoryName"/>
        <id column="create_time" property="createTime"/>
        <id column="update_time" property="updateTime"/>
    </resultMap>

    <!-- 书籍对象映射 -->
    <resultMap type="com.o2o.data.BookWithBorrowFlg" id="bookWithBorrowFlgMap">
        <id column="id" property="id"/>
        <id column="book_no" property="bookNo"/>
        <id column="book_name" property="bookName"/>
        <id column="book_author" property="bookAuthor"/>
        <id column="book_publish" property="bookPublish"/>
        <id column="book_category" property="bookCategory"/>
        <id column="book_price" property="bookPrice"/>
        <id column="book_introduction" property="bookIntroduction"/>
        <id column="category_name" property="categoryName"/>
        <id column="create_time" property="createTime"/>
        <id column="update_time" property="updateTime"/>
        <id column="username" property="username"/>
        <id column="borrow_flg" property="borrowFlg"/>
    </resultMap>

    <!-- 按照查询条件分页查询书籍  -->
     <select id="getBookList" resultMap="bookMap">
         select
         a.id,a.book_no,a.book_name,a.book_author,a.book_publish,a.book_price,a.book_introduction,b.category_name
         from
         book a
         inner join
         book_category b
         on a.book_category = b.category_id
         <include refid="getBooksWhere"></include>
         order by a.update_time desc
     </select>

    <!-- 获取书籍的动态where条件 -->
    <sql id="getBooksWhere">
    <where>
    1=1
        <if test="bookNo != null and bookNo != ''">
            and a.book_no like '%' #{bookNo} '%'
        </if>
        <if test="bookName != null and bookName != ''">
            and a.book_name like '%' #{bookName} '%'
        </if>
        <if test="bookAuthor != null and bookAuthor != ''">
            and a.book_author like '%' #{bookAuthor} '%'
        </if>
        <if test="bookPublish != null and bookPublish != ''">
            and a.book_publish like '%' #{bookPublish} '%'
        </if>
        <if test="bookCategory != null and bookCategory != ''">
            and a.book_category = #{bookCategory}
        </if>
    </where>
    </sql>
</mapper>

application.yml配置文件

server:
  port: 9527

# 数据源
spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver  # mysql是8.x版本的需要加cj,如果是低版本5.x的不需要加这个cj
      url: jdbc:mysql://localhost:3306/cyw-mybatis?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8
      username: root
      password: Wangchunyu123


mybatis:
  #classpath指的是resource文件夹
  mapper-locations: classpath:/mapper/*.xml
  configuration:
    #开启驼峰命名规则 比如数据库字段是有下划线的t_no,那么代码中就要写成Tno代码里面自动把下划线的字母变成大写
    map-underscore-to-camel-case: true
    type-aliases-package: com.o2o.data


# 开启日志
logging:
  level:
    com:
      o2o:
        cy: debug

创建实体类book对象
@Data注解自动实现settergetter方法
在这里插入图片描述
创建接口统一返回类和枚举类
在这里插入图片描述
在这里插入图片描述

创建mapper层getBookList方法

package com.o2o.mapper;

import com.o2o.data.Book;
import com.o2o.data.param.BookParams;

import java.util.List;

/**
 * @Time : 2022/12/27 18:25
 * @Author : wcy
 * @FileName:
 * @email :954515472@qq.com
 */

public interface BookMapper {
    List<Book> getBookList(BookParams bookParams);
}

创建service层getBookList方法

package com.o2o.service;

import com.o2o.data.Book;
import com.o2o.data.param.BookParams;

import java.util.List;

/**
 * @Time : 2022/12/27 18:14
 * @Author : wcy
 * @FileName:
 * @email :954515472@qq.com
 */

public interface BookService {
    /**
     * 按照查询条件分页查询书籍
     */
    List<Book> getBookList(BookParams bookParams);
}

创建serviceImpl实现类
在service层中通过 @Resource注解注入mapper ,就可以直接通过mapper对象调用mapper接口中定义的方法,mapper中的方法名 与mapper.xml中的名字一一对应

package com.o2o.service.impl;

import com.o2o.data.Book;
import com.o2o.data.param.BookParams;
import com.o2o.mapper.BookMapper;
import com.o2o.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Time : 2022/12/27 18:27
 * @Author : wcy
 * @FileName:
 * @email :954515472@qq.com
 */

@Service
public class BookServiceImpl implements BookService {

    @Resource
    private BookMapper bookMapper;

    @Override
    public List<Book> getBookList(BookParams bookParams) {
       return bookMapper.getBookList(bookParams);
    }

    @Override
    public Long getTotalCount(BookParams bookParams) {
        return bookMapper.getTotalCount(bookParams);
    }
}

创建controller层接收参数

package com.o2o.controller;

import com.o2o.common.CommonResponse;
import com.o2o.data.Book;
import com.o2o.data.param.BookParams;
import com.o2o.service.BookService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Time : 2022/12/27 18:04
 * @Author : wcy
 * @FileName:
 * @email :954515472@qq.com
 */

@RestController
@RequestMapping("book")
public class BookController {

    @Resource
    private BookService bookService;
    /**
     * 按照条件获取书籍信息
     * @param bookParams
     * @return
     */
    @GetMapping("/getBookLists")
    @ResponseBody //@ResponseBody注解将controller层的方法返回结果写入到响应正文response对象的body中,直接返回JSON数据
    public CommonResponse<List<Book>> getBookLists(BookParams bookParams) {
        // 按照查询条件分页查询书籍
        List<Book> books = bookService.getBookList(bookParams);
        CommonResponse response = CommonResponse.successInstance(books);
        return response;
    }
}

启动run
我们可以看到springboot已经运行成功啦
在这里插入图片描述
在浏览器输入{ip}+路径访问
在这里插入图片描述
到这里就大功告成啦!

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

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

相关文章

嵌入式C语言面向对象编程 --- 总结

什么是 C 语言面向对象? 在开始嵌入式 C 语言设计模式系列文章之前,先通过三篇文章讲述了如何使用 C 语言实现面向对象的三大特性,封装,继承,多态。 图片来源公众号:码农翻身 对于“面向对象”这个词语,相信很多软件工程师都不会感觉到陌生,并且很多软件工程师在刚开…

ABAP: 定义关键字的区别

问题&#xff1a;TYPE、LIKE、LIKE TABLE OF、LIKE LINE OF、TYPE TABLE OF 的区别&#xff1f; 1、TYPE 用于变量的类型定义&#xff0c;可以是表中预定义好的字段&#xff0c;也可以是C(字符)&#xff0c;F(浮点型)&#xff0c;I(整型)等。 例如&#xff1a; DATA: NAME TY…

Spring Cloud简介

一、什么是SpringCloud&#xff1f; Spring Cloud 是一系列框架的有序集合。 Spring Cloud 并没有重复制造轮子&#xff0c;它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来。 通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理&#xff…

Python 图像边缘检测 | 利用 opencv 和 skimage 的 Canny 算法

文章目录一、简介二、opencv 实践三、skimage 实践CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、简介 提取图片的边缘信息是底层数字图像处理的基本任务之一。边缘信息对进一步提取高层语义信息有很大的影响。大部分边缘检测算法都是上个世纪的了&#xff0c…

【Java基础】day11

day11 一、BIO、NIO、AIO 三种 IO 模型分别是什么&#xff1f; BIO &#xff08;Blocking I/O&#xff09;同步阻塞的 I/O 、NIO&#xff08;New/Non-blocking I/O&#xff09; 同步非阻塞的 I/O 、AIO&#xff08;Asynchronous I/O&#xff09; 异步非阻塞的 I/O 。这三种 I…

前端例程20221227:下雪动画

演示 动图太大了不好上传&#xff0c;这里就放个静态图吧&#xff0c;实际上这里是雪花从上到下飘落的效果。 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content&quo…

【Spring【AOP】】——20、搭建一个AOP测试环境?

&#x1f4eb;作者简介&#xff1a;zhz小白 公众号&#xff1a;小白的Java进阶之路 专业技能&#xff1a; 1、Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理 2、熟悉Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理&#xff0c;具备⼀定的线…

Linux系统运行时参数命令--CPU性能监控

目录 2 CPU性能监控 2.1 平均负载和CPU使用率 1 平均负载基础 2 使用uptime命令分析平均负载 3 平均负载与 CPU 使用率 4 CPU使用率监测命令 ps查找进程信息 top命令查询进程的cpu、内存信息 mpstat pidstat 场景一&#xff1a;CPU 密集型进程 场景二&#xff1a;I…

嵌入式开发学习之--DMA(上)

提示&#xff1a;本篇文章主要了解学习一下DMA 文章目录前言一、DMA是什么&#xff1f;二、DMA使用步骤1、外设通道选择2.2、仲裁器2.3、FIFO2.4、存储器端口 外设端口2.5、编程端口三、DMA结构体初始化详解总结前言 上一篇文章学习了串口通信&#xff0c;这一篇我们来学习一下…

虹科案例 | 实现了新的核磁共振应用!(下)

摘要 光纤传感器已成为推动MRI最新功能套件升级和新MRI设备设计背后的关键技术。在这篇文章中&#xff0c;我们介绍了三个基于MRI的运动控制应用&#xff0c;展示了最近开发的、可在市场上买到的基于MRI的安全光纤反馈传感器的操作和使用。 案例研究 案例研究#1用于验证MRI技…

【聆思CSK6 视觉AI开发套件试用】体验AI功能

本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;YiCheng 很高兴极术社区和聆思科技举办的开发板申请试用活动&#xff0c;放张开箱图&#xff1a; 开发板介绍NanoKit开发板# NanoKit开发板是…

【算法】前缀和与差分

文章目录1.一维前缀和输入格式输出格式数据范围2.二维前缀和输入格式输出格式数据范围3.一维差分输入格式输出格式数据范围4.二维差分输入格式输出格式数据范围前缀和差分是一对逆运算1.一维前缀和 有一个长度为n的数组an:a1,a2…an; 对于前缀和&#xff1a;Si a1a2…ai 如何…

刷爆力扣之二进制求和

刷爆力扣之二进制求和 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&#xff0c;…

Spark零基础入门实战(八)Spark运行时架构

Spark有多种运行模式,可以运行在一台机器上,称为本地(单机)模式,也可以以YARN或Mesos作为底层资源调度系统以分布式的方式在集群中运行,称为Spark On YARN模式,还可以使用Spark自带的资源调度系统,称为Spark Standalone模式。 本地模式通过多线程模拟分布式计算,通常…

如何使用Python创建一个虚拟助理

使用Python创建一个虚拟助手 虚拟助理是基于人工智能的程序。它们是一种智能计算机程序&#xff0c;可以通过语音命令或文本理解人类的自然语言&#xff0c;并为用户执行任务。本文将指导你通过使用Python库来创建你自己的语音助手的过程。 在本教程中&#xff0c;我将在Jetb…

2022已经到了尾声,做一个漂亮的倒计时页面迎接2023年的到来

个人主页&#xff1a;天寒雨落的博客_CSDN博客-初学者入门C语言,python,数据库领域博主 目录 前言 效果图 网页直链 完整代码 倒计时的实现原理 前言 2022即将到来&#xff0c;快来一起做一个元旦倒计时分享给自己喜欢的人吧~ 效果图 网页直链 下面是可以直接访问的网页…

离散数学实践三判别图的连通性【JAVA实现】

文章目录思路重要算法&Warshall 算法代码全部代码效果展示思路 对于给定的邻接矩阵 A&#xff0c;可以用可达矩阵 Warshall 算法求出 A 所表示的图的可达矩阵 P。 对于可达矩阵 P 来说&#xff0c;如果 P 的所有元素均为 111&#xff0c;则所给的有向图是强连通的&#xf…

Python实现的一个简洁轻快的后台管理框架.支持拥有多用户组的RBAC管理后台,不用配置各种运行环境

Mini Admin 完整代码下载地址&#xff1a;Python实现的一个简洁轻快的后台管理框架.支持拥有多用户组的RBAC管理后台 Mini Admin,一个简洁轻快的后台管理框架.支持拥有多用户组的RBAC管理后台 &#x1f680; 应用场景&#xff1a;2-5人的管理团队&#xff0c;需要管理的资源数…

Mysql 慢日志处理

勿以恶小而为之&#xff0c;勿以善小而不为---- 刘备 有时候我们需要排查执行缓慢的SQL语句&#xff0c;这就用到了mysql慢查询日志。 开启慢查询日志的方式有两种&#xff1a;临时开启和永久开启。 开启慢查询日志功能可能需要mysql的版本达到5.7 查看版本号 select VERSI…

linux常用命令-路径切换及查看

切换路径-cd 我们可以使用cd&#xff08;change directory&#xff0c;切换目录&#xff09;的命令来进行目录切换 常规 其命令格式为 cd [相对路径或绝对路径] 例如&#xff1a; // 使用相对路径&#xff0c;切换到postfix目录下 cd ../postfix// 使用绝对路径切换到/var/…