springboot+mybatisplus
1.什么是springboot?
Spring Boot是一个用于快速构建Spring应用程序的框架。它旨在帮助开发人员快速搭建Spring框架,减少配置和繁琐的工作。Spring Boot继承了原有Spring框架的优秀基因,使Spring在使用中更加方便快捷。 在Spring Boot中集成ActiveMQ,需要导入相应的starter依赖。Spring Boot并不是用来替代Spring的解决方案,而是和Spring框架紧密结合,旨在提升Spring开发者的体验.
SpringBoot基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。 另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。
2.springboot的主要优点
(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
(2)内嵌Tomcat或Jetty等Servlet容器;
(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
(4)尽可能自动配置Spring容器;
(5)提供准备好的特性,如指标、健康检查和外部化配置;
(6)绝对没有代码生成,不需要XML配置。
3.如何使用springboot搭建工程
3.1第一种快速搭建-----必须联网
使用maven来搭建。
3.2忽略文件
如果一开始创建显示很多可以设置忽略一些无用的
3.3 编写controller代码
@RestController
@RequestMapping("/hello")
public class HelloController {
@GetMapping("/index") //java对象--转换为json必须引入jackson
public Map<String,Object> index(){
Map<String,Object> map=new HashMap<>();
map.put("name","zzh");
map.put("age",15);
map.put("sex","ლ(′◉❥◉`ლ)");
return map;
}
}
编写完代码发现,Java对象在转为json时需要加json依赖,但是我们没有导入json依赖是因为starter有,这就体现出了springboot的优点,省事!
运行主启动类
注意: controller包必须在主启动类所在包下。 默认扫描的包为主启动类所在的包。
手动输入地址打印结果
3.4注意: controller包必须在主启动类所在包下。 默认扫描的包为主启动类所在的包。
1.如果把主启动类放在了test包下,那么扫描路径就是com.aaa.test,controller包就访问不到主启动类了
2. 解决: @ComponentScan(basePackages={ , , ...})
加上controller层和实体层的路径
3.5springboot的相关配置
1.parent
相当于把父类的一些依赖继承到子类里 点进去看
<!--parent: 继承-->
<!--springBoot版本高,后期jdk版本也要对应 springCloud 以及springCloud alibaba-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
父类又继承了一个父类 再点进去看
2.properties
声明jar包的版本号--好处:方便jar版本的统一管理
举个例子:
比如说现在spring的配置是5.2.12,一旦要发生改变,那么下边的其他版本号都需要修改
3.使用 properties + version 统一版本
好处是方便了统一管理,而且发生版本的修改,我们只需要修改上面的版本号就可以了,非常方便,
引入的时候使用${}引用相对应的版本号
4. dependencyManagement
只负责jar版本的管理,不负责jar的下载.以后springboot工程在使用jar时,只需要指定jar的坐标无需指定版本号
好处:把版本都交给父类,让父类统一管理,做到jar包统一,加上后就不会去下载jar包
注意:引入mysql
引入父类mysql的时候,spingBoot版本
2.6引用的是mysql-connector-java
2.7开始才是 mysql-connector-j
只需要引坐标,无需引版本号
注意:父类没有的需要自己下载版本号
如果非要用自己下载的版本号,那么优先会用自己的版本
5. 修改端口号和上下文路径
#内置tomcat默认端口号为8080---修改端口号
server.port=你自己要修改的端口号
#工程的上下文路径
server.servlet.context-path=/你自己要修改的上下文
3.6第二种搭建springBoot 了解即可
没有网---只能用本地的时候
1.创建一个maven工程
2.pom引入依赖
3.创建一个springboot配置文件--application.properties
4. 创建主启动类
编写controller测试
结果
什么情况下会用第二种?
银行、监狱 等项目
4.java读取springboot配置文件中的内容
4.1springboot配置文件的种类
springboot 提供了两种格式的配置文件,作用都一样,内容格式不同,一般用第二种多
第一种:属性文件 后缀: properties
#内置tomcat默认端口号为8080---修改端口号
server.port=8888
#工程的上下文路径
server.servlet.context-path=/aaa
第二种:yaml文件 后缀:yml
注意:要有缩进关系,而且内容和键之间要有空格
#端口号
server:
port: 8080
servlet:
context-path: /bbb
没有会空格报错
如果上面两个配置文件的内容相同并且同时存在:以properties配置为主,如果上面配置文件的内容不同,都能用
4.2如何读取springboot配置文件中的内容
比如我们使用OSS完成文件上传时,之前把OSS相关的内容密钥,bucket等信息都写在java代码,在实际开发中肯定不允许。因为属于硬编码。以后项目上线后密钥和bucket等信息都需要改为客户。都需要修改了源码。 以后写都应该提取到配置文件中。我们掌握如何java代码读取配置文件中的内容。
比如:
你打包的时候,打开都是class文件
而你的配置不是,可以直接去修改客户的配置
在spring中提供了两个方式读取:
第一种:@Value
特点:每次只能获取一个值
思考: 它只能一个一个的读取。能否封装一个实体类,把读取的内容放入实体类属性中。
第二种:@ConfigurationProperties
1. application.properties自定义属性
区别在于一下可以读到多个属性
#自定义属性
student.name=zzh3.0
student.age=666
@Data
@Component //该类对象的创建交于spring容器来管理,spring帮你创建Student类对象-----等价于@Service @Controller
@ConfigurationProperties(prefix = "student")//读取配置文件中前缀为student的,如果属性能对上就会赋值配置文件中的属性,不加就不没有值
public class Student {
private String name;
private Integer age;
}
@Autowired
private Student student;
@GetMapping("getStudent")
public Student getStudent(){
return student;
}
2.注意:
如果在这里定义一个数组
第一种@Value只能读取配置文件中基本类型和字符串类型,读取数组就会报错。
第二种@ConfigurationProperties可以读取任意类型的值
3.application.yml格式自定义属性
测试
在这里推荐个网址可以自动yml和properties属性互相转换
在线yaml转properties-在线properties转yaml-ToYaml.com
5. springboot注册web组件
servlet:-----(1)定义一个Servlet类 (2)重写doGet和doPost方法 (3)把自定义的serlvet注册到web.xml文件。
filter: ----(1)定义一个filter类 (2)dofilter方法 (3)把自定义的过滤器注册到web.xml
思考: 我们现在的springboot工程没有web.xml文件了。
如何把自定义或者第三方的过滤器注册到tomcat容器中。
5.1 注册自定义的Servlet
(1)自定义一个Servlet并重写doGet和doPost方法
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("执行了doGet方法");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("执行了doPost方法");
}
}
(2)把自定义的Servlet注册到内置tomcat中。
@Configuration//这是一个配置类,替代以前的配置文件xml。配置类本身也是容器中的组件
public class MyConfiguration {
@Bean//相当于spring配置文件中<bean class="">把该方法返回的对象交给与spring容器来管理
/*servlet注册器*/
public ServletRegistrationBean<Servlet> registrationBean(){
ServletRegistrationBean<Servlet> registrationBean=new ServletRegistrationBean<>();//创建servlet注册器交给Bean
registrationBean.setServlet(new MyServlet());//把自己的servlet放进去
registrationBean.setName("my");//放名字
registrationBean.addUrlMappings("/my");//添加路径 http://localhost:8080/my
return registrationBean;//返回
}
}
(3)测试
5.2 注册自定义过滤器
(1)创建一个过滤器类并重写相应的方法。
/*自定义过滤器*/
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("经过了过滤器");
filterChain.doFilter(servletRequest,servletResponse);//过滤器放行
}
}
(2)把自定义的过滤器注册到内置的tomcat中
//自定义过滤器
@Bean
public FilterRegistrationBean<Filter> registrationBean2(){
FilterRegistrationBean<Filter> registrationBean=new FilterRegistrationBean<>();
registrationBean.setFilter(new MyFilter());
registrationBean.setName("myFilter");
registrationBean.addUrlPatterns("/*","/my02");
return registrationBean;
}
(3)测试
没有返回结果是因为没有放行
放行
/*自定义过滤器*/
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("经过了过滤器");
filterChain.doFilter(servletRequest,servletResponse);//过滤器放行
}
}
6. springboot自动包扫描的原理
(1)@SpringBootApplication 注解
查看@SpringBootApplication注解---它是一个复合注解
(2)@EnableAutoConfiguration注解
它有两层含义
第一层含义:自动包扫描
第二层含义:自动配置
查看@EnableAutoConfiguration注解---它也是复合注解
(3)@AutoConfigurationPackage注解
查看@AutoConfigurationPackage注解
(4)Registrar.class
查看Registrar.class并打上断点
再查看getPackageNames并打上断点
启动主启动类
可以发现我们的包名是com.aaa
对比主启动类的的位置确实是在com.aaa
(5) 自定义扫描包@ComponentScan
如果我们把主启动类移到其他层下
但是我们就访问不到controller层,因为默认就成了扫描servlet里面的controller,但是servlet没有,只有com.aaa下有controller的包和controller层
加上@ComponentScan注解指定controller和实体类包的位置,对比的是springmvc的配置
就可以访问到了
7.springboot自动装配原理
我们在使用springboot时,并没有像之前项目加载我们的前端控制DispatcherServlet,也没有写编码过滤器。但是springboot可以完成请求以及编码的设置。
原理: 主启动类上的@SpringBootApplication注解上,而该注解是一个复合组件,而在复合注解中存在@EnableAutoConfiguration, 这个@EnableAutoConfiguration注解也是一个复合注解,包含@Import---而@Import注解导入一个AutoConfigurationImportSelector 【自动配置选择器】,在该类中存在一个方法getAutoConfigurationEntry --作用:得到自动配置类的实体。而这些自动配置类会完成相应的自动装配。
(1) 查看主启动类
(2) 查看@EnableAutoConfiguration注解
(3) 查看AutoConfigurationImportSelector.class
(4)在getAutoConfigurationEntry打上断点
随着springboot版本不同,默认加载的数量也不同
8. springboot整合数据源--连接数据库
连接我们的数据库----druid数据源----默认的数据源
1.设置默认的数据源
(1)引入相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--mysql驱动 springBoot 2.7开始是-j 2.6才是-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
(2) 如果没有配置会报错
springboot自动配置会加载jdbc的自动配置类---读取springboot配置文件中数据源的信息,从而完成数据源的自动配置,如果没有配置就会是下面的报错得信息
(3)原因
在获取自动配置类上打上断点会发现自动装配了DataSource数据源
按两下shift键全局搜索DataSourceAutoConfiguration配置类
@EnableConfigurationProperties会加载数据源的属性,查看DataSourceProperties.class配置类
读取配置文件中前缀为spring.datasource的内容,没有就会抛出8.1.(2)图片的异常
(4)application配置文件中配置数据源.
#配置数据源---默认数据源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=(你数据库的账户)
spring.datasource.password=(你数据库的密码)
spring.datasource.url=jdbc:mysql://localhost:3306/(你数据库的名)?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
(5)测试
@SpringBootTest
class Qy168Springboot03ApplicationTests {
@Autowired
private DataSource dataSource;//springboot帮你完成数据源的自动装配,自动加载到容器中
@Test
void contextLoads() throws SQLException {
System.out.println(dataSource.getConnection());//没有就会报空
}
}
输出结果
2.设置Druid的数据源
(1)引入相关依赖
<!--druid数据源的依赖,父类没有提供版本管理,需要自己加版本号-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.1</version>
</dependency>
(2)修改配置文件
#配置数据源---加了druid的数据源
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.username=(你数据库的账户)
spring.datasource.druid.password=(你数据库的密码)
spring.datasource.druid.url=jdbc:mysql://localhost:3306/(你数据库的名)?serverTimezone=Asia/Shanghai
#初始化的连接池的个数
spring.datasource.druid.initial-size=5
#最多连接数量
spring.datasource.druid.max-active=10
#等待的连接数量---超出最多连接数就会等待
spring.datasource.druid.max-wait=5
(3)测试
默认放了五个连接数
9.springboot整合mybatis框架
ssm===>spring框架需要配置SqlSesssionFactoryBean对象,还有配置DAO接口的代理实现类。
springboot会自动配置SqlSesssionFactoryBean对象,必须引入starter依赖
(1)引入依赖
<!--mybatis和springBoot整合的依赖 里面有jdbc的依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
整合的依赖里面有jdbc的依赖,就可以不加jdbc的依赖,加上也不会报错,优先使用你加jdbc的依赖
(2) 创建实体类
package com