1.SpringBoot概述
Spring Boot 是 Spring 框架的一个新的子项目,用于创建 Spring 4.0 项目。它的开发始于 2013 年。2014 年 4 月发布 1.0.0 版本。它可以自动配置 Spring 的各种组件,并不依赖代码生成和 XML 配置文件。Spring Boot 也提供了对于常见场景的推荐组件配置。Spring Boot 可以大大提升使用 Spring 框架时的开发效率。
1.1 简介
- 使用Spring boot ,可以轻松的创建独立运行的程序,非常容易构建独立的服务组件,是实现分布式架构、微服务架构利器。
- Spring boot简化了第三方包的引用,通过提供的starter,简化了依赖包的配置。
1.2 SpringBoot优点
- 轻松创建独立的Spring应用程序。
- 内嵌Tomcat、jetty等web容器,不需要部署WAR文件。
- 提供一系列的“starter” *来简化的Maven配置,不需要添加很多依赖。
- 开箱即用,尽可能自动配置Spring。
2.SpringBoot入门案例
2.1 创建SpringBoot项目
-
1.【war】包形式
-
2.【Jar】包形式
2.2 以【Jar】包形式作为流程案例:
2.2.1 在pom.xml添加spring-boot-starter-web依赖
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
spring-boot-starter-parent作用
- 在pom.xml中引入spring-boot-start-parent,它可以提供dependency management,也就是说依赖管理,引入以后在申明其它dependency的时候就不需要version了,后面可以看到。
spring-boot-starter-web作用
-
springweb 核心组件
-
添加完新的依赖,导入一下Maven,生效
2.2.2 SpringBoot启动控制器
package zq.leonard.controller;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
* TODO
*
* @author Leonard
* @version 1.0
* @date 2022/2/24 0024 15:07
* @des SpringBoot启动器
*/
@RestController//RestFul风格控制
@EnableAutoConfiguration//开启自动配置
public class HelloSpringBoot {
@RequestMapping("/hello")//映射路径
@ResponseBody//响应体
public String hello(){
return "Hello SpringBoot!";
}
public static void main(String[] args) {
SpringApplication.run(HelloSpringBoot.class,args);
}
}
- 在浏览器中访问http://localhost:8080/hello
3.SpringBoot的启动方式
3.1 在控制器配置EnableAutoConfiguration
- 使用SpringApplication启动程序
3.2 创建一个App类
- 在App类中配置EnableAutoConfiguration和组件扫描ComponentScan,然后使用SpringApplication启动程序,这样就可以访问多个Controller了.【常用】
3.2.1 创建控制器
/**
* TODO
*
* @author Leonard
* @version 1.0
* @date 2022/2/24 0024 15:40
* @des 创建用户控制器【】
*/
@RestController//【相当于声明Controller - 提共restful 风格】
@RequestMapping("leonard2")
public class UserController {
@RequestMapping("{id}")
@ResponseBody
public UserDao userInfo(@PathVariable(value = "id") Integer id){
UserDao leonard = new UserDao("Leonard", "18");
leonard.setId(id);
return leonard;
}
}
3.2.2 创建启动类
/**
* TODO
*
* @author Leonard
* @version 1.0
* @date 2022/2/25 0025 10:42
* @des SpringBoot启动器
*/
@EnableAutoConfiguration//开启自动配置,不需要写spring的配置文件
@ComponentScan(basePackages = "zq.leonard")//配置需要扫描的包
public class StartApp {
public static void main( String[] args )
{
SpringApplication.run(StartApp.class,args);
}
}
4.SpringBoot依赖介绍
4.1 核心依赖介绍
spring-boot-starter 核心 POM,包含自动配置支持、日志库和对 YAML 配置文件的支持。
spring-boot-starter-amqp 通过 spring-rabbit 支持 AMQP
spring-boot-starter-aop 包含 spring-aop 和 AspectJ 来支持面向切面编程(AOP)。
spring-boot-starter-batch 支持 Spring Batch,包含 HSQLDB。
spring-boot-starter-data-jpa 包含 spring-data-jpa、spring-orm 和 Hibernate 来支持 JPA。
spring-boot-starter-data-mongodb 包含 spring-data-mongodb 来支持 MongoDB。
spring-boot-starter-data-rest 通过 spring-data-rest-webmvc 支持以 REST 方式暴露 Spring Data 仓库。
spring-boot-starter-jdbc 支持使用 JDBC 访问数据库
spring-boot-starter-security 包含 spring-security。
spring-boot-starter-test 包含常用测试所需的依赖如 JUnit、Hamcrest、Mockito 和 spring-test 等。
spring-boot-starter-velocity 支持使用 Velocity 作为模板引擎。
spring-boot-starter-web 支持 Web 应用开发,包含 Tomcat 和 spring-mvc。
spring-boot-starter-websocket 支持使用 Tomcat 开发 WebSocket 应用。
spring-boot-starter-ws 支持 Spring Web Services
spring-boot-starter-actuator 添加适用于生产环境的功能,如性能指标和监测等功能。
spring-boot-starter-remote-shell 添加远程 SSH 支持
spring-boot-starter-jetty 使用 Jetty 而不是默认的 Tomcat 作为应用服务器。
spring-boot-starter-log4j 添加 Log4j 的支持
spring-boot-starter-logging 使用 Spring Boot 默认的日志框架 Logback
spring-boot-starter-tomcat 使用 Spring Boot 默认的 Tomcat 作为应用服务器。
4.2 spring-boot-starter-web讲解
- POM 文件中可以看到,应用所声明的依赖很少
- 只有一个“org.springframework.boot:spring-boot-starter-web”
- 而不是像其他 Spring 项目一样需要声明很多的依赖。
- 当使用 Maven 命令“mvn dependency:tree”来查看项目实际的依赖时【**】
- 发现其中包含SpringMVC框架、SLF4J、Jackson、Hibernate Validator 和 Tomcat 等依赖。这实际上 Spring 推荐的 Web 应用中使用的开源库的组合。
4.3 EnableAutoConfiguration 注解
- EnableAutoConfiguration注解的作用:使SpringBoot根据应用声明的依赖对Spring框架自动配置,减少开发人员工作量;
- “@RestController”和“@RequestMapping”由SpringMVC提供,用于创建Rest服务,与SpringBoot无关。
5.Web开发
5.1 静态资源访问
- Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:
/static
/public
/resources
/META-INF/resources
举例:我们可以在src/main/resources/目录下创建static,在该位置放置一个图片文件。启动程序后,尝试访问http://localhost:8080/imgs/d.jpg。如能显示图片,配置成功。
2.图片固定放在static下,访问时,不用写static目录
3.访问http://localhost:8080/imgs/1.jpg
4.【补充示例】访问带参数的网页
5.2 自动返回json格式数据
- 1.启动启动类
- 2.控制器code
/**
* TODO
* * @author Leonard
* @version 1.0
* @date 2022/2/24 0024 15:40
* @des 创建用户控制器【】
*/
@RestController//【相当于声明Controller - 提共restful 风格】
@RequestMapping("leonard2")//映射路径
public class UserController {
@RequestMapping("{id}")
@ResponseBody//响应体,自动返回json
public UserDao userInfo(@PathVariable(value = "id") Integer id){
UserDao leonard = new UserDao("Leonard", "18");
leonard.setId(id);
return leonard;
}
}
5.3 捕获全局异常
5.3.1 注解
-
@ExceptionHandler 表示拦截异常
-
@ControllerAdvice controller 的一个辅助类,最常用的就是作为全局异常处理的【切面类】
可以指定扫描范围 -
@ResponseBody 进行 json 转换
5.3.2 代码实例
- 定义全局异常类
启动器扫描注解配置需要包含该类,如果不包含无法捕获
@ControllerAdvice//切面控制器
public class GlobalExceptionHandler {
@ExceptionHandler(RuntimeException.class)//捕获运行时异常
@ResponseBody//响应体
public Map<String,Object> exceptionHandle(){
HashMap<String, Object> map = new HashMap<>();
map.put("errorCode",996);
map.put("errorText","系统故障!");
return map;
}
}
- 定义一个RestFul风格异常控制类
@RestController//声明Controller
public class ErrorController {
@RequestMapping("/login")//映射路径
@ResponseBody//响应体
public Map<String,Object> login(String name,String psd){
HashMap<String, Object> map = new HashMap<>();
if("leonard".equals(name) && "123".equals(psd)){
map.put("success",100);
map.put("errorMsg","");
}
//定义异常,执行终止,测试全局异常类捕获异常并输出至web页面
int i = 10/0;
return map;
}
}
- 访问web网页,自动捕获异常
5.4 渲染Web页面
5.4.1 Spring Boot模板引擎
1.Spring Boot提供了默认配置的模板引擎主要有以下几种:
- Thymeleaf
- FreeMarker
- Velocity
- Groovy
- Mustache
2.Spring Boot建议使用这些模板引擎
- 【Springboot+freemarker 】
当使用上述模板引擎中的任何一个,它们默认的模板配置路径为:src/main/resources/templates。
5.4.2 Freemarker的使用
- 引入freeMarker的依赖包.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
- 控制器,返回数据
/**
* TODO
*
* @author Leonard
* @version 1.0
* @date 2022/2/25 0025 15:06
* @des 学生控制器
* @@RestController 写API,提供给移动端,返回json数据
*/
@Controller//多用于后台控制器,有页面,访问freemaker模板必须用这个
@RequestMapping("/student")
public class StudentController {
@RequestMapping("stuList")
public String getList(Map<String,Object> data){
//添加数据
data.put("userName","Leonard");
data.put("Age",18);
ArrayList<StudentDao> List = new ArrayList<>();
List.add(new StudentDao(1,"zs","男"));
List.add(new StudentDao(2,"ls","男"));
List.add(new StudentDao(3,"ys","女"));
data.put("List",List);
return "stu/student";//找模板页面
}
}
- 创建.ftl模板文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
欢迎${userName}登录
<#if Age < 17 >小哥
<#elseif Age <=30>先生
<#else>大叔
</#if>
<table border="1">
<tr>
<td>ID</td>
<td>名字</td>
<td>性别</td>
</tr>
<#list List ?sort_by("id")?reverse as stu>
<tr>
<td> ${stu.id}</td>
<td> ${stu.name}</td>
<td> ${stu.gender}</td>
</tr>
</#list>
</table>
</body>
</html>
- 浏览器访问
5.4.3 SpringBoot使用jsp
忽略…
5.5 数据库访问
5.5.1 SpringBoot使用JDBC
- 1 添加mysql依赖---- pom.xml配置依赖【后续使用Oracle,不使用Mysql】-了解
<!-- JDBC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
- application.properties新增配置
#视图配置
spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp
#数据库配置
spring.datasource.url=jdbc:mysql://localhost:3306/day12
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
-
2.添加Oracle依赖,建立数据库连接,操作数据库—手动导入jar
-
在项目依赖里手动导入Oracle.jar
-
application.properties新增配置
-
Service层(Itf实现)
-
/**
* TODO
*
* @author Leonard
* @version 1.0
* @date 2022/3/2 0002 13:41
* @des
*/
@Service//service组件
public class UserServiceImpl implements IUserService {
@Autowired//自动注入模板
private JdbcTemplate jdbcTemplate;
@Override
public void registerUser(String username, String psd, String email) {
String sql = "select * from ci_order where code_or = '" + username+"'";
jdbcTemplate.execute(sql);
}
}
- Controller层代码
/**
* TODO
* * @author Leonard
* @version 1.0
* @date 2022/3/2 0002 13:47
* @des
*/
@Controller
@RequestMapping("select")
public class UserCtroller2 {
@Autowired
IUserService iUserService;
@RequestMapping("ciorder")
@ResponseBody
public String regist(){
iUserService.registerUser("100101000000108672","","");
return "select ci_order success!";
}
}
- 启动服务
@EnableAutoConfiguration//开启自动配置,不需要写spring的配置文件
@ComponentScan(basePackages = "zqsty")//扫描包
public class StartApp {
public static void main( String[] args )
{
SpringApplication.run(StartApp.class,args);
}
}
- 访问网页
5.5.2 SpringBoot使用MyBatis访问数据库【主要】
5.5.3 SpringBoot整合MyBatis-plus案例入门
项目结构:
-
创建一个SpringBoot项目
-
创建测试数据表User;
create table `user_test1` (
`id` int (11),
`username` varchar (60),
`age` int (11),
`tel` int (11),
`create_time` timestamp ,
`update_time` timestamp ,
`version` int (11)
);
insert into `user_test1` (`id`, `username`, `age`, `tel`, `create_time`, `update_time`, `version`) values('1','张三','18','180',NULL,NULL,NULL);
insert into `user_test1` (`id`, `username`, `age`, `tel`, `create_time`, `update_time`, `version`) values('2','李四','20','137',NULL,NULL,NULL);
insert into `user_test1` (`id`, `username`, `age`, `tel`, `create_time`, `update_time`, `version`) values('3','王五','22','138',NULL,NULL,NULL);
- 添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- lombok:简化开发代码-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- 配置数据源application.properties
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/csdn_test?characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=1
- 创建实体类与Mapper接口
/**
* TODO
*
* @author Leonard
* @version 1.0
* @date 2022/3/7 0007 13:21
* @des lombok写法
* @Data set,get方法
* @NoArgsConstructor 无参构造
* @AllArgsConstructor 全参构造
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
/**
* TODO
*
* @author Leonard
* @version 1.0
* @date 2022/3/7 0007 13:22
* @des @Mapper 声明一个Mapper接口,继承BaseMapper,泛型为当前实体类
* @Component 声明一个组件
*/
@Mapper
@Component
public interface UserMapper extends BaseMapper<User> {
}
- 编写测试类
测试类无法注入Mapper问题解决:【@RunWith(SpringJUnit4ClassRunner.class)】
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)//--tip:解决usermapper空指针问题
public class ApplicationTests {
@Autowired
private UserMapper userMapper;
//查找数据
@Test
public void findAll(){
List<User> userList = userMapper.selectList(null);
System.out.println(userList);
}
//插入数据
@Test
public void test2(){
userMapper.insert(new User((long) 6,"Leo",19,"leo@baomidou.com"));
}
}