SpringBoot采用习惯优于配置的理念快速的搭建项目开发环境,我们无需或者很少进行相关的Spring配置,就能够快速的将项目运行起来
优点:
1.快速构建项目
2.对主流的开发框架都提供无配置集成,无需手动配置
3.项目可以独立运行、无需依赖servlet容器(内置了servlet容器)
4.极大提高了开发、部署效率
5.提供了运行时的监控系统
6.与云计算有天然的集成
缺点:
1.版本迭代速度很快,一些模块改动较大
2.由于配置都是内置的,所以报错时很难定位
3.互联网上现成的解决方案资源并不多
SpringbootDemo1Application 程序入口
resources:1.static(静态资源文件夹 存储图片、css、JS…)2.templates(存放模板资源的目录,thymeleat)3.application.properties(SpringBoot项目的全局配置文件 实际项目开发中通常修改为yaml语言支持 后缀改为yml)
.gitignore:Git过滤配置文件(忽略)
pom.xml(Maven的依赖管理配置文件)
1.SpringBoot项目创建使用了一个全局配置文件application.properties进行项目相关的配置
2.如果Spring默认的设置无法满足要求,就可以进行修改
# application.properties文件中配置的 key 必须遵守SpringBoot的要求 # 应用名称 spring.application.name=SpringBoot-Demo1 # 应用服务 WEB 访问端口 server.port=8080
3.SpringBoot默认的属性设置
4.全局配置文件格式也支持yml,并且在开发的过程中也经常使用yml格式进行配置(yaml语言)
application.properties 和 application.yml 对比
application.properties
# 应用服务 WEB 访问端口
server.port=8080
# 配置全局路径
server.servlet.context-path=/demo1
spring.datasource.url=1
spring.datasource.username=1
spring.datasource.password=1
spring.datasource.driver-class-name=1
application.yml
server:
port:8080
sevlet:
context-path: /demo1
spring:
datasource:
url: 1
user-name:(空格)1
password: 1
driver-class-name: 1
四、Java配置方式
对于SpringBoot提倡的是无xml文件管理
1.如何将一个类交给Spring容器管理呢?
1.xml
@Component
3.Java配置
基于Java的配置方式
闯将config包,下创建MyConfig类
package com.example.springbootdemo1.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Date;
//加上@Configuration相当于一个配置文件
@Configuration
public class MyConfig {
//在Spring容器中引入Data对象
@Bean
public Date getData(){
return new Date();
}
}
五、Starter POM
Starter POM,是指在pom文件中配置的SpringBoot提供的starter
1.一个Stater我们就可以理解为对一种开发场景的支持
2.SpringBoot为我们提供了简化企业级开发绝大多数场景的支持(多个StarterPOM),在我们的项目中只要使用了对应场景的StarterPOM,相关的技术配置就会被内置进来,同时我们就可以获得SpringBoot为我们提供的内置的Bean
例:
在pom.xml引入redis对应的starter
org.springframework.boot spring-boot-starter-data-redis
在servcie中就可以直接使用SpringBoot内置的基于redis的开发场景(直接使用bean)
@Service
public class RedisService {
@Resource
private RedisTemplate redisTemplate;
}
3.SpringBoot支持绝大多数的主流框架(提供对应的starter)
六、SpringBoot常用注解 6.1 @SpringBootApplicationSpringBoot项目都有一个Applicatin入口类,入口类中都是有main方法的,在此添加@SpringBootApplicatin表示是当前应用的入口程序
@SpringBootApplicatin是一个组合注解:
@SpringBootConfiguration:继承了@Configuration注解,并且作用一致,都是用来声明当前类为一个Java配置类
@EnableAutoConfiguration:启用SpringBoot内置的自动配置功能
@ComponentScan:扫描bean,扫描范围是当前应用的入口程序所在的包
继承了@Configuration注解,并且作用一致,都是用来声明当前类为一个Java配置类
6.3 @EnableAutoConfiguration启用SpringBoot内置的自动配置功能
6.4 @ComponentScan扫描bean,扫描范围是当前应用的入口程序所在的包
6.5 IoC注解 6.5.1 组件注册@Component 普通组件注册 把这个类注册到Spring里面
@Controller MVC控制层注解
@Service 业务逻辑层组件注册
@Repository 持久层组件注册
@Autowired/@Inject:类型注入
@Qualifier:名字注入
@Resouce:名字注入
@Scope
@PostConstruct
@PreDestory
@Controller
@RestController
@RequestMapping
@RequestBody
@ResponseBody
@PathVariable
SpringBoot项目本身就是依赖于Spring的,所以当我们创建SpringBoot之后,Spring的支持就默认导入了,也就是说,只要SpringBoot项目能够启动就默认支持Spring(IoC/AOP)
7.2 SpringMVC支持 7.3 Druid支持1.添加依赖 druid-spring-boot-starter(1.1.10)
com.alibaba druid-spring-boot-starter 1.1.10
2.添加mysql数据库驱动依赖
mysql mysql-connector-java 5.1.47
3.在全局配置文件中配置数据库连接池
spring:
datasource:
druid:
url: jdbc:mysql://localhost:3306/db2
dirver-class-name: com.mysql.cj.jdbc.Driver
username: root
password:
initial-size: 1
min-idle: 3
max-active: 20
mybatis:
mapper-locations: classpath:mappers/*Mapper.xml
type-aliases-package: com.example.springbootssm.beans
7.4 MyBatis支持
1.添加MyBatis依赖
org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.3
2.在全局配置文件中配置
mybatis: mapper-locations: classpath:mappers/*Mapper.xml type-aliases-package: com.example.springbootssm.beans7.5 测试
1.创建数据表
create table tb_book(
book_id int primary key auto_increment,
book_name varchar(100) not null,
book_author varchar(50) not null,
book_price float not null,
book_desc varchar(200)
)
2.创建实体类
public class Book {
private int bookId;
private String bookName;
private String bookAuthor;
private double bookPrice;
private String bookDesc;
}
3.创建DAO接口
public interface BookDAO {
void insertBook(Book book);
List listBooks();
}
4.创建映射文件
7.6 Mapper注册5.单元测试 ```java package com.example.springbootssm.dao; import com.example.springbootssm.SpringbootSsmApplication; import com.example.springbootssm.beans.Book; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; import java.util.List; @RunWith(SpringRunner.class) @SpringBootTest(classes = SpringbootSsmApplication.class) public class BookDAOTest { @Resource private BookDAO bookDAO; @Test public void testInsertBook(){ Book book = new Book(0,"C++","赵武",22.2,"暂无"); bookDAO.insertBook(book); System.out.println(book.getBookId()); } @Test public void testListBooks(){ List insert into tb_book (book_name,book_author,book_price,book_desc) values (#{bookName},#{bookAuthor},#{bookPrice},#{bookDesc}); select book_name,book_author,book_price,book_desc from tb_book books = bookDAO.listBooks(); for(Book i : books){ System.out.println(i); } } }
方案一:在DAO接口添加 @Mapper
方案二:在application添加 @MapperScan(basePackages = "com.example.springbootssm.dao")
1.创建全局异常处理类,添加@ControllerAdvice
2.在异常处理类中提供处理方法
package com.example.springbootssm.utils;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler
@ResponseBody
public String exceptionHanler(Exception e){
String message = e.getMessage();
System.out.println("----------" + message);
//根据不同的异常类型进行不同的处理
return message;
}
}
八、Thymeleaf
Thymeleaf是一个用于前端数据显示的模板引擎,完全可以替代jsp同时弥补了jsp的不足
特点:
1.基于HTML的动态网页(一个thymeleaf就是一个HTML页面)
2.基于浏览器运行可以看到静态效果,同时基于服务器运行的时候可以动态显示数据
3.开发便捷、效率高
1.配置相关参数
2.创建控制器
package com.lxr.springbootthymeleaf.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TestController {
@RequestMapping("/test")
public String test1(Model model){
System.out.println("nulllllll");
model.addAttribute("str","从控制器传递到页面的参数");
return "index";
}
}
3.创建对应的HTML
HTML文件放在emplates
在HTML文件的html标签中引入th命名空间
通过th标签可以获取动态数据(从控制器传递到HTML数据)
Title
123
8.2 Thymeleaf的基本语法
8.2.1 获取变量值
1.简单数据
2.对象数据
算术运算,关系运算,三元运算 都可以
8.2.3 *号的使用
代表object这个对象
8.2.4 内敛使用
1.可以在HTML标签里面完成取值
2.在javascript中获取传递的值
3.在style标签内部取值
8.3 流程控制 8.3.1 分支语句(条件)
1.if:条件成立执行
2.unless:条件不成立执行
3.switch
1
2
......
前面都不成立
8.3.2 循环语句
| 编号 | 名称 | 作者 | 价格 |
|---|---|---|---|
碎片指的是html片段,我们可以将多个页面使用的相同的GTML标签部分单独定义(head.html、foot.html),然后通过th:include可以在需要使用这个HTML片段的页面进行引用
就是可以拼接页面
head.html 碎片1
foot.html 碎片2
页面1: 当前页面8.4.2 使用
1.引用页面
Title
.......
include是使用碎片标签中的内容填充当前标签
replace是使用碎片标签替代当前标签
2.head页面
Title
this is header!
九、SpringBoot的热部署配置
9.1 什么是热部署?
项目首次部署,服务器启动后,如果项目发生了更改就自动的完成jar的更新,而无需重写手动启服务器。
9.2 热部署配置 9.2.1 IDE配置(idea)1.File—>Settings->compiler–>勾选Build project automatically
2.返回页面 然后找到Registry 勾选compiler.automake.allow.when.app.running
1.添加依赖:
org.springframework.boot spring-boot-devtools true
2.配置Maven插件:
org.springframework.boot spring-boot-maven-plugin 2.3.7.RELEASE com.lxr.springbootthymeleaf.SpringbootThymeleafApplication true repackage repackage
3.配置服务器更新范围
1.MyBatis完成持久化操作需要:建库建表,创建实体类bean,创建Mapper接口(DAO接口),创建并配置映射文件
2.tkMapper是一个MyBatis插件,是在MyBatis的基础上提供了很多工具,让开发变得更高效
3.针对单表操作可以实现无操作配置(不用写在映射文件-不用写SQL)
4.支持逆向工程(根据数据表生成beans、生成mapper接口、映射文件)
1.整合数据库连接池
com.alibaba druid-spring-boot-starter 1.1.10 mysql mysql-connector-java 5.1.47
spring:
datasource:
druid:
url: jdbc:mysql://localhost:3306/db2
dirver-class-name: com.mysql.cj.jdbc.Driver
username: root
password:
initial-size: 1
min-idle: 3
max-active: 20
2.整合tkMapper
tk.mybatis mapper-spring-boot-starter 2.1.5
mybatis: mapper-locations: classpath:mappers/*Mapper.xml type-aliases-package: com.lxr.springboottkmapper.beans
3.创建GeneralMapper接口
import tk.mybatis.mapper.common.Mapper; import tk.mybatis.mapper.common.MySqlMapper; //此GeneralMapper不能被@MapperScan扫描到 public interface GeneralMapperextends Mapper , MySqlMapper { }
4.在SpringBoot应用启动类添加MapperScan注解
添加tk.mybatis包的注解
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan;
@SpringBootApplication
@MapperScan(basePackages = "com.lxr.springboottkmapper.dao")
public class SpringbootTkmapperApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootTkmapperApplication.class, args);
}
}
10.3 tkMapper使用
1.创建数据表
create table book(
book_id int primary key auto_increment,
book_name varchar(100) not null ,
book_author varchar(20) not null,
book_price float not null,
book_desc varchar(200)
);
2.创建Bean(所有的属性如果是简单类型则使用其对应的封装类,否则不会生成sql)
package com.lxr.springboottkmapper.beans;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
//如果不一致
//@Table(name = "数据库表的名字")
public class Book {
//注意主键声明@Id
@Id
//@Column(name = "数据库表里的名字")
private Integer bookId;
private String bookName;
private String bookAuthor;
private Double bookPrice;
private String bookDesc;
}
3.创建DAO接口
创建接口,继承tk包提供的Mapper接口和MySQLMapper接口
指定当前DAO接口要操作的bean
package com.lxr.springboottkmapper.dao; import com.lxr.springboottkmapper.beans.Book; import tk.mybatis.mapper.common.Mapper; import tk.mybatis.mapper.common.MySqlMapper; public interface BookDAO extends Mapper, MySqlMapper { //定义需要完成的操作方法 }
4.测试使用
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootTkmapperApplication.class)
public class BookDAOTest {
@Resource
private BookDAO bookDAO;
//测试添加操作
@Test
public void testInsert(){
Book book = new Book(0,"Java","wangwu",22.2,"none");
int i = bookDAO.insert(book);
System.out.println(i);
}
}
10.4 删改
1.删
public void testDelete(){
//1.根据主键删除一条数据
//int i = bookDAO.deleteByPrimaryKey(1);
//Example类用来构造删除函数、修改及查询操作的条件
Example example = new Example(Book.class);
Example.Criteria criteria = example.createCriteria();//内部类
//通过criteria对象构造执行条件
criteria.andEqualTo("bookName","C++");
//可以多条件查询
criteria.orEqualTo("bookAuthor","zhangsan");
criteria.orBetween("bookPrice",10,20);
//3.直接通过sql写
//criteria.andCondition("name = 'Java' and ...");
//根据指定的条件进行删除
int i = bookDAO.deleteByExample(example);
System.out.println(i);
}
2.改
public void testUpdate(){
Book book = new Book(7,"Java","zhangsan",22.22,"无");
//1.根据bean中的主键修改(bean对象中一定要有@Id声明的主键)
int i =bookDAO.updateByPrimaryKey(book);
//2.修改满足example指定的条件的数据
//bookDAO.updateByExample(book,example)
System.out.println(i);
}
10.5 查
@Test
public void testSelect(){
//1.返回数据表中的记录
int i = bookDAO.selectCount(new Book());
//查询满足条件的图书信息记录数
//int j = bookDAO.selectCountByExample(example);
System.out.println(i);
//2.查询所有的图书信息
List books = bookDAO.selectAll();
System.out.println(books);
//3.根据主键查询一条记录
Book book = bookDAO.selectByPrimaryKey(3);
//4.根据指定的条件进行查询
//List books1 = bookDAO.selectByExample(exmale);
}
@Test
public void testPage(){
int pageNum = 1;
int pageSize = 3;
RowBounds rowBounds = new RowBounds((pageNum-1)*pageSize,pageSize);
//无条件分页查询
List books = bookDAO.selectByRowBounds(new Book(),rowBounds);
for(Book i :books){
System.out.println(i);
}
//带条件分页查询
//List books1 = bookDAO.selectByExampleAndRowBounds(example,rowBounds);
}
10.6 逆向工程
根据数据表生成bean、DAO和Mapper
十一、Swagger


