文章目录
1. 了解SpringBoot
原生开发:Servlet + jsp ,十分麻烦,web.xml 或者代码中都会存在大量重复内容;
简化开发 :Spring 里面所有东西都是配置文件,集成很多框架或者做一些大型项目,会导致整个程序和项目十分的臃肿,通篇的配置文件;
简化配置文件 :SpringBoot 就好像Spring的升级版,原来很多东西需要手动配置,现在只需要自动配置!
梳理SSM框架中麻烦之处 :
- 很多配置文件
- web.xml、 tomcat 都要配置
- lib依赖 也需要管理
那么在SpringBoot以上的一切,都不需要配置即可运行!
2. 第一个SpringBoot程序
1、使用IDEA构建一个SpringBoot程序
2、填写Maven项目基本信息
3、勾选启动器(Spring Web) 如果你勾选了这个,相当于帮你自动配置好了Spring和SpringMVC,包括Tomcat!
4、完成之后,等待Maven自动下载所有的依赖,再删除不需要的几个文件夹
最终的目录如下:
5、编写第一个程序
注意:一定要在 SpringBoot 主启动类的同级或者子级目录下,新建包!否则是识别不了的
package com.zz.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "Hello,SpringBoot!";
}
}
6、启动主启动类,访问测试:http://localhost:8080/hello
拓展:我们可以自定义 banner!
自定义的启动Logo,默认是Spring,可以根据自己喜好进行修改。
(1)我们在 resource 目录下新建一个 banner.txt文件,在这里面写入自己的banner即可
(2)在线网站生成:https://www.bootschool.net/ascii
(3)启动测试看效果
3. 理解SpringBoot原理
1、怎么启动的 ?
一个注解:@SpringBootApplication
一个类:SpringApplication
可以将自动生成的这个主启动类删除,自己手动写一个!
(1)在类上面增加一个@SpringBootApplication注解
(2) 使用SpringApplication的run方法启动
如写一个名为 ZzApplication 的主启动类:
package com.zz;
//自己手写一个主启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ZzApplication {
public static void main(String[] args) {
//run方法的启动
SpringApplication.run(ZzApplication.class,args);
}
}
2、依赖怎么配置的
思考:我们没有配置tomcat、 没有配置servlet、没有配置spring,这个怎么生效的?
SpringBoot默认有一个 pom.xml ,里面有父依赖以及场景启动器
父依赖:
父依赖作用分析
(1)自动帮你管理依赖,里面包含了几乎常用的所有依赖,如果你需要的依赖在这里面有,你就不要配置了,如果没有再配置
(2)插件和资源过滤的自动管理
启动器:
spring-boot-starter-xx 导入对应场景所需要的类,会自动帮你导入封装了这个场景所需要需要的依赖
官网有所有的启动器:https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/html/using-spring-boot.html#using-boot
4. SpringBoot 的配置
所有的配置都可以在配置文件中配置:
- application.yml / application.yaml
- application.properties
properties 是我们传统的配置文件 key = value
yaml 是SpringBoot 推荐的配置文件,功能更加强大
yaml 所有语法:(空格严格要求,缩进严格要求)
# 普通键值对
key: value
name: qinjiang
# map/对象
key:
k1: v1
k2: v3
person:
name: qinjiang
age: 3
# 行内写法 {}
person: {name: qinjiang,age: 3}
# list/数组
key:
- v1
- v2
pets:
- dog
- pig
- cat
# 行内写法
pets: [dog,pig,cat]
5. SpringBoot 集成 MyBatis
注意:MyBatis 所有的包都是自己的,所以要导入自己的依赖
整个项目目录:
1、在pom.xml中添加驱动和依赖
<!-- 这是自定义的包 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<!-- mysql 驱动 在这不写版本号,默认使用mysql8的版本 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--在这里写的依赖都不需要版本号,因为在父依赖中有!-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2、编写配置文件 application.yml
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
type-aliases-package: com.kuang.pojo
mapper-locations: classpath:com/kuang/mapper/*.xml
3、测试数据源有没有,在测试类中测试即可
package com.zz;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
@SpringBootTest
class HelloSpringbootApplicationTests {
// 自动导入数据源
@Autowired
private DataSource dataSource;
// SpringBoot 2.X 默认集成的是 Hikari
@Test
void contextLoads() throws SQLException {
// 查看默认数据源 class com.zaxxer.hikari.HikariDataSource
System.out.println(dataSource.getClass());
// connection
Connection connection = dataSource.getConnection();
System.out.println(connection);
// 关闭连接
connection.close();
}
}
SpringBoot 目前默认的数据源是 class com.zaxxer.hikari.HikariDataSource
4、编写实体类 User
package com.zz.pojo;
import lombok.Data;
@Data
public class User {
private int id;
private String name;
private String pwd;
}
5、编写接口 UserMapper(使用注解和 XML 都可以)
package com.zz.mapper;
import com.zz.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper // @Mapper 标注这是一个Mapper接口
@Repository // 代表持久层
public interface UserMapper {
// @Select("select * from user") 注解方式
List<User> getUserLists();
}
6、编写接口的配置文件 UserMapper.xml
<?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.zz.mapper.UserMapper">
<select id="getUserLists" resultType="User">
select * from user;
</select>
</mapper>
7、编写控制层 MyBatisController
package com.zz.controller;
import com.zz.mapper.UserMapper;
import com.zz.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class MyBatisController {
@Autowired
private UserMapper userMapper;
@RequestMapping("/list")
public List<User> getUserList(){
List<User> userLists = userMapper.getUserLists();
return userLists;
}
}
8、配置 .xml 文件的资源过滤
由于 .xml 的配置文件没有导出,在pom.xml中配置资源过滤即可
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
9、启动主启动类,进行测试
在地址栏输入 http://localhost:8080/list ,页面就显示了数据库中user表的数据
6. SpringBoot 开发 Web 应用
1、资源存放目录说明
static
静态资源
templates
页面,templates只能通过 controller来访问资源文件
resources
也可以存放资源文件
public
SpringBoot 源码中找到的,静态资源公共的可以放在这里
测试:
2、Thymeleaf 使用,导入静态资源模板 使用html 编写页面
Thymeleaf是一个流行的模板引擎,该模板引擎采用Java语言开发,模板引擎是一个技术名词,是跨领域跨平台的概念。
Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模。你可以使用它创建经过验证的XML与HTML模板。使用thymeleaf创建的html模板可以在浏览器里面直接打开(展示静态数据),这有利于前后端分离。
(1)导入对应maven依赖
<!-- thymeleaf依赖,如果要编写页面一定需要这个依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
(2)编写 html 页面放到 templates 目录下
(3)使用controller 进行跳转
package com.zz.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller //可以被视图解析器解析
public class IndexController {
//只要访问 / 就会跳转到templates目录下的index页面
@RequestMapping("/")
public String index(){
return "index";
}
@RequestMapping("/user/index")
public String userIndex(){
return "user/index";
}
@RequestMapping("/user/list")
public String userList(){
return "user/list";
}
}
(4)启动测试
3、页面传递值
(1)在后端方法中使用 Model 传递值
package com.zz.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Arrays;
@Controller //可以被视图解析器解析
public class IndexController {
@RequestMapping("/")
public String index(Model model){
model.addAttribute("msg","Hello,SpringBoot!");
model.addAttribute("users", Arrays.asList("小猫","小狗"));
return "index";
}
}
(2)在前端使用 th:xxx 去接收后端传递值,注意:一定要导入头文件约束
普通取值 和 循环遍历
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>首页</h1>
<!-- 普通取值 -->
<p th:text="${msg}"></p>
<!-- 循环遍历:接收后端传递的 users,遍历每个的结果就是user,可以在这个标签内使用!
th:each="item:items"
-->
<!--写法一-->
<h2 th:each="user:${users}" th:text="${user}"></h2>
<!-- 写法二:行内写法 -->
<h2 th:each="user:${users}">[[${user}]]</h2>
<!--写法三-->
<div th:each="user:${users}">
<p th:text="${user}"></p>
</div>
</body>
</html>
启动测试: