商丘河南网站建设,Wordpress加720云vr,网站建设的方向和任务,全国小学网站建设Springboot入门教程详解 博客主页#xff1a;划水的阿瞒的博客主页 欢迎关注#x1f5b1;点赞#x1f380;收藏⭐留言✒ 系列专栏#xff1a;Springboot入门教程详解首发时间#xff1a;#x1f39e;2024年1月29日#x1f3a0; 如果觉得博主的文章还不错的话#xff0c…Springboot入门教程详解 博客主页划水的阿瞒的博客主页 欢迎关注点赞收藏⭐留言✒ 系列专栏Springboot入门教程详解首发时间2024年1月29日 如果觉得博主的文章还不错的话请三连支持一下博主哦 文章目录 学习目标1. 了解SpringBoot1.1.什么是SpringBoot1.2.为什么要学习SpringBoot1.3.SpringBoot的特点 2.快速入门2.1.创建工程2.2.添加依赖2.2.1.添加父工程坐标2.2.2.添加web启动器2.2.3.管理jdk版本2.2.4.完整pom 2.3.启动类2.4.编写controller2.5.启动测试 3.Java配置3.1.回顾历史3.2.尝试java配置3.3.SpringBoot的属性注入3.4、更优雅的注入 4.自动配置原理掌握4.1.了解SpringBootApplication4.1.1.SpringBootConfiguration4.1.2.EnableAutoConfiguration4.1.3.ComponentScan 4.2.默认配置原理4.2.1默认配置类4.2.2.默认配置属性 4.3.总结 5.SpringBoot实践5.1.整合SpringMVC5.1.1.修改端口5.1.2.访问静态资源5.1.3.添加拦截器 5.2.整合jdbc和事务5.3.整合连接池5.4.整合mybatis5.4.1.mybatis5.4.2.通用mapper5.4.3.Service 5.5.启动测试 6.Thymeleaf快速入门6.1.为什么是Thymeleaf6.2.编写接口6.3.引入启动器6.4.静态页面6.5.测试6.6.模板缓存 学习目标 了解SpringBoot的作用 了解java配置的方式(难点)熟悉SpringBoot自动配置原理(面试重点)掌握SpringBoot的基本使用了解Thymeleaf的基本使用 1. 了解SpringBoot
在这一部分我们主要了解以下3个问题
什么是SpringBoot为什么要学习SpringBootSpringBoot的特点
1.1.什么是SpringBoot
SpringBoot是Spring项目中的一个子工程与我们所熟知的Spring-framework 同属于spring的产品: 我们可以看到下面的一段介绍
Takes an opinionated view of building production-ready Spring applications. Spring Boot favors convention over configuration and is designed to get you up and running as quickly as possible.
翻译一下
用一些固定的方式来构建生产级别的spring应用。Spring Boot 推崇约定大于配置的方式以便于你能够尽可能快速的启动并运行程序。
其实人们把Spring Boot 称为搭建程序的脚手架。其最主要作用就是帮我们快速的构建庞大的spring项目并且尽可能的减少一切xml配置做到开箱即用迅速上手让我们关注与业务而非配置。
1.2.为什么要学习SpringBoot
java一直被人诟病的一点就是臃肿、麻烦。当我们还在辛苦的搭建项目时可能Python程序员已经把功能写好了究其原因注意是两点
复杂的配置 项目各种配置其实是开发时的损耗 因为在思考 Spring 特性配置和解决业务问题之间需要进行思维切换所以写配置挤占了写应用程序逻辑的时间。一个是混乱的依赖管理。 项目的依赖管理也是件吃力不讨好的事情。决定项目里要用哪些库就已经够让人头痛的了你还要知道这些库的哪个版本和其他库不会有冲突这难题实在太棘手。并且依赖管理也是一种损耗添加依赖不是写应用程序代码。一旦选错了依赖的版本随之而来的不兼容问题毫无疑问会是生产力杀手。
而SpringBoot让这一切成为过去
Spring Boot 简化了基于Spring的应用开发只需要“run”就能创建一个独立的、生产级别的Spring应用。Spring Boot为Spring平台及第三方库提供开箱即用的设置提供默认设置存放默认配置的包就是启动器这样我们就可以简单的开始。多数Spring Boot应用只需要很少的Spring配置。
我们可以使用SpringBoot创建java应用并使用java –jar 启动它就能得到一个生产级别的web工程。
1.3.SpringBoot的特点
Spring Boot 主要目标是
为所有 Spring 的开发者提供一个非常快速的、广泛接受的入门体验开箱即用启动器starter-其实就是SpringBoot提供的一个jar包但通过自己设置参数.properties即可快速摆脱这种方式。提供了一些大型项目中常见的非功能性特性如内嵌服务器、安全、指标健康检测、外部化配置等绝对没有代码生成也无需 XML 配置。
更多细节大家可以到官网查看。
2.快速入门
接下来我们就来利用SpringBoot搭建一个web工程体会一下SpringBoot的魅力所在
2.1.创建工程
我们先新建一个空的工程 工程名为demo 新建一个module 使用maven来构建 然后填写项目坐标 目录结构 项目结构
2.2.添加依赖
看到这里很多同学会有疑惑前面说传统开发的问题之一就是依赖管理混乱怎么这里我们还需要管理依赖呢难道SpringBoot不帮我们管理吗
别着急现在我们的项目与SpringBoot还没有什么关联。SpringBoot提供了一个名为spring-boot-starter-parent的工程里面已经对各种常用依赖并非全部的版本进行了管理我们的项目需要以这个项目为父工程这样我们就不用操心依赖的版本问题了需要什么依赖直接引入坐标即可
2.2.1.添加父工程坐标 parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.0.0.RELEASE/version//aliyun中央仓库中没有这个版本了可以换成2.3.0.RELEASE/parent2.2.2.添加web启动器
为了让SpringBoot帮我们完成各种自动配置我们必须引入SpringBoot提供的自动配置依赖我们称为启动器。因为我们是web项目这里我们引入web启动器 dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency/dependencies需要注意的是我们并没有在这里指定版本信息。因为SpringBoot的父工程已经对版本进行了管理了。
这个时候我们会发现项目中多出了大量的依赖
这些都是SpringBoot根据spring-boot-starter-web这个依赖自动引入的而且所有的版本都已经管理好不会出现冲突。
2.2.3.管理jdk版本
默认情况下maven工程的jdk版本是1.5而我们开发使用的是1.8因此这里我们需要修改jdk版本只需要简单的添加以下属性即可 propertiesjava.version1.8/java.version/properties2.2.4.完整pom
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.leyou.demo/groupIdartifactIdspringboot-demo/artifactIdversion1.0-SNAPSHOT/versionpropertiesjava.version1.8/java.version/propertiesparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.0.0.RELEASE/version/parentdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency/dependencies
/project2.3.启动类
Spring Boot项目通过main函数即可启动我们需要创建一个启动类
然后编写main函数
SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}2.4.编写controller
接下来我们就可以像以前那样开发SpringMVC的项目了
我们编写一个controller
代码
RestController
public class HelloController {GetMapping(hello)public String hello(){return hello, spring boot!;}
}2.5.启动测试
接下来我们运行main函数查看控制台
并且可以看到监听的端口信息
1监听的端口是80802SpringMVC的映射路径是/3/hello路径已经映射到了HelloController中的hello()方法
打开页面访问http://localhost:8080/hello
测试成功了
3.Java配置
在入门案例中我们没有任何的配置就可以实现一个SpringMVC的项目了快速、高效
但是有同学会有疑问如果没有任何的xml那么我们如果要配置一个Bean该怎么办比如我们要配置一个数据库连接池以前会这么玩
!-- 配置连接池 --
bean iddataSource classcom.alibaba.druid.pool.DruidDataSourceinit-methodinit destroy-methodcloseproperty nameurl value${jdbc.url} /property nameusername value${jdbc.username} /property namepassword value${jdbc.password} /
/bean现在该怎么做呢
3.1.回顾历史
事实上在Spring3.0开始Spring官方就已经开始推荐使用java配置来代替传统的xml配置了我们不妨来回顾一下Spring的历史
Spring1.0时代 在此时因为jdk1.5刚刚出来注解开发并未盛行因此一切Spring配置都是xml格式想象一下所有的bean都用xml配置细思极恐啊心疼那个时候的程序员2秒Spring2.0时代 Spring引入了注解开发但是因为并不完善因此并未完全替代xml此时的程序员往往是把xml与注解进行结合貌似我们之前都是这种方式。Spring3.0及以后 3.0以后Spring的注解已经非常完善了因此Spring推荐大家使用完全的java配置来代替以前的xml不过似乎在国内并未推广盛行。然后当SpringBoot来临人们才慢慢认识到java配置的优雅。
有句古话说的好拥抱变化拥抱未来。所以我们也应该顺应时代潮流做时尚的弄潮儿一起来学习下java配置的玩法。
3.2.尝试java配置
java配置主要靠java类和一些注解比较常用的注解有
Configuration声明一个类作为配置类代替xml文件Bean声明在方法上将方法的返回值加入Bean容器代替标签value属性注入代替了标签PropertySource指定外部属性文件例如db.properties
我们接下来用java配置来尝试实现连接池配置
首先引入Druid连接池依赖
dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.1.6/version
/dependency创建一个jdbc.properties文件编写jdbc属性
jdbc.driverClassNamecom.mysql.jdbc.Driver
jdbc.urljdbc:mysql://127.0.0.1:3306/test
jdbc.usernameroot
jdbc.passwordroot然后编写代码
Configuration
PropertySource(classpath:jdbc.properties)
public class JdbcConfig {Value(${jdbc.url})String url;Value(${jdbc.driverClassName})String driverClassName;Value(${jdbc.username})String username;Value(${jdbc.password})String password;Beanpublic DataSource dataSource() {DruidDataSource dataSource new DruidDataSource();dataSource.setUrl(url);dataSource.setDriverClassName(driverClassName);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}
}解读
Configuration声明我们JdbcConfig是一个配置类PropertySource指定属性文件的路径是:classpath:jdbc.properties通过Value为属性注入值通过Bean将 dataSource()方法声明为一个注册Bean的方法Spring会自动调用该方法将方法的返回值加入Spring容器中。
然后我们就可以在任意位置通过Autowired注入DataSource了
我们在HelloController中测试
RestController
public class HelloController {Autowiredprivate DataSource dataSource;GetMapping(hello)public String hello() {return hello, spring boot! dataSource;}
}然后Debug运行并查看
属性注入成功了
3.3.SpringBoot的属性注入
在上面的案例中我们实验了java配置方式。不过属性注入使用的是Value注解。这种方式虽然可行但是不够强大因为它只能注入基本类型值。
在SpringBoot中提供了一种新的属性注入方式支持各种java基本数据类型及复杂类型的注入。
1我们新建一个类用来进行属性注入
ConfigurationProperties(prefix jdbc)
public class JdbcProperties {private String url;private String driverClassName;private String username;private String password;// ... 略// getters 和 setters
}在类上通过ConfigurationProperties注解声明当前类为属性读取类prefixjdbc读取属性文件中前缀为jdbc的值。在类上定义各个属性名称必须与属性文件中jdbc.后面部分一致需要注意的是这里我们并没有指定属性文件的地址所以我们需要把jdbc.properties名称改为application.properties这是SpringBoot默认读取的属性文件名
2在JdbcConfig中使用这个属性
Configuration
EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfig {Beanpublic DataSource dataSource(JdbcProperties jdbc) {DruidDataSource dataSource new DruidDataSource();dataSource.setUrl(jdbc.getUrl());dataSource.setDriverClassName(jdbc.getDriverClassName());dataSource.setUsername(jdbc.getUsername());dataSource.setPassword(jdbc.getPassword());return dataSource;}
}通过EnableConfigurationProperties(JdbcProperties.class)来声明要使用JdbcProperties这个类的对象然后你可以通过以下方式注入JdbcProperties Autowired注入 Autowired private JdbcProperties prop;构造函数注入 private JdbcProperties prop; public JdbcConfig(Jdbcproperties prop){ this.prop prop; }声明有Bean的方法参数注入 Bean public Datasource dataSource(JdbcProperties prop){ // … }
本例中我们采用第三种方式。
3测试结果
大家会觉得这种方式似乎更麻烦了事实上这种方式有更强大的功能也是SpringBoot推荐的注入方式。两者对比关系
优势
Relaxed binding松散绑定 不严格要求属性文件中的属性名与成员变量名一致。支持驼峰中划线下划线等等转换甚至支持对象引导。比如user.friend.name代表的是user对象中的friend属性中的name属性显然friend也是对象。value注解就难以完成这样的注入方式。meta-data support元数据支持帮助IDE生成属性提示写开源框架会用到。
3.4、更优雅的注入
事实上如果一段属性只有一个Bean需要使用我们无需将其注入到一个类JdbcProperties中。而是直接在需要的地方声明即可
Configuration
public class JdbcConfig {Bean// 声明要注入的属性前缀SpringBoot会自动把相关属性通过set方法注入到DataSource中ConfigurationProperties(prefix jdbc)public DataSource dataSource() {DruidDataSource dataSource new DruidDataSource();return dataSource;}
}我们直接把ConfigurationProperties(prefix “jdbc”)声明在需要使用的Bean的方法上然后SpringBoot就会自动调用这个Bean此处是DataSource的set方法然后完成注入。使用的前提是该类必须有对应属性的set方法
我们将jdbc的url改成/heima再次测试
4.自动配置原理掌握
使用SpringBoot之后一个整合了SpringMVC的WEB工程开发变的无比简单那些繁杂的配置都消失不见了这是如何做到的
一切魔力的开始都是从我们的main函数来的所以我们再次来看下启动类
我们发现特别的地方有两个
注解SpringBootApplicationrun方法SpringApplication.run()
我们分别来研究这两个部分。
4.1.了解SpringBootApplication
点击进入查看源码
这里重点的注解有3个
SpringBootConfigurationEnableAutoConfigurationComponentScan
4.1.1.SpringBootConfiguration
我们继续点击查看源码
通过这段我们可以看出在这个注解上面又有一个Configuration注解。通过上面的注释阅读我们知道这个注解的作用就是声明当前类是一个配置类然后Spring会自动扫描到添加了Configuration的类并且读取其中的配置信息。而SpringBootConfiguration是来声明当前类是SpringBoot应用的配置类项目中只能有一个。所以一般我们无需自己添加。
4.1.2.EnableAutoConfiguration
关于这个注解官网上有一段说明
The second class-level annotation is EnableAutoConfiguration. This annotation
tells Spring Boot to “guess” how you want to configure Spring, based on the jar
dependencies that you have added. Since spring-boot-starter-web added Tomcat
and Spring MVC, the auto-configuration assumes that you are developing a web
application and sets up Spring accordingly.
简单翻译以下
第二级的注解EnableAutoConfiguration告诉SpringBoot基于你所添加的依赖去“猜测”你想要如何配置Spring。比如我们引入了spring-boot-starter-web而这个启动器中帮我们添加了tomcat、SpringMVC的依赖。此时自动配置就知道你是要开发一个web应用所以就帮你完成了web及SpringMVC的默认配置了
总结SpringBoot内部对大量的第三方库或Spring内部库进行了默认配置这些配置是否生效取决于我们是否引入了对应库所需的依赖如果有那么默认配置就会生效。
所以我们使用SpringBoot构建一个项目只需要引入所需框架的依赖配置就可以交给SpringBoot处理了。除非你不希望使用SpringBoot的默认配置它也提供了自定义配置的入口。
4.1.3.ComponentScan
我们跟进源码
并没有看到什么特殊的地方。我们查看注释
大概的意思
配置组件扫描的指令。提供了类似与context:component-scan标签的作用
通过basePackageClasses或者basePackages属性来指定要扫描的包。如果没有指定这些属性那么将从声明这个注解的类所在的包开始扫描包及子包
而我们的SpringBootApplication注解声明的类就是main函数所在的启动类因此扫描的包是该类所在包及其子包。因此一般启动类会放在一个比较前的包目录中。
4.2.默认配置原理
4.2.1默认配置类
通过刚才的学习我们知道EnableAutoConfiguration会开启SpringBoot的自动配置并且根据你引入的依赖来生效对应的默认配置。那么问题来了
这些默认配置是在哪里定义的呢为何依赖引入就会触发配置呢
其实在我们的项目中已经引入了一个依赖spring-boot-autoconfigure其中定义了大量自动配置类
还有
非常多几乎涵盖了现在主流的开源框架例如
redisjmsamqpjdbcjacksonmongodbjpasolrelasticsearch
… 等等
我们来看一个我们熟悉的例如SpringMVC查看mvc 的自动配置类
打开WebMvcAutoConfiguration
我们看到这个类上的4个注解 Configuration声明这个类是一个配置类 ConditionalOnWebApplication(type Type.SERVLET) ConditionalOn翻译就是在某个条件下此处就是满足项目的类是是Type.SERVLET类型也就是一个普通web工程显然我们就是 ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class }) 这里的条件是OnClass也就是满足以下类存在Servlet、DispatcherServlet、WebMvcConfigurer其中Servlet只要引入了tomcat依赖自然会有后两个需要引入SpringMVC才会有。这里就是判断你是否引入了相关依赖引入依赖后该条件成立当前类的配置才会生效 ConditionalOnMissingBean(WebMvcConfigurationSupport.class) 这个条件与上面不同OnMissingBean是说环境中没有指定的Bean这个才生效。其实这就是自定义配置的入口也就是说如果我们自己配置了一个WebMVCConfigurationSupport的类那么这个默认配置就会失效
接着我们查看该类中定义了什么
视图解析器
处理器适配器HandlerAdapter
还有很多这里就不一一截图了。
4.2.2.默认配置属性
另外这些默认配置的属性来自哪里呢
我们看到这里通过EnableAutoConfiguration注解引入了两个属性WebMvcProperties和ResourceProperties。这不正是SpringBoot的属性注入玩法嘛。
我们查看这两个属性类
找到了内部资源视图解析器的prefix和suffix属性。
ResourceProperties中主要定义了静态资源.js,.html,.css等)的路径
如果我们要覆盖这些默认属性只需要在application.properties中定义与其前缀prefix和字段名一致的属性即可。
4.3.总结
SpringBoot为我们提供了默认配置而默认配置生效的条件一般有两个
你引入了相关依赖你自己没有配置
1启动器
所以我们如果不想配置只需要引入依赖即可而依赖版本我们也不用操心因为只要引入了SpringBoot提供的stater启动器就会自动管理依赖及版本了。
因此玩SpringBoot的第一件事情就是找启动器SpringBoot提供了大量的默认启动器参考课前资料中提供的《SpringBoot启动器.txt》
2全局配置
另外SpringBoot的默认配置都会读取默认属性而这些属性可以通过自定义application.properties文件来进行覆盖。这样虽然使用的还是默认配置但是配置中的值改成了我们自定义的。
因此玩SpringBoot的第二件事情就是通过application.properties来覆盖默认属性值形成自定义配置。我们需要知道SpringBoot的默认属性key非常多参考课前资料提供的《SpringBoot全局属性.md》
5.SpringBoot实践
接下来我们来看看如何用SpringBoot来玩转以前的SSM,我们沿用之前讲解SSM用到的数据库tb_user和实体类User
5.1.整合SpringMVC
虽然默认配置已经可以使用SpringMVC了不过我们有时候需要进行自定义配置。
5.1.1.修改端口
查看SpringBoot的全局属性可知端口通过以下方式配置
# 映射端口
server.port80重启服务后测试
5.1.2.访问静态资源
现在我们的项目是一个jar工程那么就没有webapp我们的静态资源该放哪里呢
回顾我们上面看的源码有一个叫做ResourceProperties的类里面就定义了静态资源的默认查找路径
默认的静态资源路径为
classpath:/META-INF/resources/classpath:/resources/classpath:/static/classpath:/public/
只要静态资源放在这些目录中任何一个SpringMVC都会帮我们处理。
我们习惯会把静态资源放在classpath:/static/目录下。我们创建目录并且添加一些静态资源
重启项目后测试
5.1.3.添加拦截器
拦截器也是我们经常需要使用的在SpringBoot中该如何配置呢
拦截器不是一个普通属性而是一个类所以就要用到java配置方式了。在SpringBoot官方文档中有这么一段说明
If you want to keep Spring Boot MVC features and you want to add additional MVC configuration (interceptors, formatters, view controllers, and other features), you can add your own Configuration class of type WebMvcConfigurer but without EnableWebMvc. If you wish to provide custom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter, or ExceptionHandlerExceptionResolver, you can declare a WebMvcRegistrationsAdapter instance to provide such components.
If you want to take complete control of Spring MVC, you can add your own Configuration annotated with EnableWebMvc.
翻译
如果你想要保持Spring Boot 的一些默认MVC特征同时又想自定义一些MVC配置包括拦截器格式化器, 视图控制器、消息转换器 等等你应该让一个类实现WebMvcConfigurer并且添加Configuration注解但是千万不要加EnableWebMvc注解。如果你想要自定义HandlerMapping、HandlerAdapter、ExceptionResolver等组件你可以创建一个WebMvcRegistrationsAdapter实例 来提供以上组件。
如果你想要完全自定义SpringMVC不保留SpringBoot提供的一切特征你可以自己定义类并且添加Configuration注解和EnableWebMvc注解
总结通过实现WebMvcConfigurer并添加Configuration注解来实现自定义部分SpringMvc配置。
首先我们定义一个拦截器
public class LoginInterceptor implements HandlerInterceptor {private Logger logger LoggerFactory.getLogger(LoginInterceptor.class);Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {logger.debug(preHandle method is now running!);return true;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {logger.debug(postHandle method is now running!);}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {logger.debug(afterCompletion method is now running!);}
}说明https://www.cnblogs.com/yanze/p/11057102.html
然后我们定义配置类注册拦截器
Configuration
public class MvcConfig implements WebMvcConfigurer{/*** 通过Bean注解将我们定义的拦截器注册到Spring容器* return*/Beanpublic LoginInterceptor loginInterceptor(){return new LoginInterceptor();}/*** 重写接口中的addInterceptors方法添加自定义拦截器* param registry*/Overridepublic void addInterceptors(InterceptorRegistry registry) {// 通过registry来注册拦截器通过addPathPatterns来添加拦截路径registry.addInterceptor(this.loginInterceptor()).addPathPatterns(/**);}
}结构如下
接下来运行并查看日志
你会发现日志中什么都没有因为我们记录的log级别是debug默认是显示info以上我们需要进行配置。
SpringBoot通过logging.level.*debug来配置日志级别*填写包名
# 设置com.leyou包的日志级别为debug
logging.level.com.leyoudebug再次运行查看
2018-05-05 17:50:01.811 DEBUG 4548 --- [p-nio-80-exec-1] com.leyou.interceptor.LoginInterceptor : preHandle method is now running!
2018-05-05 17:50:01.854 DEBUG 4548 --- [p-nio-80-exec-1] com.leyou.interceptor.LoginInterceptor : postHandle method is now running!
2018-05-05 17:50:01.854 DEBUG 4548 --- [p-nio-80-exec-1] com.leyou.interceptor.LoginInterceptor : afterCompletion method is now running!添加lombok插件
lombok在编辑实体类时可以通过lombok注解减少getter、setter等方法的编写。
添加lombok插件参考如下
https://jingyan.baidu.com/article/0a52e3f4e53ca1bf63ed725c.html
https://blog.csdn.net/xue632777974/article/details/80437452
添加依赖 !--lombok插件包--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdscopeprovided/scope/dependency5.2.整合jdbc和事务
spring中的jdbc连接和事务是配置中的重要一环在SpringBoot中该如何处理呢
答案是不需要处理我们只要找到SpringBoot提供的启动器即可
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jdbc/artifactId
/dependency当然不要忘了数据库驱动SpringBoot并不知道我们用的什么数据库这里我们选择MySQL
dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId
/dependency至于事务SpringBoot中通过注解来控制。就是我们熟知的Transactional
Service
public class UserService {Autowiredprivate UserMapper userMapper;//编译器报错可以忽视public User queryById(Long id){return this.userMapper.selectByPrimaryKey(id);}Transactionalpublic void deleteById(Long id){this.userMapper.deleteByPrimaryKey(id);}
}5.3.整合连接池
其实在刚才引入jdbc启动器的时候SpringBoot已经自动帮我们引入了一个连接池
HikariCP应该是目前速度最快的连接池了我们看看它与c3p0的对比
因此我们只需要指定连接池参数即可
# 连接四大参数
spring.datasource.urljdbc:mysql://localhost:3306/sx3?useUnicodetruecharacterEncodingUTF8
spring.datasource.usernameroot
spring.datasource.passwordroot
# 可省略SpringBoot自动推断
spring.datasource.driver-class-namecom.mysql.jdbc.Driver
#HikariCP连接池配置
spring.datasource.hikari.idle-timeout60000
spring.datasource.hikari.maximum-pool-size30
spring.datasource.hikari.minimum-idle10当然如果你更喜欢Druid连接池也可以使用Druid官方提供的启动器
!-- Druid连接池 注意版本不能太低否则程序运行时会保存--
dependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-starter/artifactIdversion1.1.10/version
/dependency而连接信息的配置与上面是类似的只不过在连接池特有属性上方式略有不同
#Druid连接池配置
#初始化连接数
spring.datasource.druid.initial-size1
#最小空闲连接
spring.datasource.druid.min-idle1
#最大活动连接
spring.datasource.druid.max-active20
#获取连接时测试是否可用
spring.datasource.druid.test-on-borrowtrue
#监控页面启动
spring.datasource.druid.stat-view-servlet.allowtrue5.4.整合mybatis
5.4.1.mybatis
SpringBoot官方并没有提供Mybatis的启动器不过Mybatis官网自己实现了
!--mybatis --
dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion1.3.2/version
/dependency配置基本没有需要配置的
# mybatis 别名扫描
mybatis.type-aliases-packagecom.oracle.pojo
# mapper.xml文件位置,如果没有映射文件请注释掉
mybatis.mapper-locationsclasspath:mappers/*.xml需要注意这里没有配置mapper接口扫描包因此我们需要给每一个Mapper接口添加Mapper注解才能被识别。
Mapper
public interface UserMapper {
}5.4.2.通用mapper
通用Mapper的作者也为自己的插件编写了启动器我们直接引入即可
!-- 通用mapper --
dependencygroupIdtk.mybatis/groupIdartifactIdmapper-spring-boot-starter/artifactIdversion2.0.2/version
/dependency不需要做任何配置就可以使用了。
Mapper
public interface UserMapper extends tk.mybatis.mapper.common.MapperUser{
}通用Mapper里提供了丰富的单表的增删改查方法一般我们就不要自定义了如果多表查询必须自定义 //自定义方法Select(select * from tb_user where user_id#{id})User getUser(Integer id);如果表名和类名不一致需要在pojo上填写对应的表名以及指定主键是哪个
Data
Table(nametb_user)
public class User {Idprivate Integer id;private String name;private String password;private String email;
}字段名称含有下划线和属性名称如果不一致在使用通用Mapper的方法时通用Mapper可以在属性名称和字段名称直接按照驼峰命名法进行对应。但是如果使用的是自定义的方法这个自动对应就不起作用了。必须自己在配置文件中开启如果开发中需要mybatis输出日志也可以参照如下配置
#日志(com.oracle.mapper是包名)
logging.level.com.oracle.mapperdebug
#使用自定义查询方法时要开启驼峰命名转换数据库字段含下划线与属性不一致
mybatis.configuration.map-underscore-to-camel-casetrue5.4.3.Service
Service
public class UserServiceImpl implements UserService {Autowiredprivate UserMapper userMapper;Overridepublic User queryById(Integer id) {return userMapper.selectByPrimaryKey(id);}}5.5.启动测试
将controller进行简单改造
RestController
public class HelloController {Autowiredprivate UserService userService;GetMapping(/hello)public User hello() {User user this.userService.queryById(8);return user;}
}我们启动项目查看
6.Thymeleaf快速入门
SpringBoot并不推荐使用jsp但是支持一些模板引擎技术
以前大家用的比较多的是Freemarker但是我们今天的主角是Thymeleaf
6.1.为什么是Thymeleaf
简单说 Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎它可以完全替代 JSP 。相较与其他的模板引擎它有如下三个极吸引人的特点
动静结合Thymeleaf 在有网络和无网络的环境下皆可运行即它可以让美工在浏览器查看页面的静态效果也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持 html 原型然后在 html 标签里增加额外的属性来达到模板数据的展示方式。浏览器解释 html 时会忽略未定义的标签属性所以 thymeleaf 的模板可以静态地运行当有数据返回到页面时Thymeleaf 标签会动态地替换掉静态内容使页面动态显示。开箱即用它提供标准和spring标准两种方言可以直接套用模板实现JSTL、 OGNL表达式效果避免每天套模板、该jstl、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言。多方言支持Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块可以快速的实现表单绑定、属性编辑器、国际化等功能。与SpringBoot完美整合SpringBoot提供了Thymeleaf的默认配置并且为Thymeleaf设置了视图解析器我们可以像以前操作jsp一样来操作Thymeleaf。代码几乎没有任何区别就是在模板语法上有区别。
接下来我们就通过入门案例来体会Thymeleaf的魅力
6.2.编写接口
编写一个controller返回一些用户数据放入模型中等会在页面渲染
Controller //注意这块不要使用RestController
public class UserController {Autowiredprivate UserService userService;GetMapping(/all)public String all(ModelMap model){//查询用户ListUser usersuserService.queryAll();//放入模型model.addAttribute(users,users);//返回模板名称classpah:/templates目录下的html文件名return users;}
}6.3.引入启动器
直接引入启动器
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-thymeleaf/artifactId
/dependencySpringBoot会自动为Thymeleaf注册一个视图解析器
与解析JSP的InternalViewResolver类似Thymeleaf也会根据前缀和后缀来确定模板文件的位置
默认前缀classpath:/templates/默认后缀.html
所以如果我们返回视图users会指向到 classpath:/templates/users.html
一般我们无需进行修改默认即可。
6.4.静态页面
根据上面的文档介绍模板默认放在classpath下的templates文件夹我们新建一个html文件放入其中
编写html模板渲染模型中的数据
注意把html 的名称空间改成xmlns:th“http://www.thymeleaf.org” 会有语法提示
!DOCTYPE html
html xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8title首页/titlestyle typetext/csstable {border-collapse: collapse; font-size: 14px; width: 80%; margin: auto}table, th, td {border: 1px solid darkslategray;padding: 10px}/style
/head
body
div styletext-align: centerspan stylecolor: darkslategray; font-size: 30px欢迎光临/spanhr/table classlisttrthid/thth姓名/thth用户名/thth年龄/thth性别/thth生日/thth备注/th/trtr th:eachuser : ${users}td th:text${user.id}1/tdtd th:text${user.name}张三/tdtd th:text${user.username}zhangsan/tdtd th:text${user.age}20/tdtd th:text${user.sex} 1 ? 男: 女男/tdtd th:text${#dates.format(user.birthday, yyyy-MM-dd)}1980-02-30/tdtd th:text${user.note}1/td/tr/table
/div
/body
/html注意页面的user.属性“对应的模型user实体类中一定要有对应的属性没有会报错误
我们看到这里使用了以下语法
${} 这个类似与el表达式但其实是ognl的语法比el表达式更加强大th-指令th-是利用了Html5中的自定义属性来实现的。如果不支持H5可以用data-th-来代替 th:each类似于c:foreach 遍历集合但是语法更加简洁th:text声明标签中的文本 例如1如果user.id有值会覆盖默认的1如果没有值则会显示td中默认的1。这正是thymeleaf能够动静结合的原因模板解析失败不影响页面的显示效果因为会显示默认值
6.5.测试
接下来我们打开页面测试一下
6.6.模板缓存
Thymeleaf会在第一次对模板解析之后进行缓存极大的提高了并发处理能力。但是这给我们开发带来了不便修改页面后并不会立刻看到效果我们开发阶段可以关掉缓存使用
# 开发阶段关闭thymeleaf的模板缓存
spring.thymeleaf.cachefalse注意
在Idea中我们需要在修改页面后按快捷键Ctrl Shift F9 对项目进行rebuild才可以。eclipse中没有测试过。我们可以修改页面测试一下。