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

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

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

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

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

**文本已收录至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实战开发经验。

SpringBoot图文教程「概念+案例 思维导图」「基础篇上」的更多相关文章

  1. SpringBoot图文教程17—上手就会 RestTemplate 使用指南「Get Post」「设置请求头」

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1-Spr ...

  2. JavaSE教程-02Java基本语法-思维导图

    思维导图看不清楚时: 1)可以将图片另存为图片,保存在本地来查看 2)右击在新标签中打开放大查看 1.注释 定义:用于解释说明程序作用的文字 注释类别 单行注释 格式: //注释文字 多行注释 格式: ...

  3. IoC和DI的基本概念的思维导图

    最近在学习Spring开发,IoC这个概念让我有点儿迷糊,控制反转这四个字是在是无法做到望文生义,于是乎就找了一些材料来学习,研究了半天,绘制了下面这幅思维导图.仅供参考!

  4. 学习Python最好的方法就是实践和教程并行,以下有一些资源和教程,还有一些学习思维导图:

    1.Python 的 14 张思维导图下载地址: https://woaielf.github.io/2017/06/13/python3-all/ 2.Python基础教程|菜鸟教程: http:/ ...

  5. 【MSSQL教程】#001 整体思维导图

    整个MSSQL体系的一个思维导图,方便理解整个MSSQL需要学习那些方面的知识.

  6. 孔浩老师的 Struts2 教程听课笔记(思维导图)

    最近有空重头学习了一遍孔浩老师的 Struts2 教程,重新写了一份听课笔记.后面常用 form 标签.服务器端验证.异常处理因为时间问题,没有来得及整理.后续我会抽空补上.最近忙着准备笔试.面试. ...

  7. prometheus基本概念(思维导图)

    参考文章: prometheus词汇表 prometheus的summary和histogram指标的简单理解

  8. SpringBoot系列教程JPA之query使用姿势详解之基础篇

    前面的几篇文章分别介绍了CURD中的增删改,接下来进入最最常见的查询篇,看一下使用jpa进行db的记录查询时,可以怎么玩 本篇将介绍一些基础的查询使用姿势,主要包括根据字段查询,and/or/in/l ...

  9. 思维导图(JavaScript基础)——温习一下下

随机推荐

  1. $HDU1848\ Fibonacci\ again\ and\ again$ 博弈论

    正解:博弈论 解题报告: 传送门! 首先按照套路显然是考虑先预处理出所有数的$SG$函数值然后全局的$SG$就是$SG(n)$^$SG(m)$^$SG(p)$,这儿应该麻油问题$QwQ$? 然后就考虑 ...

  2. 「洛谷P2906」[USACO08OPEN]牛的街区Cow Neighborhoods 解题报告

    P2906 [USACO08OPEN]牛的街区Cow Neighborhoods 题目描述 Those Who Know About Cows are aware of the way cows gr ...

  3. Groovy重载操作符

    重载一时爽,一直重载一直爽. 最近在读<Groovy in action>一本书重新复习了Groovy的一些语法特性,迷恋上这个重载操作符的功能,坚持爽的不要要的.分享一个Demo. 由于 ...

  4. c语言一道题

    C语言中,a=b=c,a=b==c,a==(b=c),a==(b==c)有什么区别 main(){inta=1,b=2,c=3;printf("%d,%d,%d,%d\n",a=b ...

  5. 【转】ArcGIS Server 10.1 动态图层—更改风格

    在 ArcGIS Server REST API中我们可以通过向Graphicslayer中添加临时图元的方法来完成对显示结果的渲染:如果仅仅是更改原有地图服务显示风格,在ArcGIS10.1下使用动 ...

  6. Asp.Net Core下的开源任务调度平台ScheduleMaster—快速上手

    概述 ScheduleMaster是一个开源的分布式任务调度系统,它基于Asp.Net Core平台构建,支持跨平台多节点部署运行. 它的项目主页在这里: https://github.com/hey ...

  7. APP开通支付宝支付 转账功能

    注意:支付宝单笔转账到账户功能的准入条件 首先要在商家中心注册,从商家中心可以跳转到开放平台. 登陆蚂蚁金服开放平台 1 开发中心->网页&移动应用 2 根据需求选择应用类型创建应用 3 ...

  8. K8S基于ingress-nginx实现灰度发布

    之前介绍过使用ambassador实现灰度发布,今天介绍如何使用ingre-nginx实现. 介绍 Ingress-Nginx 是一个K8S ingress工具,支持配置 Ingress Annota ...

  9. NOIP提高组2018试题解析 Day1 T1 铺设道路 P5019

    题目描述 春春是一名道路工程师,负责铺设一条长度为 nn 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 nn 块首尾相连的区域,一开始,第 ii 块区域下陷的深度为 d_idi​  ...

  10. css文字溢出显示省略号

    1.单行文字溢出显示省略号. overflow: hidden; text-overflow: ellipsis; white-space: nowrap;//文本不换行 2.多行文本溢出显示省略号. ...