Part02 ☀️

YangeIT大约 19 分钟汉口学院MysqlApifoxServletHTTPGETPOST

Part02 ☀️

今日目标

  • SpringBoot入门案例 ✏️ ❤️

  • SpringBoot进阶案例 ✏️ ❤️

    • JSON的概念数据传输格式
    • 请求消息获取和响应消息封装请求和响应
    • Tomcat端口修改配置文件
  • SpringBoot常用注解 🍐

    • SpringIOC的概念
  • 使用Mybatis集成SpringBoot操作完成数据的增删改查Java操作数据库 ✏️ ❤️

1 SpringBoot入门 ✏️ ❤️

1.1 Boot概述 🍐

SpringBoot

在没有正式的学习SpringBoot之前,我们要先来了解下什么是Spring。

我们可以打开Spring的官网(https://spring.ioopen in new window),去看一下Spring的简介:Spring makes Java simple。

Spring的官方提供很多开源的项目,我们可以点击上面的projects,看到spring家族旗下的项目,按照流行程度排序为:

image-20231122163315170
image-20231122163315170

Spring发展到今天已经形成了一种开发生态圈,Spring提供了若干个子项目,每个项目用于完成特定的功能。而我们在项目开发时,一般会偏向于选择这一套spring家族的技术,来解决对应领域的问题,那我们称这一套技术为spring全家桶

而Spring家族旗下这么多的技术,最基础、最核心的是SpringFramework。其他的spring家族的技术,都是基于SpringFramework的,SpringFramework中提供很多实用功能,如:依赖注入、事务管理、web开发支持、数据访问、消息服务等等。

而如果我们在项目中,直接基于SpringFramework进行开发,存在两个问题:配置繁琐、入门难度大。

所以基于此呢,spring官方推荐我们从另外一个项目开始学习,那就是目前最火爆的SpringBoot。

通过springboot就可以快速的帮我们构建应用程序,所以springboot呢,最大的特点有两个

  • 简化配置
  • 快速开发

Spring Boot 可以帮助我们非常快速的构建应用程序、简化开发、提高效率 。

image
image

SpringBoot 几乎霸占了整个微服务市场, 所以,大家在日常工作学习过程中,还是要学习SpringBoot

接下来,我们就直接通过一个SpringBoot的web入门程序,让大家快速感受一下,基于SpringBoot进行Web开发的便捷性。🎯

总结

课堂作业

  1. 为什么要学习Springboot?(提示:定义和作用、市场占有率、企业招聘要求)
  2. Spring Boot最大的特点是什么?🎤

在创建SpringBoot之前,先要熟悉一下Maven的作用 Maven幻灯片

  1. Maven解决了什么问题?
  2. Maven的本地仓库中存的是什么?
  3. Maven中央仓库中有世界上所有的代码吗?

1.2 Boot入门程序 ✏️

入门程序

需求:基于SpringBoot的方式开发一个web应用,浏览器发起请求/hello后,给浏览器返回字符串 "Hello World ~"。

image-20231122163417687

代码操作

开发步骤

第1步:创建SpringBoot工程并添加启动类

第2步:定义HelloController类,添加方法hello,并添加注解

第3步:测试运行

背景介绍:

image
image

因此,需要使用maven方式创建Boot工程

Spring Boot 官方不再支持 Spring Boot 的 2.x 版本了,之后全力维护 3.x;而 Spring Boot 3.x 对 JDK 版本的最低要求是 17!

而国内主流JDK为:8和11,且企业大部分使用SpringBoot2.x的版本,因此需要通过Maven创建2.x的项目

1、创建一个项目

imageimage

image
image

2、检查Maven配置是否正确

image
image

3. 项目创建成功后,在pom.xml中添加<parent></parent>父依赖,企业中使用2.7.4以下版本较多

  <!-- springboot父工程-->
  <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.7.4</version>
      <relativePath/>
  </parent>

然后在引入依赖管理和插件

  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
            <!-- lombok的依赖,能免除get和set方法 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.28</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.7.4</version>
            </plugin>
        </plugins>
    </build>

4. 整体效果如下:image

保存刷新
保存刷新

5. 然后在src-java下创建包名cn.yangeit(也可以是你自己公司域名的反写),并在包下创建启动类 👇

package cn.yangeit;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
        System.out.println("项目启动成功!!!!");

    }
}


接下来,点击第二步。。

总结

课堂作业

  1. 参考上述操作,完成SpringBoot入门程序的创建

如果不清晰流程,可以点击下面的链接查看详细流程👇

点击查看完整的创建流程步骤open in new window笔记主打一个细!

  1. 完成后,尝试修改Boot程序的端口号

1.3 SpringBoot入门程序解析 🍐

入门程序我们已经搞定了,接下来,我们就一起来解析一下我们所编写的入门程序。

入门程序解析

Tomcat,是一个开源的Web应用服务器。 它可以看作是一个“小型网站服务器”,主要用于运行Java编写的网站

image
image

1. main方法如何启动Tomcat

image
image

因为我们在创建springboot项目的时候,选择了web开发的起步依赖 spring-boot-starter-web。而spring-boot-starter-web依赖,又依赖了spring-boot-starter-tomcat,由于maven的依赖传递特性,那么在我们创建的springboot项目中也就已经有了tomcat的依赖,这个其实就是springboot中内嵌的tomcat。

而我们运行引导类中的main方法,其实启动的就是springboot中内嵌的Tomcat服务器。 而我们所开发的项目,也会自动的部署在该tomcat服务器中,并占用8080端口号 。

image
image

1.4 SpringBoot进阶程序 ❤️ ✏️

SpringBoot进阶程序

访问boss直聘、百度等网站,发现返回的数据,不是简单的字符串,而是类似这样的,👇

测试api1:https://www.zhipin.com/wapi/zpCommon/data/getCityShowPositionopen in new window Boss招聘

测试api2:http://t.weather.itboy.net/api/weather/city/101200101open in new window 天气

image
image

上面这种特殊字符串叫做JSON,也就是说JSON实质上就是一条字符串,JSON只是一种文本规范,是企业中常用的前端后端交互的数据格式(文本规范)!!

下图是我们中州养老的部署图,发现,数据是来自数据库,数据库中的数据是一条条的,类似一个个对象,因此返回也是JSON格式 image

接下来,做一个案例,来体验SpringBoot项目的简便特性!!

代码操作

相关信息

  1. 创建User类,定义变量
  2. 根据HelloController的样子,创建UserController,将参数和返回值进行修改
  3. 运行测试,访问

创建User类,定义变量

@Data
public class User {
//    id,name,age,password,department,description,hobby
    private Integer id;
    private String name;
    private Integer age;
    private String password;
    private String department;
    private String description;
    private String hobby;
}

总结

课堂作业

  1. 为什么要学习JSON格式 🎤
  2. 参考笔记完成上述案例,体会SpringBoot将Java对象自动转成JSON文本

2. SpringBoot获得参数和数据响应 ✏️🍐

SpringBoot获得参数和数据响应

本节,我们主要讲解,如何接收页面传递过来的请求数据

  • 接收普通类型参数传递
  • 接收json数据参数
  • 接收路径参数

响应

  • 返回一般Json数据

请求参数获取实操

代码操作

简单参数 :在向服务器发起请求时,向服务器传递的是一些普通的请求数据。

参数格式:http://localhost:8848/users/simpleParam?name=韩立&age=188

路径上的参数名字和方法的形参必须一模一样,类型也要一致

操作步骤流程: 👇👇

image
image

响应数据实操

SpringBoot工程,Controller中的方法返回值对象,自动转成了Json字符串

image
image

总结

课堂作业

  1. 根据上述提示,完成路径参数和普通参数的传值,可以参考上述的代码🎤
  2. 结合入参和返回值转换,再次谈谈SpringBoot的好处!

3. Spring核心概念 🍐

Spring核心概念

之前我们在编写代码时,需要什么对象,就直接new一个就可以了。 这种做法呢,层与层之间代码就耦合了,费时间且不方便,最好是拿来就用!! 有点像 饭来张口衣来伸手!那么得这么做:

1). 不能使用new对象

2). 应用程序中用到这个对象,就直接从容器中获取,不需要创建

我们想要实现上述解耦操作,就涉及到Spring中的两个核心概念:

  • 控制反转: Inversion Of Control,简称IOC

对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。 对象的创建权由程序员主动创建转移到容器(由容器创建、管理对象)。这个容器称为:IOC容器或Spring容器

  • 依赖注入: Dependency Injection,简称DI

容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。

程序运行时需要某个资源,此时容器就为其提供这个资源。

IOC容器中创建、管理的对象,称之为:bean对象

image
image

总结

课堂作业

  1. 结合下图,说说什么IOC,以及IOC有什么好处?🎤
看看这张图,联想一下这样的好处
看看这张图,联想一下这样的好处

4. SpringBoot集成Mybatis框架 ❤️🍐 ✏️

SpringBoot下集成Mybatis框架

1.定义

MyBatis
MyBatis

MyBatis 是一个持久层框架,用于简化 Java 应用程序与关系型数据库的交互。它通过将 SQL 语句与 Java 代码进行映射,提供了一种方便且灵活的方式来访问和操作数据库

中文网open in new window

2.SpringBoot下集成Mybatis

如果了解Mybatis的作用和地位,那么可以进行Mybatis初体验了!!👇

在体验之前,需要做如下准备工作:

  1. 项目工程创建完成后,在pom.xml文件中的dependencies标签内,导入Mybatis的起步依赖和MySQL驱动依赖

点击查看详细步骤open in new window

<!-- lombok的依赖,能免除get和set方法 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.28</version>
</dependency>
<!-- mybatis的起步依赖 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.3.0</version>
</dependency>

<!-- mysql驱动包依赖 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>




2.Idea链接Mysql

按照下图,连接数据库:👇

image
image
  1. 创建mybatis数据库,设置编码为utf-8mb4,创建user表,并导入一下假数据
-- 创建数据库 mybatis
create database if not exists mybatis;
-- 使用此数据库
use mybatis;
-- 删除原有的user表
DROP TABLE IF EXISTS `user`;
-- 创建user表
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL UNIQUE,
  `password` varchar(32) NOT NULL DEFAULT '12345678',
  `age` int(10) NOT NULL,
  `hobby` varchar(50) DEFAULT NULL,
  `description` varchar(200) NOT NULL,
  `department` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('8', '赵灵儿', '12345678', '20', '阵法、法术修炼', '纯真善良的女子,拥有强大的阴阳之力', '阴阳家');
INSERT INTO `user` VALUES ('9', '楚留香', '12345678', '32', '剑术、侠义行侠', '风流倜傥的豪客,以智慧和剑术征服江湖', '江湖人士');
INSERT INTO `user` VALUES ('10', '白浅', '12345678', '26', '宫廷舞蹈、仙法修炼', '美丽高贵的仙子,守护爱与正义的力量', '青丘派');
INSERT INTO `user` VALUES ('11', '苏明玉', '12345678', '29', '医术、家族事务', '聪明伶俐的女医生,心系家族兴衰', '苏家');
INSERT INTO `user` VALUES ('13', '李逍遥', '12345678', '28', '剑术、侠义行侠', '潇洒自如的剑客,为爱与正义奋斗', '天墉城');
INSERT INTO `user` VALUES ('14', '陆展元', '12345678', '31', '龙族法术、海洋探险', '勇敢善良的龙族王子,探索海洋奥秘', '东海龙宫');
INSERT INTO `user` VALUES ('18', '萧炎', '12345678', '25', '功夫、修炼', '机缘巧合下拥有强大火焰之力的少年', '草庙村');
INSERT INTO `user` VALUES ('19', '陆九淳', '12345678', '29', '家族事务、剑术修炼', '家族责任重于一切的江湖少年', '陆家');
INSERT INTO `user` VALUES ('20', '韩立', '12345678', '22', '灵力修炼、阵法研究', '机智聪明的年轻修士,掌握神奇的法术', '韩家');
INSERT INTO `user` VALUES ('21', '顾惜朝', '12345678', '28', '法术修炼、守护门派', '心地善良的女子,为守护门派而战', '古玄门');
INSERT INTO `user` VALUES ('22', '九霄真人', '12345678', '35', '仙法修炼、教导弟子', '威严正直的仙人,指导后辈修仙道路', '蓝霞宫');
INSERT INTO `user` VALUES ('23', '姬昌', '12345678', '33', '阴阳术、仙法修炼', '智勇双全的江湖人物,掌握阴阳之力', '太阴派');
INSERT INTO `user` VALUES ('24', '西门吹雪', '12345678', '30', '剑术、侠义行侠', '风流倜傥的剑客,执着追求剑道境界', '独孤家');
INSERT INTO `user` VALUES ('25', '夏冰', '12345678', '26', '魔法修炼、冰雪之力', '美丽神秘的女子,掌握冰雪之力', '幻冥宗');
INSERT INTO `user` VALUES ('26', '杨影枫', '12345678', '27', '暗器、侠义行侠', '冷酷无情的刺客,为正义而战', '影家');
INSERT INTO `user` VALUES ('27', '白素素', '12345678', '24', '文学创作、人界事务', '善良纯真的女子,用文字记录人间百态', '人界');
INSERT INTO `user` VALUES ('28', '独孤剑', '12345678', '32', '剑术、侠义行侠', '心系家族的剑客,剑法高超', '独孤家');
INSERT INTO `user` VALUES ('29', '楚九霄', '12345678', '28', '阵法、家族事务', '机智聪明的年轻人,心系家族荣耀', '楚家');
INSERT INTO `user` VALUES ('30', '谢晓峰', '12345678', '31', '拳脚功夫、江湖恩怨', '正直勇敢的江湖豪杰,忠于兄弟情义', '铁血帮');
INSERT INTO `user` VALUES ('31', '叶孤城', '12345678', '29', '剑术、侠义行侠', '冷酷无情的剑客,追求剑道极致', '武境城');
INSERT INTO `user` VALUES ('32', '李逸风', '12345678', '25', '修炼、探险', '热血青年,勇往直前探索未知世界', '蓝枫大陆');
INSERT INTO `user` VALUES ('33', '萧霜', '12345678', '27', '冰雪法术、守护宗门', '冷艳高傲的女子,守护冰霜宗的利益', '冰霜宗');
INSERT INTO `user` VALUES ('34', '楚玉峰', '12345678', '30', '家族事务、阵法修炼', '机智聪明的年轻人,家族责任重于一切', '楚家');
INSERT INTO `user` VALUES ('35', '陆雪琪', '12345678', '24', '法术、修行', '美丽冷傲的仙子,修炼法术追求修行境界', '青云门');
INSERT INTO `user` VALUES ('36', '明月心', '12345678', '26', '琴音、舞蹈', '温柔善良的女子,以音乐传递爱与希望', '云裳派');
INSERT INTO `user` VALUES ('37', '程灵素', '12345678', '27', '仙法修炼、仙岛事务', '温柔善良的仙子,守护仙岛和平', '蓬莱仙岛');
INSERT INTO `user` VALUES ('38', '韩非', '12345678', '23', '学术研究、阵法修炼', '聪明睿智的年轻人,研究阵法和学术', '韩家');
INSERT INTO `user` VALUES ('40', '戚芳', '12345678', '23', '武功、家族事务', '机智勇敢的女子,为家族荣誉而战', '戚家');
INSERT INTO `user` VALUES ('41', '楚轩辕', '12345678', '28', '家族事务、剑术修炼', '家族责任重于一切的剑客', '楚家');
INSERT INTO `user` VALUES ('42', '秦王', '12345678', '35', '政务、战争', '智勇双全的帝王,统一六国的志向', '秦国');
INSERT INTO `user` VALUES ('43', '李寻欢', '12345678', '30', '剑术、侠义行侠', '聪明机智的江湖人物,正义心十足', '大宛城');
INSERT INTO `user` VALUES ('44', '唐三藏', '12345678', '45', '佛法修行、西行取经', '慈悲心肠的高僧,带领徒弟西天取经', '大唐');
INSERT INTO `user` VALUES ('45', '吴青烟', '12345678', '26', '法术修行、江湖事务', '冷艳高傲的女子,修炼法术追求江湖大业', '青云门');

  1. 根据数据库表结构,创建User类,属性和数据库user表的字段对应
image
image
  1. 在application.yml配置文件下(如果没有在resources下创建即可),配置数据库信息(驱动、链接、用户名、密码)

配置文件后缀名.yaml .yml都可以 点击查看详细步骤open in new window

# 顶格写
spring:
  #数据库连接信息
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
    username: root
    password: 1234
#Mybatis配置
mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true
  1. 创建UserMapper接口,添加@Mapper注解
@Mapper
public interface UserMapper{

}


 





需求1:查询id为30的用户,返回浏览器可以先自己分析

点击查看详细步骤
  1. 在UserMapper接口中,创建getById方法,并且在方法上添上注解@Select,写上sql语句。
mapper
mapper
  1. 在UserController.java中自动注入UserMapper接口的代理对象,并在getById方法中调用这个对象的getById方法,输出结果。
image
image
  1. 重新启动程序,访问http://localhost:8848/user?id=30open in new window 观察返回值是否为JSON格式。
image
image

需求2:查询名字叫 陆雪琪的用户,返回浏览器

点击查看详细步骤
  1. 在UserMapper接口中,创建selectByName方法,并且在方法上添上注解@Select,写上sql语句。
image
image
  1. 在UserController.java中自动注入UserMapper接口的代理对象,并在selectByName方法中调用这个对象的selectByName方法,输出结果。

  2. 重新启动程序,访问http://localhost:8080/selectbyname?name=陆雪琪open in new window 观察返回值是否为JSON格式。

需求3:爱好中含有 "法术" 的用户,返回浏览器

点击查看详细步骤
  1. 在UserMapper接口中,创建selectLikeName方法,并且在方法上添上注解@Select,写上sql语句。

  2. 在UserController.java中自动注入UserMapper接口的代理对象,并在selectLikeName方法中调用这个对象的selectLikeName方法,输出结果。

  3. 重新启动程序,访问http://localhost:8080/selectlikename?hobby=法术open in new window 观察返回值是否为JSON格式。

点击查看流程open in new window

需求4:删除用户为 韩立的用户,返回 ok 字符串

点击查看详细步骤
  1. 在UserMapper接口中,创建deleteByName方法,并且在方法上添上注解@Delete,写上sql语句。

  2. 在UserController.java中自动注入UserMapper接口的代理对象,并在deleteByName方法中调用这个对象的deleteByName方法,输出结果。

  3. 重新启动程序,访问http://localhost:8080/deleteByName?name=韩立open in new window 观察返回值是否为JSON格式。

需求5:将id为36的用户,hobby修改为 听焱哥上课,返回 ok 字符串

点击查看详细步骤
  1. 在UserMapper接口中,创建updateById方法,并且在方法上添上注解@Update,写上sql语句。

  2. 在UserController.java中自动注入UserMapper接口的代理对象,并在updateById方法中调用这个对象的updateById方法,输出结果。

  3. 重新启动程序,访问http://localhost:8080/updatebyid?id=36&hobby=听焱哥上课open in new window 观察返回值是否为JSON格式。

总结

课堂作业

  1. 如果你完成上面的5个需求,那么你掌握了SpringBoot集成Mybatis的操作 🎤
  2. SQL语句是程序员必备的,请完成下列10条sql语句的编写