1.1 SpringBoot项目创建
- 从官网创建
- idea中联网从官网创建
- idea中联网从阿里云创建
- SpringBoot项目手动创建
前三种创建方式都需要联网创建,需要等待的时间很长,我一般习惯手动创建。通过创建一个普通的Maven项目自己手动配置得到一个SpringBoot项目。
1.2 手动创建SpringBoot项目
1.2.1 Maven项目的创建

新建项目
选择Maven,下一步
只需要修改命名就行

项目创建成功
1.2.2 手动配置将Maven项目变为SpringBoot项目
pom.xml中添加依赖项
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.2</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
编写启动类
package com.ylh;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootDemo4Application {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemo4Application.class);
}
}
至此,Maven项目成功变成SpringBoot项目

1.3 概述
SpringBoot是由Pivotal团队提供的全新的框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程
Spring程序的缺点
依赖设置繁琐、配置繁琐
SpringBoot程序的优点
-
起步依赖【简化配置】
-
自动配置【简化常用工程相关配置】
-
辅助功能【内置服务器……】
项目创建总结:
1、开发springboot程序要继承spring-boot-starter-parent
2、spring-boot-starter-parent中定义了很多个依赖管理
3、继承parent模块可以避免多个依赖使用相同技术出现依赖版本冲突
4、继承parent的形式也可以采用引入依赖的形式实现效果
starter
SpringBoot项目中常见的项目名称,定义了当前项目使用的所有依赖坐标,以达到减少依赖配置的目的
parent
所有SpringBoot项目要继承的项目,定义了若干个坐标的版本号【依赖管理,而非真正的依赖】,以达到减少依赖冲突的目的
spring-boot-starter-parent个版本之间存在着诸多坐标的不同
springboot提供了3中配置文件的格式
- properties【传统的格式/默认的格式】
- yml【主流格式】
- yaml
springboot配置文件的加载顺序
application.properties>application.yml>application.yaml
不同配置文件中相同的配置按照加载的优先级相互覆盖,不同配置文件中不同的配置全部保留
1.4 yaml文件
概述
YAML[Yaml ain't Markup Language]一种数据序列化格式
优点:
- 容易阅读
- 容易与脚本语言交互
- 以数据为核心,重数据轻格式
扩展名
- .yml【主流】
- .yaml
语法规则
- 大小写敏感
- 属性层级关系使用多行描述,每行结尾使用冒号结束
- 使用缩进表示层级关系,同层级左侧对齐,只允许空格【不允许使用tab】
- 属性值前添加空格【属性名与属性名之间使用冒号+空格作为分隔】
字面值表示方式
boolean: True # True true False FALSE false均可
float: 12.23
int: 123
null: ~ # 使用~表示null
string: Helloword
string1: "Helloworld" # 字符串可以直接书写,也可以使用双引号引起来
date: "2023-05-27"
datetime: 2023-05-27T11:46:23+08:00 # 时间和日期使用T连接,最后使用+代表时区
# 数组表示方式:在属性名书写位置的下方使用减号作为数据开始的符号,每行书写一个数据,减号与数据间空格分隔
students:
- 小明
- 小红
student:
name: 袁~
age: 18
subject:
- java
- web
- javaEE
hobbys: [ 唱歌,跳舞 ] # 数组书写的缩略格式
读取单一数据
province: 陕西
city: 西安
student:
name: 袁李慧
age: 21
school:
- 西交
- 西电
package com.ylh.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/users")
public class UserController {
@Value("${province}")
private String province;
@Value("${city}")
private String city;
@Value("${student.name}")
private String name;
@Value("${student.age}")
private int age;
@Value("${school[1]}")
private String school;
@GetMapping
public String hello(){
System.out.println(province);
System.out.println(city);
System.out.println(name);
System.out.println(age);
System.out.println(school);
return "hello springboot is running"+province+"=="+city;
}
}
使用@Value读取单个数据,属性名引用方式:¥{以及属性名.二级属性名……}
//使用自动装配将所有的数据封装到一个Environment对象中
@Autowired
private Environment env;
@GetMapping("/getData")
public String getYamlData(){
System.out.println(env);
System.out.println(env.getProperty("province"));
System.out.println(env.getProperty("city"));
System.out.println(env.getProperty("school[2]"));
System.out.println(env.getProperty("student.name"));
return "get yaml data is success";
}
使用Environment对象封装全部配置信息
使用@Autowired自动装配数据到Environment对象中
读取引用类型数据
定义yml文件
datasource:
driver: com.mysql.jdbc.Driver
url: jdbc:mysql:///test
username: root
password: 123mysql
定义实体类
package com.ylh.util;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "datasource")
public class MyDataSource {
private String driver;
private String url;
private String username;
private String password;
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "MyDataSource{" +
"driver='" + driver + '\'' +
", url='" + url + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
@Controller
@Autowired
private MyDataSource dataSource;
@GetMapping("/ds")
public String getDataSource() {
System.out.println(dataSource);
return dataSource.toString();
}
使用@ConfigurationProperties注解绑定配置信息到封装类中
封装类需要定义为spring管理的bean,否则无法进行属性注入
1.5 整合第三方技术
1.5.1 整合Junit
引入依赖——导入对应的starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
在测试类上使用@SpringBootTest注解修饰
package com.ylh;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class SpringBootDemo4Test {
public void testUser(){
}
}
使用自动装配的形式添加要测试的对象
1.5.2 整合mybatis
引入依赖——导入对应的starter
<!--导入对应的starter MaBatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!--导入数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
设置数据源的参数
#配置数据源信息
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///springboot_db
username: root
password: 123mysql
测试类
package com.ylh;
import com.ylh.dao.StuDao;
import com.ylh.pojo.Student;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class SpringBootDemo2Test {
@Autowired
private StuDao stuDao;
@Test
public void testStuById(){
Student stuById = stuDao.findStuById(1);
System.out.println(stuById);
}
}
Tips:
MyBatis8.x驱动要求设置时区
a.url后边添加serverTime设定Asia/ShangHai或者使用UTC
如果是映射配置文件
<?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.ylh.dao.StuMapper">
<!--查询-->
<select id="findAll" resultType="Stu">
select * from stu
</select>
</mapper>
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml # mapper映射文件路径
type-aliases-package: com.ylh.pojo # 配置是哪个包下的类的默认的别名
1.5.3 整合Mybatis_Plus
1.导入坐标
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version> <!--这里必须写版本, 因为mybatis_plus未收录在boot中-->
</dependency>
2.创建Dao接口
继承BaseMapper,泛型就是封装数据的实体类,该接口中常用的CRUD方法已经写好了,直接用
@Mapper
public interface StuDao extends BaseMapper<Stu> {
}
3.测试,便可以查到数据
@Test
public void testStu() {
Stu stu = stuDao.selectById(1);
System.out.println(stu);
}
@Test
void testPage() {
IPage page = new Page(3,2);
IPage pageData = stuDao.selectPage(page,null);
System.out.println(pageData.getRecords());
}
分页查询
@Test
void testPage() {
IPage page = new Page(3,2);
IPage pageData = stuDao.selectPage(page,null);
System.out.println(pageData.getRecords());
}
分页操作需要设定分页对象IPage,IPage对象中封装了分页操作中的所有数据,数据、当前页面值、每页数据总量、最大页码、数据总量……
直接上述代码我们发现未达到分页的效果,因为分页操作实在MyBatisPlus常规操作基础上增强得到的,内部是动态的拼写sql语句,因此需要增强对应的功能,使用MyBatisPlus拦截器实现
@Configuration public class MyConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ //定义mp拦截器 MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); //添加具体的拦截器 interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } }
条件查询
@Test
void testGetByCondition() {
//select * from stu where name like '%sql%'
QueryWrapper<Stu> qw = new QueryWrapper<>();
qw.like("name","sql");
List<Stu> selectList = stuDao.selectList(qw);
for ( Stu stu : selectList ) {
System.out.println(stu);
}
}
@Test
void testGetByCondition2() {
//select * from stu where name like '%sql%'
LambdaQueryWrapper<Stu> wq = new LambdaQueryWrapper<>();
//wq.like(Stu::getName,"sql");
String name = null;
wq.like(name!=null,Stu::getName,name);
List<Stu> selectList = stuDao.selectList(wq);
for ( Stu stu : selectList ) {
System.out.println(stu);
}
}
1.5.4 SSMP
持久层
@Mapper
public interface StuDao extends BaseMapper<Stu> {
}
业务层
public interface StuService extends IService<Stu> {
}
@Service
public class StuServiceImpl extends ServiceImpl<StuDao,Stu> implements StuService {
}
1.使用通用的接口IService快速开发业务层
2.使用通用的实现类ServiceImpl快速开发业务层的实现类
3.可以在通用接口的基础上做功能重载或者功能追加
4.注意重载的时候不需要覆盖原始操作,避免原始操作提供的功能丢失
表现层
package com.ylh.controller;
import com.ylh.pojo.Stu;
import com.ylh.service.StuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 控制器类
*/
@RestController
@RequestMapping("/students")
public class StuController {
@Autowired
private StuService stuService;
@GetMapping
public List<Stu> getAll() {
return stuService.list();
}
@PostMapping
public boolean save(@RequestBody Stu stu) {
return stuService.save(stu);
}
@PutMapping
public boolean update(@RequestBody Stu stu) {
return stuService.updateById(stu);
}
@DeleteMapping("/{id}")
public boolean deleteById(@PathVariable Integer id) {
return stuService.removeById(id);
}
@GetMapping("/{id}")
public Stu getById(@PathVariable Integer id) {
return stuService.getById(id);
}
}
分页功能
//分页
IPage<Stu> getPage(int currentPage,int pageSize);
@Override
public IPage<Stu> getPage(int currentPage, int pageSize) {
IPage page = new Page(currentPage, pageSize);
return baseMapper.selectPage(page,null);
}
@GetMapping("/{current}/{pageSize}")
public IPage<Stu> getPage(@PathVariable Integer current,
@PathVariable Integer pageSize) {
return stuService.getPage(current, pageSize);
}
表现层统一
package com.ylh.controller;
import com.ylh.pojo.Stu;
import com.ylh.service.StuService;
import com.ylh.util.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* 控制器类
*/
@RestController
@RequestMapping("/students")
public class StuController {
@Autowired
private StuService stuService;
@GetMapping
public Result getAll() {
return new Result(true,stuService.list());
}
@PostMapping
public Result save(@RequestBody Stu stu) {
return new Result(stuService.save(stu),null);
}
@PutMapping
public Result update(@RequestBody Stu stu) {
return new Result(stuService.updateById(stu),null);
}
@DeleteMapping("/{id}")
public Result deleteById(@PathVariable Integer id) {
return new Result(stuService.removeById(id),null);
}
@GetMapping("/{id}")
public Result getById(@PathVariable Integer id) {
return new Result(true,stuService.getById(id));
}
@GetMapping("/{current}/{pageSize}")
public Result getPage(@PathVariable Integer current,
@PathVariable Integer pageSize) {
return new Result(true,stuService.getPage(current, pageSize));
}
}
1.设置统一的返回值类型结果,便于前端开发读取数据
2.返回结果类型可以根据需求自行设定,没有固定格式
3.返回值结果模型用于后端和前端进行数据格式统一,也称之为前后端数据协议1.6 静态资源
1.6 静态资源
在resources下创建static目录,将所有静态资源放入
yml中
mvc:
static-path-pattern: /res/**
修改静态资源存放的位置
web:
resources:
static-locations:
- classpath:/static/
- classpath:/ylhstatic/
1.7 完整代码呈现
目录
1.2.2 手动配置将Maven项目变为SpringBoot项目

完整目录
config.MyConFig
package com.ylh.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
controller.StuController
package com.ylh.controller;
import com.ylh.pojo.Stu;
import com.ylh.service.StuService;
import com.ylh.util.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* 控制器类
*/
@RestController
@RequestMapping("/students")
public class StuController {
@Autowired
private StuService stuService;
@GetMapping
public Result getAll() {
return new Result(true,stuService.list());
}
@PostMapping
public Result save(@RequestBody Stu stu) {
return new Result(stuService.save(stu),null);
}
@PutMapping
public Result update(@RequestBody Stu stu) {
return new Result(stuService.updateById(stu),null);
}
@DeleteMapping("/{id}")
public Result deleteById(@PathVariable Integer id) {
return new Result(stuService.removeById(id),null);
}
@GetMapping("/{id}")
public Result getById(@PathVariable Integer id) {
return new Result(true,stuService.getById(id));
}
@GetMapping("/{current}/{pageSize}")
public Result getPage(@PathVariable Integer current,
@PathVariable Integer pageSize) {
return new Result(true,stuService.getPage(current, pageSize));
}
}
dao.StuDao
package com.ylh.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ylh.pojo.Stu;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface StuDao extends BaseMapper<Stu> {
}
pojo.Stu
package com.ylh.pojo;
import lombok.Data;
@Data
public class Stu {
private Integer id;
private String name;
private String pass;
private Integer age;
private String sex;
}
service
impl.StuServiceImpl
package com.ylh.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ylh.dao.StuDao;
import com.ylh.pojo.Stu;
import com.ylh.service.StuService;
import org.springframework.stereotype.Service;
@Service
public class StuServiceImpl extends ServiceImpl<StuDao,Stu> implements StuService {
@Override
public IPage<Stu> getPage(int currentPage, int pageSize) {
IPage page = new Page(currentPage, pageSize);
return baseMapper.selectPage(page,null);
}
}
StuService
package com.ylh.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ylh.pojo.Stu;
/**
* 业务层接口
*/
public interface StuService extends IService<Stu> {
//分页
IPage<Stu> getPage(int currentPage,int pageSize);
}
util.Result
package com.ylh.util;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 封装结果数据类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result {
private Boolean flag;
private Object data;
}
SpringBootDemo1Application
package com.ylh;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootDemo1Application {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemo1Application.class,args);
}
}
static.demo1
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="./js/jquery-3.5.1.min.js"></script>
<script src="./js/vue.min.js"></script>
<script src="./js/axios.js"></script>
</head>
<body>
<h1>hello springboot is running>>>>></h1>
<div id="app">
<table>
<tr>
<th>编号</th>
<th>姓名</th>
<th>密码</th>
<th>年龄</th>
<th>性别</th>
<th>操作</th>
</tr>
<tr v-for="stu in stuList">
<td>{{stu.id}}</td>
<td>{{stu.name}}</td>
<td>{{stu.pass}}</td>
<td>{{stu.age}}</td>
<td>{{stu.sex}}</td>
<td><a href="">删除</a><a href="">修改</a></td>
</tr>
</table>
</div>
</body>
<script type="text/javascript">
new Vue({
el: "#app",
data: {
stuList: []
},
created() {
this.findAll();
},
methods: {
findAll() {
//请求后台
axios.get("/students").then(res => {
//请求成功
console.log(res.data.data);
this.stuList = res.data.data;
}).catch(() => {
//请求失败
});
}
}
});
</script>
</html>
application.yml
server:
port: 9090
##配置数据源信息
#spring:
# datasource:
# driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql:///student?serverTimezone=Asia/Shanghai
# username: root
# password: 123mysql
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///student?serverTimezone=Asia/Shanghai
username: root
password: 123mysql
mvc:
static-path-pattern: /res/**
# static-path-pattern: /**
web:
resources:
static-locations:
- classpath:/static/
mybatis-plus:
# global-config:
# db-config:
# table-prefix:t_ # 如果表明有前缀则加该配置
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
test:SpringBootDemo1Test
package com.ylh;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ylh.dao.StuDao;
import com.ylh.pojo.Stu;
import com.ylh.service.StuService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class SpringBootDemo1Test {
@Autowired
private StuService stuService;
@Autowired
private StuDao stuDao;
@Test
void testSave() {
Stu stu = new Stu();
stu.setName("软件测试");
stu.setPass("测试软件的健壮性以及是否符合上线要求");
stu.setSex("软件测试");
stu.setId(28);
stuService.save(stu);
}
@Test
public void textStu(){
Stu byId = stuService.getById(28);
System.out.println(byId);
}
@Test
void testFindAll() {
List<Stu> list = stuService.list();
for ( Stu stu : list ) {
System.out.println(stu);
}
}
/**
* 根据id查询
*/
@Test
public void testStu() {
Stu stu = stuDao.selectById(1);
System.out.println(stu);
}
/**
* 分页查询
*/
@Test
void testPage() {
IPage page = new Page(3,2);
IPage pageData = stuDao.selectPage(page,null);
System.out.println(pageData.getRecords());
}
/**
* 条件查询
*/
@Test
void testGetByCondition() {
//select * from stu where name like '%sql%'
QueryWrapper<Stu> qw = new QueryWrapper<>();
qw.like("name","李");
List<Stu> selectList = stuDao.selectList(qw);
for ( Stu stu : selectList ) {
System.out.println(stu);
}
}
@Test
void testGetByCondition2() {
//select * from stu where name like '%sql%'
LambdaQueryWrapper<Stu> wq = new LambdaQueryWrapper<>();
//wq.like(Stu::getName,"sql");
String name = null;
wq.like(name!=null,Stu::getName,name);
List<Stu> selectList = stuDao.selectList(wq);
for ( Stu stu : selectList ) {
System.out.println(stu);
}
}
}

这篇博客详细介绍了如何手动创建SpringBoot项目,包括从Maven项目开始配置,添加依赖,编写启动类,以及SpringBoot的核心优势。还涵盖了yaml文件的使用,包括读取单一数据和引用类型数据的方法。此外,博主讲解了整合第三方技术如Junit、Mybatis及Mybatis_Plus的步骤,并讨论了SSMP框架的使用。最后,提到了静态资源管理和完整的代码结构。
1398





