有天上飞的概念,就要有落地的实现
- 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例
- 每个知识点配套自测面试题,学完技术自我测试
- 本文初学向,所以希望文中所有的代码案例都能敲一遍
大哥大姐新年好,点赞转发不要少
文本已收录至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:通过配置文件可以做端口号,项目名等
配置文件规则
- 配置文件名字必须叫application
-
配置文件的格式有三种
- properties
- yml
- yaml
配置文件位置
配置文件内容
5.编写 UserController
6.通过启动类 启动项目
项目正确启动 日志如下
通过日志 可以知道 项目启动在了8802 端口, 项目名(context path) 为空
7. 打开浏览器 访问地址:http://localhost:8802/getUser
第一个demo 总结 代码详解
恭喜你,我知道你肯定已经完成了第一个demo的效果,但是估计会有些懵逼,咋就跑起来了呢?为什么没用的Tomcat?pom文件配置的是啥?启动类写的又是啥?
朋友,不要慌,鹿老师一个个给你解释。
SpringBoot的特点
为什么不需要Tomcat呢?这就是SpringBoot的优点之一啊,可以回忆一下简介部分SpringBoot的特点。如果想不起来,不用翻找,贴心的鹿老师又写了一遍
- 创建独立的Spring应用程序
- 使用嵌入的Tomcat,应用无需打成war包
- 简化Maven配置,starters自动配置和版本控制
- 大量自动配置,简化开发
- 无需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实战开发经验。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。