内容包括介绍SpringBoot和整合其他技术,例如Mybatis、Redis、定时任务、Thymleaf等
只看SSM整合的请直接看 六、Springboot整合mybatis(详细图文步骤搭建)
一、什么是SpringBoot
SpringBoot是基于Spring Framwor5.0开发的项目.目的是快速开发、减少配置;
特点:
①快速开发
②零配置,遵守约定大于配置(例如tomcat的端口:8080;这种类似配置,会被自动配置)
③集成第三方库配置,开箱即用;
④提供大型项目非功能特征;嵌入服务器,不需要配置tomcat或maven的tomcat插件
二、SpringBoot核心功能
spingboot不是什么新框架,只是一些库的集合;以前我们开发项目不可避免的步骤:导入依赖;配置spring相关文件,现在都由SpringBoot自动完成;我们只需要完成核心代码编写即可.
起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能;
简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。 起步依赖的作用就是进行依赖的传递
我们创建的所有工程都是需要继承父工程spring-boot-starter-parent;源码中我们可以看到通过spring-boot-starter-dependencies的pom.xml中我们发现,一部分坐标的版本、依赖管理、插件管理已经定义好,所以我们的SpringBoot工程继承spring-boot-starter-parent后已经具备版本锁定等配置了(不会出现版本冲突的问题)。所以起步依赖的作用就是进行依赖的传递。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的;
我们打印以下配置类
通过答应springboot的启动类可以看出他帮我已经加载了像DispatcherServlet这样的类;所以我们之前配置的spring相关类.例如核心控制器,编码过滤器,等都已经自动配置了;原理就是通过引导类的注解SpringBootApplication中的EnableAutoConfiguration做到的;他通过classpath:/META-INF/spring.factories已经自动配置好了.如果要自己添加或者更改,需要再resources下添加一个META-INF/spring.factories进行配置
三、SpringBoot引导类
// 声明该类是一个SpringBoot引导类
@SpringBootApplication
public class MySpringBootApplication {
// main是java程序的入口
public static void main(String[] args) {
// run方法 表示运行SpringBoot的引导类 run参数就是SpringBoot引导类的字节码对象
SpringApplication.run(MySpringBootApplication.class,args);
}
}
Ctrl+鼠标左键点@SpringBootApplication;进入引导类;其中三个关键注解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
@ComponentScan 扫描当前包及其子包下被 @Component
,@Controller
,@Service
,@Repository
注解标记的类并纳入到spring容器中进行管理,所以这个注解会自动注入所有在主程序所在包下的组件。默认把当前启动类所在的包作为扫描包的起点,
@SpringBootConfiguration 表示当前类具有配置类的作用
@EnableAutoConfiguration(最重要)
自动配置:根据当前引入的依赖包,猜测需要创建的工程类型,以及工程中有可能创建的对象,根据猜测自动创建工程所需的相关实例bean;;程序启动,会自动加载扫描所有 classpath:/META-INF/spring.factories
文件 ,并且创建对应实例
四、SpringBoot的配置文件
有application.propertie、application.yaml和application.yml(推荐使用);如下格式;以’:'分割并且带有空格
mybatis:
type-aliases-package: com.atguigu.domain # 指定mybatis别名包
mapper-locations: classpath:com/atguigu/dao/*.xml # 指定xml映射文件路径
logging:
level:
com.atguigu.dao: debug # 配置日志
spring:
datasource:
username: root
password: root
url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=utf8
driver-class-name: com.mysql.jdbc.Driver
server:
port: 18081
五、SpringBoot整合Juint
导入依赖
<!--测试的起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
在测试类上面添加注解即可(@SrpingBootTets替代了之前spring测试类@ContextConfiguration(locations = “classpath:applicationContext.xml”))
@RunWith(SpringRunner.class)
@SpringBootTest
public class MapperTest {
六、Springboot整合mybatis
详细搭建流程如下
①创建普通maven项目
(可以用spring引导项目,可以不用导入依赖,但是版本不能控制,开发中推荐使用maven工程)
②配置项目名和路径
③导入依赖pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpingBoot集成junit测试的起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--mybatis起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!-- MySQL连接驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
④搭建项目框架并在application.yml 添加配置
application.yml文件了类容附上(数据库用户名和密码用自己的)
mybatis:
type-aliases-package: com.atguigu.domain # 指定mybatis别名包
mapper-locations: classpath:com/atguigu/dao/*.xml # 指定xml映射文件路径
logging:
level:
com.atguigu.dao: debug # 配置日志
spring:
datasource:
username: root
password: root
url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=utf8
driver-class-name: com.mysql.jdbc.Driver
server:
port: 18081
⑤给出各个类的代码
User 类
package com.zhao.bean;
import java.io.Serializable;
/**
* @author zhao
* @date 2021/3/26
* @desc
*/
public class User implements Serializable {
private Long id;
private String username;
private String password;
private String name;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", name='" + name + '\'' +
'}';
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
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;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
UserController 类
package com.zhao.controller;
import com.zhao.bean.User;
import com.zhao.service.UserService;
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;
/**
* @author zhao
* @date 2021/3/26
* @desc
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/list")
public List<User> getAll(){
return userService.getAll();
}
}
UserDao 类
package com.zhao.dao;
import com.zhao.bean.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserDao {
List<User> getAll();
}
UserService 类
package com.zhao.service;
import com.zhao.bean.User;
import java.util.List;
public interface UserService {
List<User> getAll();
}
UserServiceImpl 类
package com.zhao.service.impl;
import com.zhao.bean.User;
import com.zhao.dao.UserDao;
import com.zhao.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author zhao
* @date 2021/3/26
* @desc
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao; //爆红没有关系
@Override
public List<User> getAll() {
return userDao.getAll();
}
}
Application 启动类
package com.zhao;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author zhao
* @date 2021/3/26
* @desc
*/
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
UserDao.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.atguigu.dao.UserDao">
<select id="getAll" resultType="com.zhao.bean.User">
select * from user
</select>
</mapper>
七、SpringBoot整合Redis
在项目中添加redis依赖
<!-- 配置使用redis启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
在application.yml中添加redis的配置
spring:
redis: #Redis
port: 6379
host: 127.0.0.1
通过注入RedisTemplate调用
boundValueOps(key).get() 根据"key"取值;
boundValueOps(key).set(val) 根据val给key赋值
八、SpringBoot整合定时任务
添加依赖
<!-- 添加 Scheduled 坐标 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
在SpringBoot的引导类上面添加@EnableScheduling注解
@SpringBootApplication
@EnableScheduling //这里
public class BootApplication {
public static void main(String[] args) {
SpringApplication.run(BootApplication.class, args);
}
}
在编写的类上面添加注解@Scheduled(),其中有三个属性,值都为毫秒单位
cron: 和石英表达式类似 0/3 * * * * * 表示3秒执行一次
fixedDelay: 距离上一次定时任务执行完毕后N毫秒在执行,
fixedRate: 执行周期,执行频率;定时任务执行开始,在过N毫秒后执行
@Scheduled(fixedDelay = 3000)
public void myTask() { ...}
九、SpringBoot整合Spring data jpa
导入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- springBoot JPA的起步依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MySQL连接驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 配置使用redis启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
配置yml
logging:
level:
com.atguigu.dao: debug # 配置日志
spring:
datasource:
username: root
password: root
url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=utf8
driver-class-name: com.mysql.jdbc.Driver
jpa:
database: mysql
show-sql: true
generate-ddl: true
hibernate:
ddl-auto: update
naming_strategy: org.hibernate.cfg.ImprovedNamingStrategy
server:
port: 18081
代码和整合spring整合jpa一样.
十、SpringBoot整合Thymeleaf
Thymeleaf是完全替代jsp的模板引擎,是官方推荐使用的(就像内置tomcat,gson,log4f这些一样,不用额外配置拆箱即用).注意所有html的页面需要放到resources下面的templates文件中(很重要,没有自己创建)
依赖和一般SpringBoot一样,无需添加其他;在Html页面中要引入Thymeleaf的标签;放在就行;
<!--这句声明使用thymeleaf标签-->
<html xmlns:th="http://www.thymeleaf.org">
常用取值方法;在标签中通过th:方法取值
<!--1.通过String取值-->
<p th:text="${hello}"></p>
<!--2.表单提交-->
<form id="login-form" th:action="@{/test/hello}">
<button>提交</button>
</form>
<!--3.通过each遍历list取值-->
<tr th:each="user,userStat:${users}">
<td>
下标:<span th:text="${userStat.index}"></span>,
</td>
<td th:text="${user.id}"></td>
<td th:text="${user.name}"></td>
<td th:text="${user.address}"></td>
</tr>
<!--4.通过each遍历map取值/或通过key取值-->
<div>
获取Key=NO的值:<span th:text="${dataMap.No}"></span><br/>
获取key=address的值:<span th:text="${dataMap.address}"></span> <br/>
</div>
<div th:each="map:${dataMap}">
<span th:text="${map.key}"></span>:<span th:text="${map.value}"></span>
</div>
<!--5.格式化后台传过来的new Date()-->
<span th:text="${#dates.format(now,'yyyy-MM-dd HH:mm:ss')}"></span>