SpringBoot项目搭建Idea

6 年前

打开Idea,file》new》project》Spring Initializr,选择对应的jdk,如下图所示:

点击next,到

这个页面,自己定义项目名字和其他一些东西,点击next会出现下图所示:

此处我们只选web即可,点击next,确定项目名称点finish完成项目创建。然后右键点击run启动class发现报错: Unregistering JMX-exposed beans on shutdown ,那是因为

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>

其中 <scope>provided</scope>要去掉才能让Tomcat正常启动,去掉后启动正常,创建controller类浏览器访问正常。

接下来添加对jsp的支持,在pom文件中引入:

创建/webapp/WEB-INF/view目录,修改application.properties文件让springmvc支持视图的跳转目录指向为/main/webapp/view,配置如下图所示:

我们在webapps/view目录下创建一个index.jsp用于测试我们的配置是否已经支持了jsp,至此我们已经完成了jsp的所有配置,接下来我们需要配置springmvc的控制器,我们新建HelloController如下图所示:

重启项目我们尝试访问 127.0.0.1:8080/hello ,可以看到jsp里的效果至此完成jsp的支持。

下面让我们来连接MySQL数据库,并且结合SpringDataJPA完成CRUD(Create,Read,Update,Delete)简单操作。

首先在pom文件中引入spring-data-jpa、mysql-connector-java的依赖如下图:

如果是新建项目可以在下面页面中勾选web,MySQL,JPA组件:

application.properties文件里配置如下:

可以看到上述配置文件内,我们使用了本地的一个mysql数据库,mysql数据库是我们事先安装好的,并且创建了一个名叫test的数据库,JPA的配置了 show-sql 用来在控制台输出JPA自动生成的sql语句。

上述数据配置文件已经完成,接下来我们新建数据库测试表结构我使用的数据库工具是Navicat你们可自行下载或者使用其他工具,结构如下:

我们根据数据库中的字段对应创建一个User实体类来做对应操作,如下图所示:


接下来我们需要使用SpringDataJPA来完成数据库操作,我们新建名字叫做jpa的package,然后创建UserJPA接口并且继承SpringDataJPA内的接口作为父类,如下图10所示:


我们UserJPA继承了JpaRepository接口(SpringDataJPA提供的简单数据操作接口)、JpaSpecificationExecutor(SpringDataJPA提供的复杂查询接口)、Serializable(序列化接口)。我们并需要做其他的任何操作了,因为springboot以及springDataJPA会为我们全部搞定,SpringDataJPA内部使用了类代理的方式让继承了它接口的子接口都以spring管理的Bean的形式存在,也就是说我们可以直接使用@Autowired注解在spring管理bean使用,创建UserController并书写增删改查方法如下图所示:

下面运行项目用postman测试如下:(如果项目运行报错ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.那是要注意:如果使用内部tomcat运行项目需要将spring-boot-starter-tomcat的scope标签要去掉)

接下来添加Druid。Druid是一个关系型数据库连接池,它是阿里巴巴的一个开源项目。Druid支持所有JDBC兼容数据库,包括了Oracle、MySQL、PostgreSQL、SQL Server、H2等。Druid在监控、可扩展性、稳定性和性能方面具有明显的优势。通过Druid提供的监控功能,可以实时观察数据库连接池和SQL查询的工作情况。使用Druid连接池在一定程度上可以提高数据访问效率。

在项目的pom.xml文件里添加如下依赖:

我们已经将druid添加到我们的项目中,那么接下来我们需要修改application.properties配置文件,添加druid的支持,并配置JPA的 show-sql 用来在控制台输出JPA自动生成的sql语句如下图所示:

上面配置中的filters:stat表示已经可以使用监控过滤器,这时结合定义一个过滤器,就可以用来监控数据库的使用情况。现在让我们启动项目运行如下:

可以看到上面我截图的地方,SpringBoot已经把Druid当做dataSource加载到了项目中,那么我们现在访问用户列表地址: 127.0.0.1:8080/user/list ,如何上面访问的一样的话,再来看下IntelliJ IDEA工具控制台的输出日志,能看到:

上述图内打印了sql语句,而这个sql则是SpringDataJpa自动生成的,我们已经完成了SpringBoot整合Druid连接池的部分,那么我们接下来开启Druid的监控功能(开启监控功能,可以在应用运行的过程中,通过监控提供的多维度数据来分析使用数据库的运行情况,从而可以调整程序设计,以便于优化数据库的访问性能)。下面我们来实现Druid的访问 Servlet 以及 Filter ,如下图所示:

项目运行成功后,我们要访问Druid的监控界面,访问地址: 127.0.0.1:8080/druid/login.html ,那么我们现在输入我们在 DruidConfiguration 内配置的 用户名 密码 登录监控平台,进入监控平台首页:

我们已经成功的访问到了监控首页,可以看到大致包含了如下几个模块:数据源、SQL监控、SQL防火墙、Web应用、URI监控、Session监控、JSONAPI等。

1、数据源:可以看到项目中管理的所有数据源配置的详细情况,除了密码没有显示外其他都在

2、SQL监控:可以查看所有的执行sql语句

3、防火墙:druid提供了黑白名单的访问,可以清楚的看到sql防护情况

4、Web应用:可以看到目前运行的web程序的详细信息

5、URI监控:可以监控到所有的请求路径的请求次数、请求时间等其他参数

6、Session监控:可以看到当前的session状况,创建时间、最后活跃时间、请求次数、请求时间等详细参数。

7、JSONAPI:通过api的形式访问Druid的监控接口,api接口返回Json形式数据

开启了Druid连接池本身自带的数据监控功能,可以清晰的看到SQL执行以及Session活跃情况,方便优化SQL。

fastJson是阿里巴巴旗下的一个开源项目之一,顾名思义它专门用来做快速操作Json的序列化与反序列化的组件。 它是目前json解析最快的开源组件没有之一! 在这之前jaskJson是命名为快速操作json的工具,而当阿里巴巴的fastJson诞生后jaskjson就消声匿迹了,不过目前很多项目还在使用。现在将fastJson加入到SpringBoot项目内,配置json返回视图使用fastJson解析。到maven仓库复制对应的maven依赖xml配置到我们项目的pom.xml中,如下图所示:

接下来创建一个 FastJsonConfiguration 配置信息类,添加 @Configuration 注解让SpringBoot自动加载类内的配置,有一点要注意我们继承了 WebMvcConfigurerAdapter 这个类,这个类是SpringBoot内部提供专门处理用户自行添加的配置,里面不仅仅包含了修改视图的过滤还有其他很多的方法,包括我们后面章节要讲到的拦截器,过滤器,Cors配置等。

fastJson视图过滤配置详细内容如下图所示:


上述图内fastJson配置实体调用setSerializerFeatures方法可以配置多个过滤方式,下面我们来介绍下常用的SerializerFeatures配置。

WriteNullListAsEmpty :List字段如果为null,输出为[],而非null WriteNullStringAsEmpty : 字符类型字段如果为null,输出为"",而非null DisableCircularReferenceDetect :消除对同一对象循环引用的问题,默认为false(如果不配置有可能会进入死循环) WriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非null WriteMapNullValue:是否输出值为null的字段,默认为false。

经过上述的配置我们基本完成对了SpringBoot整合FastJson的内容,我们接下来尝试运行下项目,访问user/list如下图所示:

可以看到数据库中存储为null的字段email这里显示的不是null二十变成了""了。

接下来在此项目中学习使用SpringBoot中是如何配置拦截器,使用拦截器来完成简单的用户登录状态判定。首先创建两个页面index.jsp、login.jsp如下图所示:



接下里在数据库中加入一个密码password字段,并在实体类中增加这个字段:

上述JSP文件已经创建完成,下面我们需要让SpringBoot内置SpringMVC控制器转发到对应的JSP页面,我们创建名叫LoginController的类文件,并且加入登录用户的方法,用户的实体以及JPA配置完成后我们再次打开LoginController,将UserJPA使用SpringBean的形式注入,然后完成简单的登录逻辑,再次修改LoginController在登录成功的地方,添加将用户写入 session 中,如下图所示:

在创建拦截器之前我们还需要添加初始化登录页面的转发配置,我们创建IndexController添加初始化登录、首页页面转发配置,如下图所示:

完成上述操作后,创建一个名叫做 SessionInterceptor 的拦截器实体类,实现 SpringMVC 内部接口 HandlerInterceptor, 并且添加如果没有session状态直接跳转到 /user/login_view 地址也就是我们对应的login.jsp页面,拦截器配置如下图所示:

接下来我们需要将SessionInterceptor拦截器添加到SpringBoot的配置中,让SpringBoot项目有这么一个拦截器存在,我们新创建一个SessionConfiguration,将拦截器的配置以及拦截路径配置好,如下图所示:

好了,我们的所有工作都已经做好,下面我们来初尝试运行项目,输入正确的用户名和密码后来到这个页面:

说明拦截器已经配置成功了。接下来我们配置实现发邮件使用JavaMail。JavaMail是SUN提供给广大Java开发人员的一款邮件发送和接受的一款开源类库,支持常用的邮件协议,如:SMTP、POP3、IMAP,开发人员使用JavaMail编写邮件程序时,不再需要考虑底层的通讯细节如:Socket而是关注在逻辑层面。JavaMail可以发送各种复杂MIME格式的邮件内容,注意JavaMail仅支持JDK4及以上版本。虽然JavaMail是JDK的API但它并没有直接加入JDK中,所以我们需要另外添加依赖,在pom.xml里添加依赖:

接下来我们开始编写JavaMail的封装,我这里简单的对JavaMail做出封装,如果您需要更完美的封装,请对我的代码做出修改即可,先来编写一个 Mail 类来保存发送邮件时需要的参数字段,如下图所示:

下面我们来创建一个 MailSender 也就是邮件发送者实体,主要作用就是用来配置发送邮件参数以及执行发送邮件,代码如下图所示:




上面可以看到我使用到了 MailContentTypeEnum 以及 PropertiesUtil 工具类,其分别如下:



MailContentTypeEnum是 自定义的枚举类型,枚举类型包含了邮件内容的类型,目前我仅仅添加了两种,一种是 html 另外一种则是 text 形式;PropertiesUtil是用于读取*.properties配置文件的工具类,使用JavaMail需要配置SMTP以及用户名、密码等也就是MailEntity内的字段,接着我们在application.properties里添加如下配置:

在LoginController类里登录成功判断里添加下代码:


运行项目调用登录接口会看到邮件已经发送到指定邮箱。

接下来让我们配置springboot请求日志,首先创造表结构如下:

接下来根据表结构创建实体并配置实体JPA,如下图所示:


JpaRepository接口包含了SpringDataJPA内的常用到的CRUD方法。接下来创建日志拦截器如下:


我们在拦截器内无法通过 SpringBean 的方式注入 LoggerJPA ,我只能通过另外一种形式,WebApplicationContextUtils可以通过 HttpServletRequest 请求对象的上下文( ServetCotext )获取Spring管理的Bean,可以看到上图最后创建了一个getDAO的方法,方法需要传入一个实体的类型,以及一个HttpServetRequest请求对象,通过WebApplicationContextUtils内部的getRequiredWebApplicationContext方法获取到BeanFactory(实体工厂类),从而通过工厂实体的getBean方法就可以拿到SpringDataJPA为我们管理的LoggerJPA持久化数据接口实例。我们开始编写请求日志的创建,首先我们在 preHandle 方法内创建LoggerEntity实体,并记录一些必要参数后将实体写入到当前请求对象HttpServletRequest内。可以看到我们上面记录了我们日志实体内的大部分参数,当用户发送请求时在进入SpringMVC的控制器之前会进入 preHandle 方法,然后记录下我们的请求日志内容,并将请求日志的实体写入到请求对象内,下面就会进入对应springMVC控制器方法的方法,在最后渲染视图即将返回前台的时候开始执行我们下面需要边写的 afterCompletion 方法,在 afterCompletion 方法内记录了请求相应码、请求时间戳、请求返回值等。

我们在UserControll控制器内list方法里添加如下图代码,可以看到我们在拦截器内的疑问得到的解释,LOGGER_RETURN是从我们的请求方法传入到LoggerInterceptor拦截器内afterCompletion方法中的,如下图:

上述我们的代码基本已经编写完成,不要忘记最重要的一步,我们需要将LoggerInterceptor拦截器添加到我们的SpringBoot项目内,让SpringBoot项目可以识别拦截。我们需要创建一个LoggerConfguration配置类,如下图所示:

至此已经完全完成,启动项目访问user/list接口可以看到数据库里面已经存入了日志记录如下图:

接下来修改静态资源的路径,因为 SpringBoot 默认给我们配置了静态资源的地址转发,我们只需要将静态文件放到 /resources/static 目录下,就可以直接访问了。但是这样往往会暴露给用户我们的项目结构,首先复制一张图片到项目 /resources/static 目录下,如下图所示

接下来我们启动项目,启动成功后打开浏览器访问http://localhost:8080/0711.png会出现

但是这样会暴露项目目录,为了避免接下来创建一个名叫StaticPathConfiguration的配置类,类内添加自定义静态资源的配置,如下图所示

接下来重启项目,访问路径http://localhost:8080/yhg/one/resources/0711.png如下图

创建一个imgs文件夹,将0711.png图片移动到imgs目录下,那么我们在访问路径下只要添加一个二级路径即可,重启项目访问地址如下图

Servlet是Java编写服务器端的程序组件,主要功能在于交互式数据操作,动态生成WEB内容等。传统的Spring项目,配置Servlet比较繁琐,需要在web.xml内添加对应的标签以及映射路径规则。接下来在SpringBoot项目中创建Servlet以及自动装载到SpringBoot中

首先创建名叫TestServlet并继承HttpServlet抽象类的Class文件,如下图

创建ServletConfiguration配置类并添加 @ServletComponentScan 注解以开启自动装配Servlet功能,代码如下图

接下来我们重启下项目,访问地址 127.0.0.1:8080/test 查看效果如下图所示

一般SpringBoot项目用到Servlet的地方还是较少的。有了SpringMVC也就慢慢的淡忘了Servlet的使用。下面我们来完成单个、多个文件的上传,首先在jsp目录下创建一个fileupload.jsp,jsp内我们添加一个简单的form表单,并且修改 enctype="multipart/form-data" ,fileupload.jsp代码如下图所示

完成后我们需要让springboot内的SpringMVC转发到index.jsp页面,我们创建一个名叫做UploadController的控制器,添加初始化index.jsp页面方法以及上传文件的方法/upload,首先实现单文件上传,代码如下图


运行项目后,控制台打印日志并没有什么异常,访问 127.0.0.1:8080/file/index 看下效果,如下图

选择文件提交上传,成功后upload会出现对应文件如下图

一般情况下我们不会使用上传时文件的名字作为存储在服务器端的名字,通常采用UUID或者时间戳的形式来保存,此处采用UUID形式存储。接下来试验下多文件上传,控制里加入如下代码

然后像单个文件上传一样运行项目测试。SpringBoot上传文件时限制了我们上传文件最大容量为:1048576 bytes,那我们需要上传超过配置的文件时修改时首先打开application.properties配置文件,加入spring.http.multipart.max-file-size以及spring.http.multipart.max-request-size配置信息,配置信息如下图所示

这样设置上传文件的最大限制容量为1024Mb也就是1GB,最大的请求容量为2048Mb也就是2GB。

SpringBoot内部集成了 LogBack 日志依赖,SpringBoot默认使用 LogBack 记录日志信息,默认根据base.xml配置内容来输出到控制台和文件之中,那么接下来讲解 LogBack 是如何记录日志到控制和文件之中,启动项目会发现日志已经打印出来了,如下

因为SpringBoot内部集成了LogBack,所以我们能看到日志信息,那么接下来修改默认配置。

LogBack读取配置文件的步骤 (1)尝试classpath下查找文件logback-test.xml (2)如果文件不存在,尝试查找logback.xml (3)如果两个文件都不存在,LogBack用BasicConfiguration自动对自己进行最小化配置,这样既实现了上面我们不需要添加任何配置就可以输出到控制台日志信息。 接下来在resources目录下创建名叫logback.xml的文件,并且添加日志配置输出到文件内按天存储到不同的文件之中。具体配置如下图

我们在logback.xml配置文件中,添加了控制台输出、文件每天输出、日志文件最大上限、日志的最低级别等。下面我们来运行下项目查看我们的配置是否起作用了,修改我们的UserController内的list方法并添加多个日志级别的输出,如下图所示

logback.xml配置文件配置了根输出等级是INFO,所以如果logback.xml生效,那么我们的控制台以及文件内将不会存在Debug级别的日志输出,我们重启下项目,访问地址/user/list查看控制台以及/logs/runtime.xxxx.log配置文件内容,如下图

可以看到Debug级别的日志没有输出,只有INFO以及ERROR级别日志打印并输出到文件中。我们配置的./logs作为日志的输出根目录,所以LogBack自动在我们的项目根目录下创建名叫做logs的文件夹,并且项目启动时第一次记录日志时会自动创建命名方式文件。 如果在项目中需要屏蔽某个或者多个包下不输出日志也不记录日志到文件内,那么我们需要修改application.properties添加对应配置,如下图所示

启动项目调用接口会发现

日志已经屏蔽,证明了我们的配置已经生效了。当然也可以改变某个包下的日志输出等级,只需要将'OFF'改成对应等级即可。

SpringDataJPA Spring Data 的一个子项目,通过提供基于 JPA Repository 极大的减少了 JPA 作为数据访问方案的代码量,你仅仅需要编写一个接口集成下 SpringDataJPA 内部定义的接口即可完成简单的 CRUD 操作。在 UserJPA 接口中可看到继承自 JpaRepository JpaRepository 需要泛型接口参数,第一个参数是实体,第二则是主键的类型,JpaRepository接口内有又继承了PagingAndSortingRepository接口以及QueryByExampleExecutor接口,而PagingAndSortingRepository接口内部又有一个继承自CrudRepository接口,CrudRepository接口内包含了最简单的CRUD也就是Create、Read、Update、Delete方法,当然还有count、exists方法,如下图所示

PagingAndSortingRepository接口继承自CrudRepository接口,包含了最基本的CRUD方法的实现,该接口内部添加了两个方法

JpaRepository 接口继承了QueryByExampleExecutor接口,这个接口提供条件查询,复杂查询方法,可以通过Example方式进行查询数据

我们自定义的接口继承了 JpaRepository ,也就是说我们的UserJPA拥有了JpaRepository接口及父类接口的所有方法实现,所以我们并不需要添加任何数据操作代码就可以完成数据操作,JpaRepository接口对条件查询以及保存集合数据添加了对应的方法,如下图

启动项目访问用户列表地址http://localhost:8080/user/list如下图

接下来自定义SQL功能,先来讲述使用注解的方式,后期在SpringDataJPA核心技术专题内再详细的讲解使用EntityManager是如何完成自定义SQL、调用存储过程、视图等等操作,打开UserJPA接口,添加自定义查询年龄大于20的数据如下图

Query是用来配置自定义SQL的注解,后面参数nativeQuery = true才是表明了使用原生的sql,如果不配置,默认是false,则使用HQL查询方式。我们在UserController内添加方法/age,测试我们的自定义SQL是否有效,代码如下图

重启下项目,访问 127.0.0.1:8080/user/age ,效果如下图

自定义SQL查询语句生效,接下来让@Query注解配合@Modifying注解一共使用,可以完成数据的删除、添加、更新操作。下面我们来测试下自定义SQL完成删除数据的操作,我根据名字、密码字段共同删除一个数据,接口代码如下图


接口代码要加@ Transactional注解。 编写UserController添加对应的方法调用deleteQuery接口方法,如下图

重启下项目,访问地址: 127.0.0.1:8080/user/deleteWhere 如下图

查看下控制台看打印的SQL是否是我们自定义,如下图

自定义的SQL被成功的打印了,自定义SQL完成添加,更新操作时跟删除一致,都需要添加 @Query 以及 @Modifying 注解配合使用。

项目在正常情况下不仅仅只继承一个JpaRepository接口,下一章我们整合SpringDataJPA跟QueryDSL时就需要添加多个接口继承了,那么我们业务数据接口每一个都去继承几个相同的接口?答案肯定是 NO,当然多个继承也是可以的,不过对于系统设计还有代码复用性来说并不是最好的选择。创建一个包名叫做common,在包内添加一个BaseRepository接口,并且接口继承我们的JpaRepository,代码如下图

@NoRepositoryBean注解如果配置在继承了JpaRepository接口以及其他SpringDataJpa内部的接口的子接口时,子接口不被作为一个Repository创建代理实现类。 因此创建的业务数据接口直接继承BaseRepository就行了,继承的子接口会拥有JpaRepository所有方法实现。

分页对于大型系统来说肯定是必不可少的,那么我们在SpringDataJpa内是如何使用分页来完成查询的呢?

一般情况我们会创建一个BaseEntity,在BaseEntity内添加几个字段:排序列,排序方式,当前页码,每页条数等,下面我们也来创建这么一个父类,代码如下图

修改User继承BaseEntity,然后在数据库内添加上几条测试数据,我们每次页面的数量就不用20了,我们在创建查询条件时修改成5条。 我们打开UserController添加cutPage方法,用于作为分页查询入口,(注意:文章的讲解都没有添加Service层所以所有的业务逻辑都在Controller内处理的,正式项目请不要这样编写。)我们在cutPage方法内添加对应的分页逻辑;上面在BaseEntity内添加了排序的字段以及排序方式,编辑下cutPage方法,修改pageRequest创建方式,添加Sort对象到PageRequest对象内,就可以实现排序数据。如下图


接下来我们重启下项目,访问地址:127.0.0.1:8080/user/cutpage?page=1,查看界面输出效果如下图

看下控制台的输出

QueryDSL是一个Java语言编写的通用查询框架,专注于通过JavaAPI方式构建安全的SQL查询。QueryDSL可以应用到NoSQL数据库上,QueryDSL查询框架可以在任何支持的ORM框架或者SQL平台上以一种通用的API方式来构建SQL。目前QueryDSL支持的平台包扣JPA、JDO、SQL、Java Collections、RDF、Lucene、Hibernate Serch、MongoDB等。接下来使用SpringBoot项目下SpringDataJPA与QueryDSL框架整合,完成多表关系复杂查询。下面使用 商品信息表 商品分类信息表 来实现,如下图


在SpringBoot项目内使用queryDSL需要导入maven依赖以及添加maven插件,修改pom.xml配置文件添加querydsl依赖以及插件如下图


上面导入的querydsl的maven依赖,下面的插件很重要,当我们执行 maven compile 命令的时候,queryDSL这个插件会自动在我们配置的目录下生成Qxxx结构化查询实体对象,querydsl完全采用面向对象的方式来创建查询。接下来需要让maven执行querydsl的插件自动生成查询实体对象,先配置项目的maven命令,添加一条compile,点击:Run -> Edit Configurations -> "+" -> Maven,配置如下图

配置完成后点击“Apply”后就已经配置好了,接下来我们运行maven compile命令,点击IntelliJ IDEA工具右上角选择maven compile执行,控制台日志输出内容如下图

maven输出的提示执行maven compile命令成功了,那么我们去target下查看是否已经创建了generated-sources/java目录,文件内现在是没有内容的,因为我们还没有添加实体在项目中,下面我们根据数据库内的表结构创建对应实体。 商品信息实体 内容如下图


在商品信息实体内配置分类实体的关联而且是@OneToOne(一对一)的关联。实体已经创建完成,下面我们再次执行maven compile命令,再次查看target下的querydsl目录内容变化,如下图

目录内有四个querydsl插件自动生成的实体,命名规则就是原实体名称前+Q前缀。可以查看类内的代码,都是由querydsl插件自动构建的,创建一个GoodJPA接口,让其继承QueryDslPredicateExecutor接口,该接口是SpringDataJPA提供的querydsl查询接口。GoodJPA代码如下图


下面我们创建测试程序使用我们引入的querydsl完成查询功能,我们先来创建一个GoodController,作为访问入口,添加 GoodJPA Spring 注入Bean,然后添加根据商品分类查询商品列表的方法。如下图

上图注入了EntityManager对象,因为我们构建JAPQuery对象需要它作为参数传入,使用QueryDSL查询的形式完全就是平时使用对象的形式那么简单!上面完全使用的QueryDSL进行的查询操作,向数据库表信息添加几条测试数据,然后访问测试下,下面接着说SpringDataJPA下怎么使用JPA。运行项目,访问地址: 127.0.0.1:8080/good/query 如下图

我查询的是分类为1的商品列表,可以看到数据完全正确的给我们返回了,这个仅仅是QueryDSL自己完成的操作,接下来我们使用SpringDataJPA整合QueryDSL完成相同的查询效果。打开GoodController添加join方法,代码如下图

Inquirer,相对于单独的QueryDSL查询而言,整合的方式会更复杂一点,所以可以封装简单的查询对象来简化代码。自定义查询实体类,该类可以完成查询添加封装,查询结果处理操作,具体代码如下图


重启下项目访问地址测试,界面输出内容如下图

数据验证是作为一个企业级项目架构上设计的最基础的模块,前辈们曾说过:界面上传递到后天的数据没有百分之百值得相信的!为什么这么说呢?往往我们在编写程序的时候都会感觉后台的验证无关紧要,这样就会给别人空子钻。我可以模拟前台发送的请求到后台地址,那么我如果发送一些涉及系统安全的代码到后台,后果一发不可收拾。接下来对SpringBoot项目内参数进行校验。SpringBoot的Web组件内部集成了hibernate-validator,所以并不需要额外的为验证再导入其他的包,接下来看看SpringBoot为我们提供了哪些验证。SpringBoot因为采用了hibernate-validator,所以我们直接使用hibernate-validator就可以进行数据校验,内置验证如下图

如果系统内需要一些自定义的验证,我们该如何处理?自定义验证需要我们提供两个文件内容,一个是注解、另外一个是对应注解继承 ConstraintValidator 的实现类,下面我们假如有这么个情景,我们在DemoEntity内添加一个字段flag,需要验证flag字段内容仅为1,2,3。先创建一个注解,注解内部需要对应验证注解的验证实现类,所以创建后会报错。 FlagValidator 自定义验证注解内容如下图

可以看到上图9内有个 @Constraint 注解,里面传入了一个 validatedBy 的字段,这个就是我们自定义注解的实现类的类型, 实现类 代码如下图

自定义验证实现类里面有两个方法,分别是初始化验证消息、执行验证。

初始化验证消息方法内你可以得到配置的注解内容,而验证方法则是你的验证业务逻辑。我们先来创建Demo实体类,加入flag字段并且配置@FlagValidator自定义注解,如下图

接下来我们重启下项目,访问地址如下图

接下来在访问地址添加?name=Smith&mail=323131@qq.com&age=10&flag=1访问地址

我们自定义的注解已经生效了。

平时在项目中设计数据访问的时候往往都是采用直接访问数据库,采用数据库连接池来实现,但是如果我们的项目访问量过大或者访问过于频繁,将会对我们的数据库带来很大的压力。为了解决这个问题从而 redis 数据库脱颖而出, redis 数据库出现时是以非关系数据库的光环展示在广大程序猿的面前的,后来 redis 的迭代版本支持了缓存数据、登录session状态(分布式session共享)等。所以又被作为内存缓存的形式应用到大型企业级项目中。现在实现 SpringBoot 项目中整合 Redis 非关系数据库作为内存缓存框架,并测试数据读取源。官网的 redis 仅支持Linux服务器的安装版本,由于开发人员都是在windows上工作,所以GitHub上的牛人基于linux平台下的Redis实现了windows版本。github网址: MicrosoftArchive/redis ,下载最新的windows X64版本的压缩包,如下图

第二个则是压缩包的形式解压完就可以用,解压完成后我们来开启Redis数据库,Redis数据库的默认端口是 6379, 如果已经被其他应用程序占用,修改redis.windows.conf配置文件。如果没有端口没有被占用,我们需要在 cmd 命令窗口执行运行Redis,我们首先使用 cmd 命令进入到Redis解压目录并且执行 redis-server.exe redis.windows.conf 命令。当然也可以把redis配成一个服务启动。接下来让我们的SpringBoot项目支持Redis数据库才能完成缓存的操作,打开pom.xml配置文件添加对应的redis缓存依赖maven配置,如下图

添加缓存的支持需要两个依赖,一个是SpringBoot内部的缓存配置、另外则是我们的redis缓存。依赖添加完成后,需要配置我们本地的redis数据库连接到项目中,我们打开application.properties配置文件添加如下所示的配置内容

下面需要让SpringBoot内置的缓存框架使用Redis作为新的缓存,我们来添加一个RedisConfiguration的配置类,并添加对应的配置如下图


使用 @EnableCaching 注解来开启项目支持缓存,在配置类内添加了方法 cacheManager() ,方法的返回值则是使用了我们的 Redis 缓存的管理器, SpringBoot 项目启动时就会去找自定义配置的 CacheManager 对象并且自动应用到项目中。

上述就是有关Redis的所有配置,现在来创建一个业务逻辑服务类: UserService ,我们在Service内添加redis的缓存支持,如下图

上图有两个新的注解,@CacheConfig:该注解是用来开启声明的类参与缓存,如果方法内的@Cacheable注解没有添加key值,那么会自动使用cahceNames配置参数并且追加方法名。