Springboot03--restful、swagger+orm/mybatis,mybatis-plus

news2024/11/25 2:56:10

 

 

 

 

 

 

 

 

 参考这个方法配置,主要是我的springboot和swagger的版本号的问题

SpringBoot2.7.14集成Swagger3.0 (liqinglin0314.com)

常用的一些注解

放在controller里面

2. mybatisplus

<!-- MyBatisPlus依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>
        <!-- mysq1驱动依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--数据连接池druid
        -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.20</version>
        </dependency>

配置

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/hy-park?useSSL=false
    username: root
    password: 123123

  mybatis-plus:
    configuration:
      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

 假设要对用户列表进行操作,先定义一个用户操作数据的接口,叫UserMaper

@Mapper
public interface UserMapper {
    @Select("select * from user") //数据库查询语句,mybatis用注解查询的
    public List<User> find(); //定义查找方法,返回为User的一个列表
//这里这俩是一体的,上面是sql语句,下面给这个语句一个方法,方便调用
}

 接下来去主文件那边加一个mapperscan的注解,表示要扫描这边

@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class Demo2Application {
	public static void main(String[] args) {
		SpringApplication.run(Demo2Application.class, args);
	}

}

最后写个用户的controller

@RestController
public class UserController {

    @Autowired //注解必须加上
    private UserMapper userMapper; //这边定义一下接口就行不用实例化

    @GetMapping("/user")
    public List query(){ //这里返回后会自动转成json格式
        List<User> list = userMapper.find(); //调用接口的find方法
        System.out.println(list);
        return list; //返回数据给前端
    }
}

 搞定了

insert操作:

@Insert("insert into user values (#{id}, #{name}, #{password}, #{birthday})")
    public int insert(User user);//上面#{}里面的形参就是下面前端传进来的user里面的属性会传进去
@PostMapping("/user")
    public String save(User user){
        int i = userMapper.insert(user);
        if(i > 0){
            return "插入回成功" + i;
        }else{
            return "插入失败";
        }
    }

 以上都是mybatis的内容,mybatis plus的内容往下看

1. 改mapper,继承下来一堆Basemapper的方法,不用自己写了

public interface UserMapper extends BaseMapper<User> { 
    //继承basemapper,传的参数告诉他我要操作哪个类,前提是类名和表名一致

2. 改controller那边的代码,直接用继承的方法就可以

    @GetMapping("/user")
    public List query(){ //这里返回后会自动转成json格式
        List<User> list = userMapper.selectList(null); //直接继承方法
        System.out.println(list);
        return list; //返回数据给前端
    }

    @PostMapping("/user")
    public String save(User user){
        int i = userMapper.insert(user);
        if(i > 0){
            return "插入回成功" + i;
        }else{
            return "插入失败";
        }
    }

其他内容可以直接上官网学习,感觉写的也蛮好的,多看看注解那边

3. mybatisplus 多表查询分页查询

 

两个表:

user表格

 t_order表

目标一:一次性查询所有用户,并且能看到每个用户的n个订单

1. 先在用户类里面,加上一个orders属性,表示当前用户的订单(注意,set,get,tostring都需要加上,不然显示不出来orders)

@TableField(exist = false)
    //这句话意思是告诉mybatis-plus这个order字段在数据库的user表里面不存在
    private List<Order> orders;

​​​​​​​2. 定义order类 

3. 去usermapper里面加上方法,用到映射

@Select("select * from user")
    // MyBatis中使用@Results注解来映射查询结果集到实体类属性。
    @Results({
            @Result(column = "id", property = "id"),
            //表示一种映射,前面是查询到的user表里的内容,后面是user类里面的属性
            @Result(column = "birthday", property = "birthday"),
            @Result(column = "name", property = "name"),
            @Result(column = "password", property = "password"),
            @Result(column = "id", property = "orders",javaType = List.class,
                    many = @Many(select = "com.example.demo.mapper.OrderMapper.selectByUid"))
            //注意 这边就会把查询到的id传给后面selectByUid的参数,也就是order表格按照用户id查询订单,返回多个orders

    })
    List<User> selectAllUsersAndOrders();

4. 去ordermapper里面加上根据uid返回数据的方法

    @Select("select * from t_order where uid = #{uid}")
    List<Order> selectByUid(int uid);

5. 去usercontroller里面调用这个方法

   @GetMapping("/user/findAll")
    public List<User> find(){
        return userMapper.selectAllUsersAndOrders();
    }

目标二:一次性显示所有订单,并且显示与之相关联的用户信息

1. 在order类里面加上user属性,因为一个订单只能有一个用户,所以,不是list了

 @TableField(exist = false)
    private User user;

2. ordermapper里面加上查询语句

@Select("select * from t_order")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "total",property = "total"),
            @Result(column = "order_time",property = "order_time"),
            @Result(column = "uid", property = "user", javaType = User.class,
            one = @One(select = "com.example.demo.mapper.UserMapper.findById"))
    })
    List<Order> selectAllOrdersAndUsers();

3. usermapper里面加上根据id查询的语句

  @Select("select * from user where id = #{id}")
    User findById();

4. ordercontroller调用,注意一定要加上那个@Autowired!!!!!!!!!!

   @Autowired
    private OrderMapper orderMapper;
    @GetMapping("/findeorder")
    List find(){
        return orderMapper.selectAllOrdersAndUsers();
    }

接下来是mybatis-plus的分页和单表查询,我觉得用到再说吧,不是很重要的感觉

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

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

相关文章

FL Studio低版本怎么免费升级:FL Studio升级要钱吗?

为了更好的服务国内FL Studio用户&#xff0c;FL Studio 官网提供了跨版本升级的服务&#xff0c;用户可以通过缴纳一定的费用&#xff0c;将自己已购买的入门版或其他非完整版的版本&#xff0c;升级为更高的版本&#xff0c;解锁更多的插件&#xff0c;而无需重新购买整套版本…

嵌入式开发学习(STC51-4-蜂鸣器)

内容 控制蜂鸣器发出声音&#xff0c;一段时间后关闭 蜂鸣器简介 蜂鸣器是一种一体化结构的电子讯响器&#xff0c;采用直流电压供电&#xff0c;广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件&#xff1b; 蜂…

算法通关村第六关——如何使用中序和后序来恢复一颗二叉树

1 树的基础知识 1.1 树的定义 树(Tree)&#xff1a;表现得是一种层次关系&#xff0c;为 n &#xff08; n ≥ 0 &#xff09; n&#xff08;n≥0&#xff09; n&#xff08;n≥0&#xff09;个节点构成的有限集合&#xff0c;当n0时&#xff0c;称为空树&#xff0c;对于任一…

锁定Mac的内置键盘,防止外接键盘时的误触

场景&#xff1a;把你的外接键盘放在mac上&#xff0c;然后打字时&#xff0c;发现外接键盘误触mac键盘&#xff0c;导致使用体验极差 解决方案&#xff1a;下载Karabiner-Elements这款软件&#xff0c;并给它开启相关权限。 地址&#xff1a;https://github.com/pqrs-org/Ka…

并网逆变器学习笔记6---三电平SVPWM下的连续和不连续调制

之前在学习中总结过一次DPWM策略选择&#xff1a;并网逆变器学习笔记5---三电平DPWM 但是对于三电平逆变器而言&#xff0c;如何从连续调制切换到不连续调制&#xff0c;存在一些疑惑点&#xff0c;下午闲来无事&#xff0c;把SVPWM下的连续调制和不连续调制的开关状态选择&am…

C++实现一个链栈

C实现一个链栈 什么是链栈如何实现链栈链栈的实现开发环境代码实现运行结果 什么是链栈 链栈不名思意&#xff0c;就是既具有链表的特性&#xff0c;又具有栈的特性。 即&#xff1a; 链栈中的元素由指针域和数据域组成&#xff0c;通过指针指向下一个元素&#xff1b;2.链栈同…

软件测试学习:师傅领进门修行看个人

本课程学习导图 2-1 软件测试阶段 1、单元测试 概念&#xff1a; 对软件中的 最小可测试单元 进行检查和验证。 原则&#xff1a; &#xff08;1&#xff09;尽可能测试用例相互独立 &#xff08;2&#xff09;一般由代码开发人员实施 好处&#xff1a;&#xff08;…

影响亚马逊Listing转化率的14大因素你知道吗?

我们都知道亚马逊listing转化率对于链接的推新和维稳来说有多么重要&#xff0c;只要转化率的比值无法达到整体市场平均比值的及格线&#xff0c;你就很可能会慢慢被亚马逊的飞轮算法所淘汰。 那么&#xff0c;具体是哪些因素在影响着你的listing转化率呢?这里我们可以分为显…

容器——1.集合概述

文章目录 1.1. Java 集合概览1.2. 说说 List,Set,Map 三者的区别&#xff1f;1.3. 集合框架底层数据结构总结1.3.1. List1.3.2. Set1.3.3. Map 1.4. 如何选用集合?1.5. 为什么要使用集合&#xff1f; 1.1. Java 集合概览 从下图可以看出&#xff0c;在 Java 中除了以 Map 结尾…

【深度学习】【风格迁移】Visual Concept Translator,一般图像到图像的翻译与一次性图像引导,论文

General Image-to-Image Translation with One-Shot Image Guidance 论文&#xff1a;https://arxiv.org/abs/2307.14352 代码&#xff1a;https://github.com/crystalneuro/visual-concept-translator 文章目录 Abstract1. Introduction2. 相关工作2.1 图像到图像转换2.2. Di…

Node.js |(三)Node.js API:path模块及Node.js 模块化 | 尚硅谷2023版Node.js零基础视频教程

学习视频&#xff1a;尚硅谷2023版Node.js零基础视频教程&#xff0c;nodejs新手到高手 文章目录 &#x1f4da;path模块&#x1f4da;Node.js模块化&#x1f407;介绍&#x1f407;模块暴露数据⭐️模块初体验⭐️暴露数据 &#x1f407;导入文件模块&#x1f407;导入文件夹的…

c++日志工具之——log4cpp

1、log4cpp概述 Log4cpp是一个开源的C类库&#xff0c;它提供了C程序中使用日志和跟踪调试的功能&#xff0c;它的优点如下&#xff1a; 提供应用程序运行上下文&#xff0c;方便跟踪调试&#xff1b; 可扩展的、多种方式记录日志&#xff0c;包括命令行、文件、回卷文件、内…

Kubernetes入门 一、认识Kubernetes

目录 什么是Kubernetes为什么使用 Kubernetes集群组件组件Master组件节点组件附加组件 核心概念和资源服务的分类资源和对象命名空间级ContainerPodreplicas控制器-ReplicationController控制器-ReplicaSet控制器-StatefulSet控制器-DaemonSet控制器-JobDeployment服务发现-Ser…

pytest-xdist分布式测试原理浅析

目录 pytest-xdist执行流程&#xff1a; pytest-xdist 模块结构&#xff1a; pytest-xdist分布式测试原理&#xff1a; pytest-xdist源码浅读&#xff1a; pytest-xdist执行流程&#xff1a; 解析命令行参数&#xff1a;pytest-xdist 会解析命令行参数&#xff0c;获取用户…

Vue3_对响应式对象解构赋值之后失去响应性——toRefs()

官网toRefs() :响应式 API&#xff1a;工具函数 | Vue.js toRefs 在调用时只会为源对象上可以枚举的属性创建 ref。如果要为可能还不存在的属性创建 ref&#xff0c;请改用 toRef。 setup(){const state reactive({name:"张三"age:14})const stateAsToRefs toRef…

SpringBoot 热部署

文章目录 前言一、spring-boot-devtools添加热部署框架支持settings 开启项目自动编译开启运行中热部署使用Debug启动 二、IDEA 自带 HowSwap 功能设置 Spring Boot 启动类等待项目启动完成点击热加载按钮存在的问题 三、JRebel 插件【推荐】安装插件使用插件 前言 在日常开发…

linux学习——Redis基础

目录 一、noSQL 类型 特点及应用场景 二、Redis 三、安装方式 编译安装 rpm安装 四、目录结构 /etc/redis.conf 五、Redis命令 六、本地登录和远程登录 本地登录 远程登录 七、数据库操作 帮助信息 库操作 数据操作 八、Redis持久化 一、RDB类型 二、AOF模式 一…

小白到运维工程师自学之路 第六十九集 (构建Docker容器监控系统:Cadvisor +Prometheus+Grafana)

一、概述 Prometheus产品简介 Prometheus是一个最初在SoundCloud上构建的开源系统监视和警报工具包。自2012年成立以来&#xff0c;很多公司和组织都采用了Prometheus&#xff0c;该项目拥有非常活跃的开发者和用户社区。 它现在是一个独立的开源项目&#xff0c;可以独立于任…

由于找不到msvcp140.dll无法继续执行代码多种解决方法

msvcp140.dll的作用是提供C程序运行所需的一些基本函数和类库&#xff0c;包括字符串处理、数学计算、文件操作、内存管理等功能。它为C程序员提供了一些常用的工具和函数&#xff0c;使得他们可以更方便地开发和调试程序。 当你的计算机缺少msvcp140.dll文件时&#xff0c;可能…

怎么把几秒的视频变成gif?视频转gif图片教程分享

无论是一段有趣的宠物视频、搞笑的表演片段&#xff0c;还是喜欢的电影或电视剧片段&#xff0c;通过gif形式分享&#xff0c;能够更好地吸引用户的关注、传递情感&#xff0c;并在社交媒体上引发互动与共鸣&#xff0c;那么如何才能将一段几秒钟的视频转gif图片&#xff08;ht…