SpringBoot及其拓展

本文介绍了如何在SpringBoot项目中整合Mybatis,包括添加依赖、配置数据源、创建Mapper接口和Controller、单元测试,以及实战案例如根据ID和条件查询数据。涵盖了启动流程、常见问题解决和测试用法。

一,SpringBoot

–1,概述

是由Spring团队开发的,整合了Spring框架,SpringMVC框架的所有jar包.
好处:
1.简化了Maven的操作,以前自己找jar包的坐标,现在直接创建springboot工程勾选你要的功能
2.SpringBoot项目可以快速启动/关闭,就是像服务器(Tomcat)一样的操作.被整合了
3.简单快速整合其他技术

–2,使用

1.创建SpringBoot项目–配置Maven
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

2.启动服务器,并且访问服务器里的资源
3,添加类

package cn.tedu.cgb2108boot01;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class Hello {
    @RequestMapping("abc")
    public String get(){
        return "hello boot~";
    }
}


4,打开浏览器测试
http://localhost:8080/abc
修改pom.xml
添加SpringBoot的依赖包

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>cn.tedu</groupId>
  <artifactId>jkboot</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
   <parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.4.2</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<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>
	</dependencies>

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

</project>

创建RunApp.java
SpringBoot使用了全新的运行方式,两句话,直接执行main方法,默认启动tomcat中间件,端口为8080。

注意:类必须放在其他类的父级目录,它底层使用了包扫描机制,扫描的要求只扫描本类所在的目录极其子目录。

package cn.tedu.jk;

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

@SpringBootApplication  //标识为springboot项目
public class RunApp {
	public static void main(String[] args) {
		//全新的启动方式,执行run方法会自动启动集成的tomcat中间件
		SpringApplication.run(RunApp.class, args);
	}
}

创建HelloController.java
目前市场主流已经采用注解方式进行开发

package cn.tedu.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController//接受浏览器的请求 并返回json数据
public class HelloController {
//	@RequestMapping("hi")//只匹配一个路径
	@RequestMapping({"hi","hello/hi"})//匹配两种路径/hi或者/hello/hi
	public String hi() {
		return "hi springboot!";
	}
}

启动Tomcat WebServer
ApacheTomcat是一个非常著名的web中间件,于之前学习的技术的不同在于它提供了web程序的容器环境,专门用于网站服务。

SpringBoot默认集成了tomcat中间件,会自动把项目打包jar发布到tomcat,这样我们就形成了自己的网站。但这个网站只能局域网访问,如果外网(广域网),自己购买一个网站,部署上去即可。
在这里插入图片描述
注意:不用服务时,关闭tomcat服务
在这里插入图片描述
url解析:

  • localhost代表本机,等价于ip:127.0.0.1
  • 8080代表本机的服务,tomcat默认端口8080
  • /hi等请求地址在一个web服务中请求具有唯一性(多个就没法区分了)

SpringBoot整合Mybatis

创建项目
在这里插入图片描述
修改pom.xml文件
说明: 在新项目中添加依赖信息

 <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>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--引入插件lombok 自动的set/get/构造方法插件  -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--mybatis依赖包-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

        <!--jdbc依赖包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

    </dependencies>

代码结构
在这里插入图片描述

SpringBoot整合Mybatis

编辑application.yml

#配置端口号
server:
  port: 8090

#管理数据源
spring:
  datasource:
    #高版本驱动使用
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    #设定用户名和密码
    username: root
    password: root

#SpringBoot整合Mybatis
mybatis:
  #指定别名包
  type-aliases-package: com.jt.pojo
  #扫描指定路径下的映射文件
  mapper-locations: classpath:/mybatis/mappers/*.xml
  #开启驼峰映射
  configuration:
    map-underscore-to-camel-case: true

将Mapper接口交给容器管理
通过@Mapper注解 管理对象

@Mapper //将Mapper接口交给Spring容器管理.
public interface UserMapper {

    List<User> findAll();
}

通过包扫描的方式,管理mapper接口 编辑主启动类, 指定包扫描路径

@SpringBootApplication
//按照指定的包路径,扫描mapper的接口管理对象
@MapperScan("com.jt.mapper")
public class SpringbootSsmApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootSsmApplication.class, args);
    }
}

Mybatis 单元测试案例

@SpringBootTest
class SpringbootSsmApplicationTests {

    @Autowired  //注入指定的对象
    private UserMapper userMapper; //IDEA 编译提示 不影响执行

    /**
     * 测试SpringBoot整合Mybatis
     */
    @Test
    public void testfindAll(){
        List<User> userList = userMapper.findAll();
        System.out.println(userList);
    }
}

关于Mapper接口对象的说明

在这里插入图片描述

解释:

  1. 将接口交给Spring容器管理,spring会根据class类型,动态的选择创建代理对象. 最终将代理对象交给spring容器管理.
    在这里插入图片描述
  2. 代理对象的使用
    在这里插入图片描述

代理方式介绍

JDK动态代理
特点:

  1. 要求被代理者,必须有接口.
  2. 默认条件下如果有接口,则使用JDK动态代理

CGLIB动态代理
特点:
1.不管被代理者是否有接口,都可以为其创建代理对象.
2. 代理对象是目标对象的子类. 继承关系.

结论:
1.Spring中如果有接口,默认使用JDK代理方式,如果没有接口,则默认使用CGLIB代理方式.
2.Spring5以后,自身接口对象创建代理对象时,使用cglib

SSM框架案例

SSM是SpringMVC,Spring,Mybatis的简称
业务需求
用户访问URL: http://localhost:8090/findAll
返回值: List 的JSON串.

框架关系图
在这里插入图片描述
层级代码实现
在这里插入图片描述
编辑UserController

@RestController  //@ResponseBody 将list集合转化为json
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * URL: http://localhost:8090/findAll
     * 参数: 无
     * 返回值: List<User>
     */
    @RequestMapping("/findAll")
    public List<User> findAll(){

        return userService.findAll();
    }
}

编辑UserService

@Service
public class UserServiceImpl implements UserService{

    @Autowired
    private UserMapper userMapper;


    @Override
    public List<User> findAll() {

        return userMapper.findAll();
    }
}

编辑UserMapper
1.mapper接口

public interface UserMapper {

    List<User> findAll();
}

2.mapper映射文件

<mapper namespace="com.jt.mapper.UserMapper">

    <!--必须配置别名包-->
    <select id="findAll" resultType="User">
        select * from demo_user
    </select>
</mapper>

页面效果展现
在这里插入图片描述

框架代码案例练习

根据ID查询数据

需求说明
根据Id查询数据库
URL: http://localhost:8090/findUserById?id=1
返回值: User对象
编辑UserController

 /**
     * 需求: http://localhost:8090/findUserById?id=1
     * 参数接收: id=1
     * 返回值: User对象
     */
    @RequestMapping("/findUserById")
    public User findUserById(Integer id){

        return userService.findUserById(id);
    }

编辑UserService

@Override
    public User findUserById(Integer id) {

        return userMapper.findUserById(id);
    }

编辑UserMapper

//注解和映射文件只能二选一
    @Select("select * from demo_user where id = #{id}")
    User findUserById(Integer id);

页面效果展现
在这里插入图片描述

根据age和sex查询数据

业务需求
URL: http://localhost:8090/findUserByAS
返回值: List集合封装.
编辑UserController

 /**
     * URL地址: http://localhost:8090/findUserByAS?age=18&sex=女
     * 参数:  age=18  sex=女
     * 返回值: List<集合>
     * 参数接收: 如果是多个参数,并且参数名称与属性名称一致,可以使用对象接收
     */
    @RequestMapping("/findUserByAS")
        public List<User> findUserByAS(User user){

            return userService.findUserByAS(user);
    }

编辑UserService

@Override
    public List<User> findUserByAS(User user) {

        return userMapper.findUserByAS(user);
    }

编辑UserMapper
在这里插入图片描述

RestFul参数传递

业务需求
说明: 要求按照id修改数据
restFul请求路径: http://localhost:8090/updateById/1/黑熊精/3000/男

编辑UserController

/**
     * URL:  http://localhost:8090/updateById/1/黑熊精/3000/男
     * 参数: 4个
     * 返回值: "修改成功!!!!"
     * restFul结构 参数分析 {属性名称}
     * 参数接收:
     *      1. 单个参数使用 @PathVariable Integer id接收
     *      2. 如果多个参数接收 使用对象 mvc自动提供的功能.
     */
    @RequestMapping("/updateById/{id}/{name}/{age}/{sex}")
    public String updateById(User user){

        userService.updateById(user);
        return "用户修改成功";
    }

编辑UserService

 //spring整合mybatis之后,事务自动提交.
    @Override
    public void updateById(User user) {

        userMapper.updateById(user);
    }

编辑UserMapper

@Update("update demo_user set name=#{name},age=#{age},sex =#{sex} where id=#{id}")
    void updateById(User user);

扩展

执行过程

在这里插入图片描述
url 的解析执行过程:

浏览器输入的url,就会被解析后传入web中间件(/hi),web中间件再会进一步的解析,找到对应的Controller的某个注解里对应的url @RequestMapping({"/","/hi"}) ,从而就找到HelloController的hi()方法。最终利用反射执行这个类的方法(将来这个方法中就用来编写实现业务逻辑代码)。因为使用了@RestController,返回的String字符串对象底层会使用jackson工具类转换java对象为json字符串,返回给浏览器,浏览器将字符串回显(展示)在页面上。

常见问题:8080端口冲突

Tomcat服务不会自动关闭,需要手动关闭,如不关闭,下次启动就会报下面错误:

port 8080 was already in use. 端口8080已经被占用。关闭服务,重新启动即可。
在这里插入图片描述
仍未解决的话,以下三种方式任选一个来测试.
1,需要执行DOS命令处理:

C:\Users\lpx>netstat –ano  --查看所有端口号,找到8080端口对应的PID号
C:\Users\lpx>taskkill -pid 688 –f --杀死688进程号 

2,可能是因为电脑里安装过Oracle数据库:

要找到Oracle的服务OracleXETNSListener,停掉.

3,直接使用yml方式配置修改端口号:
在src/main/resources下添加application.yml文件,内容如下:

server:
  port: 8090

清除项目缓存,再次重启服务,测试即可: http://localhost:8090/hello/hi
在这里插入图片描述

@SpringBootTest

问题分析

需求: 有时在执行测试方法时,必须编辑大量的Controller等代码,虽然可以测试成功,但是显得繁琐.
核心机制: 让Spring容器启动并且为对象提供服务.

@SpringBootTest

说明: SpringBoot为了测试方便专门开发了@SpringBootTest 主要的作用就是启动Spring容器. 完成测试案例.

注意事项: 测试类应该在测试包下完成,并且在主启动类的同包及子包中编辑.
在这里插入图片描述

@SpringBootTest 用法

package com.jt.test;

import com.jt.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * 注意事项: 测试代码必须在主启动类的同包及子包中编辑
 * @SpringBootTest用法说明:
 *      只要在该类中 执行@Test测试方法,则就会启动Spring容器.
 */
@SpringBootTest
public class TestUserDemo {

    @Autowired
    private User user;

    /**
     * 测试方法要求:
     *  1.不能有返回值 必须为void
     *  2.不能携带参数
     *  3.测试方法名称  不能叫test
     */
    @Test
    public void testUser1(){
        System.out.println(user);
    }

}

Apache Tomcat

Web中间件历史

最早的网站技术是Apache,但它只支持html。当微软推出asp技术后,第一代动态网站技术诞生,微软同时推出了ISS以支持asp技术。随着sun公司的j2ee架构横空出世,提出第二代动态网站技术规范servlet、jsp后,servlet容器就如雨后春笋。Tomcat、Jetty、GlassFish、JBoss、WebSpare、WebLogic,后三者非常厉害,性能超群,但由于昂贵的费用及微服务新架构的兴起,而开始没落,Jetty一直号称性能远胜Tomcat,但Tomcat的霸主地位已经难以撼动(就像编程语言中的java)。目前市场主流都采用Tomcat,特别国内一线互联网企业,而国企采用WebSpare和WebLogic居多。

servlet-api.jar

我们按sun公司的java规范写的servlet(HttpServlet)就专门支持网站的请求request(HttpServletRequest)和响应response(HttpServletResponse)的处理。

各大web中间件厂商按照servlet规范做自己的实现如tomcat的servlet-api.jar。
在这里插入图片描述
注:我们的关注点在于实现项目,这里会使用tomcat,初步了解底层结构,不必过渡深入研究。

Git忽略特殊目录和文件

gitignore

在git工作空间的根目录下创建文本文件 .gitignore git忽略,配置如下:

.gitignore

*.class

#maven ignore
target/*

#eclipse ignore
.settings/
.project
.classpath

注意:target临时目录配置了不生效

git rm -r --cached . #把本地缓存删除(改变成未track状态),然后再提交

通过变通方式暂时解决:配置 *.class,禁止上传class文件

扩展:请求响应过程

HTTP协议

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML文件、图片文件、查询结果等)。

执行过程

怎么浏览器输入url就可以找到我们写的controller进行执行并且返回呢?

其实这底层是有一套标准的,这个标准称为HTTP协议。我们浏览器成输入的http://这就代表执行http协议。
在这里插入图片描述
谷歌浏览器查看请求响应信息
在这里插入图片描述
头信息
在这里插入图片描述
响应头
在这里插入图片描述
请求头
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值