1

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

  • 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例
  • 每个知识点配套自测面试题,学完技术自我测试
  • 本文初学向,所以希望文中所有的代码案例都能敲一遍

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

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


鹿老师的Java笔记
111 声望34 粉丝