有天上飞的概念,就要有落地的实现
概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例
每个知识点配套自测面试题,学完技术自我测试
本文初学向,所以希望文中所有的代码案例都能敲一遍
大哥大姐新年好,点赞转发不要少
**文本已收录至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实战开发经验。