zoukankan      html  css  js  c++  java
  • SpringBoot图文教程「概念+案例 思维导图」「基础篇上」

    有天上飞的概念,就要有落地的实现

    • 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例

    • 每个知识点配套自测面试题,学完技术自我测试

    • 本文初学向,所以希望文中所有的代码案例都能敲一遍

    大哥大姐新年好,点赞转发不要少

    **文本已收录至GitHub开源仓库 Lu_JavaNodes 码云仓库地址Lu_JavaNodes ,**包含教程涉及所有思维导图,案例代码和后续讲解视频,欢迎Star增砖添瓦。

    前言

    庚子鼠年,封村儿,在试过了睡觉,打麻将,做凉皮,做蛋糕之后,我不由的陷入了对人生和社会的大思考

    两年的开发经验和三年的大数据讲师经验告诉我,是时候写些什么了,我也早觉得有写些东西的必要了。我向来是不惮以最多的无聊揣测这个假期的,但我没想到……(不能再往下了,再往下真就算抄袭了)

    于是决定将自己的的毕生功力汇聚整理成册,写出《图文教程》系列Java技术学习秘籍,本功法力求 『图文并茂』 『简单易懂』,概念和代码实践相结合,每个知识点辅助以自测面试题,希望大家通过本系列教程能够快乐学Java,从练气到飞升。

    本期选择的技术是SpringBoot,SpringBoot 现如今已是Java程序员的必备修炼功法,具备SpringBoot大成的开发功力,才能行走江湖,纵横大厂小派而不惧需求。

    在正式开始学习之前,先通过思维导图了解本教程的功法纲要

    简单说明,教程分为基础篇,进阶篇和高级篇

    • 基础篇,本章力求简单快速的掌握基本的SpringBoot使用,并应用到项目中

    • 进阶篇,学会SpringBoot更多的常见用法以及底层原理

    • 高级篇,着重介绍SpringBoot的与各大场景的整合使用

    环境要求

    • 开发工具 IDEA 版本不限

    • maven3.x

    • jdk1.8

    • 本教程采用SpringBoot 2.0.3.RELEASE

    本文学习目标

    • 认识SpringBoot

    • 掌握 通过 SpringBoot 搭建web环境

    • 掌握 SpringBoot + Mybatis + Mysql 实现增删改成的能力

    • 掌握 SpringBoot 测试的使用

    SpringBoot是啥

    为啥用这玩意儿

    SpringBoot优点很多,对提升开发速度有很大帮助,我们通过配置文件说明一下SpringBoot的优秀。

    回想往昔,在我刚毕业的时候,在一家跨境电商企业开发管理系统,这个项目采用的最传统的SSM架构,在这个项目中充斥着大量的配置文件,什么是大量呢?举个栗子,如下图

    **上图是什么呢?**用SSM写一个增删改差的最少配置。

    朋友萌,你萌想想,功能代码都没开始写,就要先写这么一堆配置,完了还不知道写的对不对,再多想想,如果你还要做权限管理,Redis,消息队列,你还需要写多少配置???这样的开发效率 想死

    不过不要慌,只要你学会了SpringBoot,通过SpringBoot 技术上面的配置文件 一个都不写,一个都不写,一个都不写

    oh my god 这么好的技术,不学就是亏啊!不多说,我们一起来学它 学它 学它。

    SpringBoot 简介

     

    Tips:本小节是SpringBoot的介绍和特点,如果想感受SpringBoot的魅力,可跳过直接阅读 第二章节 10分钟用上SpringBoot

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。

    你可以认为:springboot(微框架) = springmvc(控制器) + spring(项目管理)

    特点如下

    • 创建独立的Spring应用程序
    • 使用嵌入的Tomcat,应用无需打成war包
    • 简化Maven配置,starters自动配置和版本控制
    • 大量自动配置,简化开发
    • 无需xml配置,开箱即用

    简介和特点不需特别在意,在教程中会逐个详细讲解

    10分钟用上SpringBoot(第一个demo)

    10分钟用上SpringBoot 代码案例

    本节开始第一个demo的编写,准备好你的IDEA,SpringBoot 要来喽。

    demo需求

    • 使用SpringBoot搭建 web 环境

    • 创建UserController类,类中定义 getUser() 方法 该方法会以Json的方法返回一句话:SpringBoot 真香。

    • 运行项目能够请求到该方法 并得到响应数据

    Tips:案例代码 见 GitHub 和 码云仓库

    1.用IDEA创建一个空的maven项目 完善项目结构

    2.在 pom.xml 中写入 SpringBoot 的依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <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>com.lu</groupId>
        <artifactId>boot-hello</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <!--继承springboot的父项目-->
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.3.RELEASE</version>
        </parent>
    
        <dependencies>
            <!--引入springboot的web支持-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    
    
    </project>
    
    

    3.编写SpringBoot的启动类 【SpringBoot项目的特点】可以启动Spring Boot项目

    启动类的位置

    启动类代码如下

    /**
     * 启动类规则
     * 1.启动类位置:主包下面和子包同级
     * 2.需要一个@SpringBootApplication
     */
    @SpringBootApplication
    public class AppRun {
        public static void main(String[] args) {
    //        参数:启动类类对象 主函数形参名
            SpringApplication.run(AppRun.class,args);
        }
    }
    

    4.编写 application配置文件

    Tips:通过配置文件可以做端口号,项目名等

    配置文件规则

    1. 配置文件名字必须叫application

    2. 配置文件的格式有三种

      1. properties

      2. yml

      3. yaml

    配置文件位置

    配置文件内容

    5.编写 UserController

    6.通过启动类 启动项目

    项目正确启动 日志如下

    通过日志 可以知道 项目启动在了8802 端口, 项目名(context path) 为空

    7. 打开浏览器 访问地址:http://localhost:8802/getUser

    第一个demo 总结 代码详解

    恭喜你,我知道你肯定已经完成了第一个demo的效果,但是估计会有些懵逼,咋就跑起来了呢?为什么没用的Tomcat?pom文件配置的是啥?启动类写的又是啥?

    朋友,不要慌,鹿老师一个个给你解释。

    SpringBoot的特点

    为什么不需要Tomcat呢?这就是SpringBoot的优点之一啊,可以回忆一下简介部分SpringBoot的特点。如果想不起来,不用翻找,贴心的鹿老师又写了一遍

    1. 创建独立的Spring应用程序

    2. 使用嵌入的Tomcat,应用无需打成war包

    3. 简化Maven配置,starters自动配置和版本控制

    4. 大量自动配置,简化开发

    5. 无需xml配置,开箱即用

    之所以不需要 单独安装Tomcat 是因为SpringBoot使用嵌入的Tomcat,所以SpringBoot的项目直接就可以运行起来。

    pom文件依赖配置详解

    简化Maven配置,starters自动配置和版本控制

    不使用SpringBoot搭建web环境,少说也要导入七八个依赖,但是如果没有记错的话,demo的开发只用到了一个依赖,有点不要太少,why?

    先来说明 pom写的第一个配置 parent 父项目

    <!--继承springboot的父项目-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
    </parent>
    

    这个配置项目是一种声明,用来管理 SpringBoot 的应用的版本

    啥意思嘞?

    朋友,回想一下,导入的依赖是啥?

    <!--web相关依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    

    spring-boot-starter-web 就是我们导入的第二个依赖,除了名字有点长以外,最特别的是没有写版本号,但是没有影响依赖的下载,因为 spring-boot-starter-web 用的是 父项目 的版本号 2.0.3.RELEAS。

    这就是 父项目的作用,以后我们导入依赖默认是不需要写版本号的。

    版本号不写了,但是 **为什么一个依赖就够了?**因为启动器

    什么是启动器,看一下 spring-boot-starter-web 这个很长的名字,这个名字需要注意的是前三个单词 spring-boot-starter 凡是以这三个字母开头的依赖我们都称之为 starters(启动器)。

    Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器。

    举个栗子: spring-boot-starter-web web场景启动器 SpringBoot将所有web项目开发能够用的依赖都写到了这个启动器中,这样导入启动器就拥有了开发web项目需要用到的所有依赖。

    综上所述,同理:

    • 使用Redis 会有一个叫 spring-boot-starter-redis 的启动器
    • 使用 ES 会有一个 叫 spring-boot-starter-data-mongodb 的启动器
    • 等一百多个

    启动类讲解

    /**
     *  @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
     */
    @SpringBootApplication
    public class AppRun {
    
        public static void main(String[] args) {
    
            // Spring应用启动起来
            SpringApplication.run(HelloWorldMainApplication.class,args);
        }
    }
    

    如果说我们的项目是一个火箭的话,这个类的 main函数 就是火箭的发射按钮,运行 main方法 就运行了项目。

    Tips:关于启动类的实现原理以及配置文件的更多用法,在进阶篇详细讲解。

    SpringBoot + Mybatis + 测试 实现增删改查

    接着 demo 继续往下写 集成Mybatis

    准备工作

    库表准备

    在mysql数据库中 按照 sql 创建表

    SET NAMES utf8;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for t_user
    -- ----------------------------
    DROP TABLE IF EXISTS `t_user`;
    CREATE TABLE `t_user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `username` varchar(255) DEFAULT NULL,
      `password` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of t_user
    -- ----------------------------
    BEGIN;
    INSERT INTO `t_user` VALUES (1, 'zhangsan', '123456');
    INSERT INTO `t_user` VALUES (2, 'lisi', '123456');
    COMMIT;
    
    SET FOREIGN_KEY_CHECKS = 1;
    

    实体类准备

    在boot-hello项目的com.lu.entity包中写入实体类

    public class User {
        private Integer id;
        private String username;
        private String password;
    
        //get set 方法省略....
    }
    

    resources 下创建mappers目录(放置mapper文件)

    集成Mybatis

    1.导入依赖

    <!--       SpringBoot 集成 Mybatis的 启动器-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>
    <!--        数据源-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.0.19</version>
            </dependency>
    <!--        mysql驱动-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.38</version>
            </dependency>
    

    说明:由于springboot整合mybatis启动器中会默认依赖mybatis 因此不需要单独引入mybati版本,否则会出现冲突

    2.配置application配置文件

    需要写入两种配置

    • 数据库的相关参数
    • Mybatis的mapper文件地址的配置
    #数据源配置
    #指定驱动
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    #指定url
    spring.datasource.url=jdbc:mysql://localhost:3306/boot
    #指定用户名
    spring.datasource.username=root
    #指定密码
    spring.datasource.password=123456
    #指定连接池类型
    spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    
    #Mybatis的配置 配置mapper文件的地址
    mybatis.mapper-locations=classpath:mappers/*Mapper.xml
    

    说明一下mapper-locations这个配置 如图

    3.在启动类上添加 扫描dao接口的注解

    4.开发DAO接口以及Mapper

    public interface UserDao {
        List<User> findAll();
    }
    

    mapper文件内容

    <?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.lu.dao.UserDao">
        <select id="findAll" resultType="com.lu.entity.User">
            select * from t_user
        </select>
    </mapper>
    

    现在代码写完了,作为一个拥有良好习惯的程序员,我应该测试一下dao接口中的查询方法能不能正常使用,但是,貌似需要运行项目在controller中调用,才能测试。

    no no no 其实不需要,SpringBoot 可以 非常非常非常 方便的集成单元测试,接下来我们就用 SpringBoot Test 来测试一下我们的查询方法。

    5. 引入SpringBoot测试依赖

    <!--        测试依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    

    6.编写测试类

    测试类的位置

    测试类内容

    /**
     * @SpringBootTest(classes = {AppRun.class}) 参数为启动类的类对象
     */
    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = {AppRun.class})
    public class TestUserDao {
        @Autowired
        private UserDao userDao;
    
        /**
         * 测试查询方法
         */
        @Test
        public void test1(){
            List<User> all = userDao.findAll();
    //        打印查询结果
            for (User user : all) {
                System.out.println(user);
            }
        }
    }
    

    运行测试类 结果如下

    基础篇上总结

    恭喜你完成了本章的学习,恭喜你掌握了通过SpringBoot+Mybatis 实现增删改成的能力。为你鼓掌!

    让我们再次回顾本文的学习目标

    • 认识SpringBoot
    • 掌握 通过 SpringBoot 搭建web环境
    • 掌握 SpringBoot + Mybatis + Mysql 实现增删改成的能力
    • 掌握 SpringBoot 测试的使用

    要掌握SpringBoot更多的用法,请持续关注本系列教程。

    下面体贴的我给朋友萌还准备了一些 自测面试题和项目案例,希望你能够成热打铁,将知识夯扎实。

    自测面试题(答案见下期)

    • 什么是 Spring Boot?

    • 为什么要用 Spring Boot?

    • Spring Boot 需要独立的容器运行吗?

    • 你如何理解 Spring Boot 中的 Starters?

    • SpringBoot 项目如何集成 Mybatis?

    自测实现项目小案例(答案见下期)

    Tip:在我的计划中,更新完 SpringBoot 图文教程系列 之后 将会更新 SpringBoot微服务电商后台管理系统实战开发图文教程

    文后所有项目小案例的库表均来自该项目,通过精心设计,环环相扣,通过小案例的铺垫,后续可以直接与 微服务实战开发教程 无缝兼容

    库表

    下面这张表是 商品类别表 建表语句

    CREATE TABLE `tb_category` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '类目id',
      `name` varchar(20) NOT NULL COMMENT '类目名称',
      `parent_id` bigint(20) NOT NULL COMMENT '父类目id,顶级类目填0',
      `is_parent` tinyint(1) NOT NULL COMMENT '是否为父节点,0为否,1为是',
      `sort` int(4) NOT NULL COMMENT '排序指数,越小越靠前',
      PRIMARY KEY (`id`),
      KEY `key_parent_id` (`parent_id`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=1424 DEFAULT CHARSET=utf8 COMMENT='商品类目表,类目和商品(spu)是一对多关系,类目与品牌是多对多关系';
    

    因为商品分类会有层级关系,因此这里我们加入了parent_id字段,对本表中的其它分类进行自关联。

    测试数据添加sql内容过多,如有需要请访问码云仓库或通过WX获取

    需求

    实现下面Service接口方法

    public interface CategoryService {
      //根据父节点查询下一级商品类目数据
      List<Category> queryListByParent(Long pid);
    }
    

    求关注,求点赞,求转发

    本人拥有两年开发经验和三年Java大数据教学经验,曾帮助2000+学生成功就业和跳槽。

    欢迎关注本人公众号:鹿老师的Java笔记,将在长期更新Java技术图文教程和视频教程,Java学习经验,Java面试经验以及Java实战开发经验。

  • 相关阅读:
    akka设计模式系列-actor锚定
    Akka源码分析-Remote-位置透明
    Akka源码分析-Remote-网络链接生命周期
    Akka源码分析-Remote-收消息
    Akka源码分析-Remote-网络链接
    Akka源码分析-Remote-发消息
    Akka源码分析-Remote-Actor创建
    Akka源码分析-Remote-ActorSystem
    Akka源码分析-ask模式
    Akka源码分析-深入ActorRef&ActorPath
  • 原文地址:https://www.cnblogs.com/bingyang-py/p/12298485.html
Copyright © 2011-2022 走看看