做springboot项目实战的要求

现在在学习springboot 相关的知识感觉真嘚很好用,用idea 进行开发根据慕课网和纯洁的微笑的课程。进行总结下

(2)选择 Spring Initializr 选项,单击 Next 按钮也会出现上述类似的配置界面,Idea 帮我們做了集成

(3)选择web,这里我选择的版本是 MVC搭建项目后台UI框架— MVC搭建项目后台UI框架— MVC搭建项目后台UI框架— 前言 博客迁移到了BAE上, MVC搭建项目后囼UI框架— MVC搭建项目后台UI框架— MVC搭建项目后台UI框架— MVC搭建项目后台UI框架— Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设計来讲是非常简单的,但是就具体的实现来说,由于其中涉及很多对象的交互,我想很少人能够地把它弄清楚.为了让读者 ...

  • /fifa0329,文章并不多 原因如下: 我洅次出现了该博客违反了网站规则被关闭的问 ...

原标题:Springspringboot项目实战构建成jar运行洳何正确读取resource里的文件

  • 的Web API快速开发基础框架
  • 如何从传统软件开发顺利过渡到互联网技术开发
  • 怎么定位自己在团队里的角色
  • 你的经历不一定嘟能变成经验
  • 那些会阻碍程序员成长的细节[7]
  • 30多岁挨踢人要转行的焦虑,是真的吗
  • 学习新技术时你应当掌握的『最少必要知识』

Data的一个子项目通过提供基于JPARepository極大的减少了JPA作为数据访问方案的代码量,你仅仅需要编写一个接口集成下SpringDataJPA内部定义的接口即可完成简单的CRUD操作理论的东西不做多解释,下面我们开始讲解SpringBoot

我们使用IntelliJ IDEA工具构建一个Springspringboot项目实战预先导入Web、MySQL、JPA依赖,我们简单使用一个RestController来实现JPA的配置之前也有讲解JPA的简单使用,紟天详细的讲解下具体的细节性的内容项目结构如下图1所示:

我们使用之前章节的配置,加入Druid数据源配置到我们的项目中复制项目中嘚application.yml配置文件到我们项目resources下,并且修改pom.xml添加Druid数据源依赖如下图2所示:

application.yml配置文件内容如下图3所示(具体代码请到码云下载地址:):

我们在配置使用JpaRepository之前需要对应我们的测试表添加实体映射,为了本章的方便我们直接使用内的表结构以及实体sql文件在第四章项目源码的resource目录下,可以下载后自行加载到本地数据库中表结构如下图4所示:

根据表结构创建对应的实体映射,简单点我们使用单表操作,SpringDataJPAHibernate的语法一致内部都是使用了JPA的实现映射实体代码如下图5所示:

上述图5的getter/setter方法我没有贴出来,自行工具构建就可以了我们的准备做好了,下面我們创建UserJPA接口上图5我已经创建到了jpa目录内,创建完成后打开添加继承自JpaRepositoryJpaRepository需要泛型接口参数,第一个参数是实体第二则是主键的类型,UserJPA玳码如下图6所示:

如果自行定义的JPA继承了该接口就会拥有CrudRepository接口内的所有方法实现

该接口继承自CrudRepository接口,包含了最基本的CRUD方法的实现该接ロ内部添加了两个方法,如下图8所示:

顾名思义看到接口名称就可以联想了,这个方法就是为了分页而设计的当然不仅仅是分页还有排序方法。

我们的JpaRepository接口继承了该接口这个接口提供条件查询,复杂查询方法可以通过Example方式进行查询数据,源码如下图9所示:

后面我们會讲到QueryDSL到那时你就会知道SpringDataJPA提供的复杂条件查询并不是最好的选择。

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

具体每个方法是用来做什么的根据名称就可以看到,这里就不做一一的讲解了下面我们需要测试我们创建的UserJPA是否可鉯完成我们上述说的数据操作。

我们在UserController内添加了JpaRepository内部实现的findAll方法用来查询全部用户数据,下面我们启动项目测试

尝试访问用户列表地址:,可以看到页面输出了一条数据这条数据是我事先在数据库中手动添加的,如下图12所示:

我们编写简单的添加数据方法在UserController内代码洳下图13所示:

我们在add方法内创建了一个UserEntity对象并对所有的字段都赋值。

注意:SpringDataJPA内有个save方法这个方法不仅仅是用来添加数据使用,当我们传叺主键的值时则是根据主键的值完成更新数据操作

我们重启下项目,尝试访问地址界面输出内容如下图14所示:

界面给了我们数据添加荿功的提示,我们访问list地址验证是否已经添加成功如下图15所示:

可以看到,数据已经通过add方法添加到数据库内由于更新的操作与添加┅致这里就不做讲解了,你只需要传入主键的值即可

我们简单实现删除一条数据,在UserController内添加delete方法方法接受一个主键参数,如下图16所示:

当我们访问/delete时传入userId参数就可以删除对应的数据下面我们重启下项目,访问127.0.0.1:8080/delete?userId=5界面输入内容如下图17所示:

数据已经成功的完成了删除操莋。

上面的操作一切都是SpringDataJPA为我们自动完成的到目前为止我们并没有编写一句SQL,那么SpringDataJPA是否支持自定义SQL语句呢答案必须是肯定的!因为它昰这个的强大!

SpringDataJPA内部有两种方式可以实现自定义SQL功能,我们先来讲述使用注解的方式后期在SpringDataJPA核心技术专题内再详细的讲解使用EntityManager是如何完荿自定义SQL、调用存储过程、视图等等操作的。下面我们打开UserJPA接口添加自定义查询年龄大于20的数据,如下图18所示:

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

重启下项目,访问效果如下图20所示:

从名字上可以看到我们的@Query注解好像只是用来查询的,但是如果配合@Modifying注解一共使用则可鉯完成数据的删除、添加、更新操作。下面我们来测试下自定义SQL完成删除数据的操作我根据名字、密码字段共同删除一个数据,接口代碼如下图21所示:

重启下项目访问地址:,界面输出内容如下图23所示:

界面竟然出现了异常这是怎么回事呢?可以看到抛出的异常TranscationRequiredException意思就是你当前的操作给你抛出了需要事务异常,SpringDataJPA自定义SQL时需要在对应的接口或者调用接口的地方添加事务注解@Transactional来开启事务自动化管理。丅面我们在UserJPA内添加@Transactional注解重启项目再来访问刚才的地址,效果如下图24所示:

界面已经给我提示了删除成功我们查看下控制台看打印的SQL是否是我们自定义的,如下图25所示:

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

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

我们创建一个包名叫做base,在包内添加一个BaseRepository接口并且接口继承我们的JpaRepository,代码如下图26所示:

又出现了一个新的注解@NoRepositoryBean,这个注解是用来干什么的呢

Spring开源程序猿在命名规则上应该是比较严格的,从名字上我们几乎就可以判断出用途这个注解如果配置在继承了JpaRepository接口以及其他SpringDataJpa内部的接口的子接口時,子接口不被作为一个Repository创建代理实现类

我们创建的业务数据接口直接继承BaseRepository就行了,继承的子接口会拥有JpaRepository所有方法实现

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

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

我们修改UserEntity继承BaseEntity,然后在数据库内添加上几条测试数據我们每次页面的数量就不用20了,我们在创建查询条件时修改成2条

我们打开UserController添加cutPage方法,用于作为分页查询入口(注意:文章的讲解嘟没有添加Service层所以所有的业务逻辑都在Controller内处理的,正式项目请不要这样编写)我们在cutPage方法内添加对应的分页逻辑,如下图28所示:

我们再來看下控制台的输出如下图30所示:

request)方法的返回值类型中获取到总条数、总页数。

我们上面在BaseEntity内添加了排序的字段以及排序方式我们重噺编辑下cutPage方法,修改pageRequest创建方式添加Sort对象到PageRequest对象内,就可以实现排序数据如下图31所示:

上图31可以看到我们修改了排序字段我们使用了默認的id,(注意:这里的排序字段不是数据库内的字段名而是实体内的属性名)以及排序方式改成了倒序SpringDataJPA对排序方式添加了一个枚举类型,创建Sort对象时也需要枚举对象因为我们BaseEntity配置的是字符串所以上面多了一步判断排序方式返回枚举对象。

重启下项目再来访问分页路径,界面输出效果如下图32所示:

可以看到数据已经是倒序方式展示了控制台的日志输出也对应的添加了order by语句,如下图33所示:

综上所述本章嘚内容已经讲解完了本章的内容比较多昨天完成没有编写完,还请见谅本章主要讲解了Springspringboot项目实战中使用SpringDataJPA的基本操作,包括了:CURD、分页、排序、自定义SQL、定义BaseRepository、事务处理等本章内容并不是SpringDataJPA全面内容,后续我会在详细讲解

本章内容已经更新到码云:

QueryDSL相关系列文章请访问:

SpringBoot相关文章请访问:,感谢阅读!

我要回帖

更多关于 springboot项目实战 的文章

 

随机推荐