带着新人学springboot的应用08(springboot+jpa的整合)

  这一节的内容比较简单,是springboot和jpa的简单整合,jpa默认使用hibernate,因此本质就是springboot和hibernate的整合。java

  说实话,听别人都说spring data jpa很简化操做,不用写多少代码,今天咱们就来看看。mysql

  顺便一提的是,传统大公司用hibernate比较多,互联网公司用mybatis比较多。web

 

1.大概说一下jpa的好处(熟悉的话能够跳过)spring

  前面说过springboot和mybatis的整合,用mybatis的最大优势就是能够看得见sql语句,咱们想改就改,想怎么优化就怎么优化。sql

  可是用过hibernate的小伙伴应该知道,hibernate几乎是看不见sql语句的,由于hibernate底层自动生成,可是前提是你要配置好数据库表和一个javabean的映射关系,也比较麻烦,因此就有了jpa,jpa是一个规范,不是框架(这么说很抽象,你能够把jpa当成一个接口,而hibernate是其中的一个实现类),那么咱们使用jpa,那么间接的就使用了hibernate。数据库

  那为何这么麻烦呢?直接使用hibernate不就行了吗?浏览器

  举个很简单的例子,接口Animal,两个实现类Dog、Cat;假若有个项目咱们要使用Dog里的crud方法,直接Animal animal = new Dog();而后animal.xx();springboot

  过了一段时间咱们又有一个项目要使用Cat里面的crud方法,仍是Animal animal = new Cat();而后animal.xxx();mybatis

  有没有以为,代码几乎同样,咱们只须要搞清楚Animal中的方法,就能使用两个类,学习的成本下降了差很少一半,真正的事半功倍。框架

  jpa的实现常见的hibernate,OpenJPA,TopLink,EclipseJPA这几种,虽然我只用过hibernate,可是,你学会了jpa以后,另外几种你也就会了,由于方法和操做hibernate同样。

  还有就是,开发jpa和开发hibernate的竟然是同一个做者...emmmm...

  再说一下hibernate和spring整合的时候,应该发现了Dao层仍是要写贼多的东西,各类crud方法要慢慢实现;即便用jpa以后,spring整合jpa(实现产品为hibernate),仍是摆脱不了要实现crud方法,虽然代码少写了一点,可是治标不治本;

  可是就当jpa和Spring Data整合以后,你几乎看不到代码了!就一个接口放在那里,即便你有特殊的需求,你只要写个方法,方法名符合必定的规范,就ok了,你都不用实现(固然,实际的项目中不下心可能就碰到了特别复杂的需求,那么仍是老老实实的写sql吧!)。

  spring data是spring的一个子项目,专门针对持久化层的,咱们用过的spring data radis,spring data rabbitmq都是这个项目的模块之一。

 

2.简单的搭建一下环境 

  首先,建立springboot项目,要导入的模块web+mysql+jpa+1.5.18

  话说之前我这版本应该是1.5.16啊,怎么偷偷的趁我不注意自动给我升级到1.5.18了......

 

  而后配置文件配置数据源(就用默认的数据源) 

 

  配置一个javabean去对应和一张表对应

 

   来看看如今的dao层是什么鬼。

  看清楚,这是一个接口,并且不用标示注解!

 

  为了方便,就不写service层了,直接controller层

 

  而后运行springboot项目,就会在数据库建立user表

  

  我手动往表里添加几条数据

 

  打开浏览器,输入url:http://localhost:8080/hello/2,能够看到结果和控制台的sql语句

 

  这是最简单的使用了,其实这里关键是userDao到底能够用哪些方法,截了一下图,大概能够看到基本的crud方法应该是都实现了,你只须要传入相关的参数便可。

  话说每次都说crud,可是具体是哪几个单词知道吗?C(create),R(Read),U(update),D(delete),看到名字应该知道意思吧!

  在springdata jpa中,增长和修改方法都是save()

 

   删除,delete()

 

   查询,方法就多了,但都是相似findxxx(),具体的本身去尝试

 

   

3.貌似比较高级的操做

   所谓高级的操做,无外乎就是自定义嘛!

  由于有的高手就以为我为何用你这个方法啊,我能不能自定义啊?好比我要..emmm...按照名字来查找记录,ok,jpa也提供给你,可是你要想好一个很特别很特殊的方法名,这个方法名不仅仅你认识,并且还要程序认识。(玛德,想个方法名都这么多要求,日了狗哦!)

  那么咱们在dao层自定义一个方法试试(看清楚方法名!) 

  

  controller层我试试这个方法

 

  看看浏览器能不能访问,能访问,ok

 

  因此如今咱们要知道的就是自定义的方法名,要符合什么规范?弄清楚这个了,那自定义方法也就ok了。

  其实规则就跟原生的sql语句差很少,就是提取了关键字而已,好比我要根据name模糊查找,sql语句就是xxx where name like ‘王%’,关键字就是like;因而咱们方法名就是findByNameLike(String name),括号里就是咱们要传进去的条件,至关于‘王%’。

  我猜底层应该会解析方法名,拼接成sql语句,向数据库发送sql语句进行操做,本质上,一个方法就是一条sql语句。

  还有一些关键词,And,Or,Between,OrderBy等等,均可以用于方法名。

  我随便列举一下几个方法名参考一下:

findByUserName(String userName);

findByUserNameOrEmail(String username, String email);

countByUserName(String userName);

findByEmailLike(String email);

List<User> findByUserNameOrderByEmailDesc(String email);

  看名字应该知道是干什么的了,好好体会一下!sql语句用的熟练了,这个应该不难。

 

4.一点小操做

  有的时候理想很丰满,现实却很骨感!你一不当心碰到了一个很是复杂的需求,然而用上面这些规则却老是一副日了狗的表情,你就很怀念用sql语句了!玛德,要是我能用sql语句的话,我不要一分钟就能作好了,如今让我编这个方法名就是特么编不出来啊!

    ok,springboot data jpa也考虑到了你这种需求,因而咱们便能像用mybatis的注解版同样使用jpa了。

  请看下面dao层的方法,是否是和mybatis注解版十分类似啊?不过要注意,这里注解里面的语句没记错的话应该是hql语句吧,操做的是实体类!

  固然若是你要写原生sql语句,在@Query里面就要加个属性:nativeQuery=true,就能够写原生sql语句了,很简单,这里很少说。

  能够取别名,能够有占位符,占位符能够直接是?;不过别人都是?1:表明第一个占位符;若是还有?2:第二个占位符;  还有?3:第三个占位符。。。占位符和参数一一对应,固然还能够用@Param(“xxx”)和形参进行参数绑定,这时hql语句占位符也会发生变化。

  咱们就不搞这些花里胡哨的了,怎么简单怎么来:

 

  查询只要@Query一个注解就能够了,可是增长,修改,删除还须要另一个注解@Modifying,再看一个方法。

 

  要加那个事务的注解,假如不加,会报错,下图所示,emmm....建议增上改方法除了@Query以外,都加上那这两个注解

 

  而后我运行应用,测试了,成功,大家能够本身试试!

  其实后面还有分页,多表查询,有点小麻烦因此我就很不要脸的跳过了,嘿嘿嘿!不过仍是大概说一下:

  分页就是本身定义一下规则,一页多少数据,多少页,包装成一个对象,放到findAll方法里就能够了;而多表查询,前提是两个类创建好关系(就是一对多,多对一什么的),而后重点就是编写@Query里面的hql语句了;

  这里我就是给新手小哥们看一看基本操做,想要深刻了解的小伙伴能够本身查查资料看看分页和多表级联操做。

  其实原本是不想写这个springboot data jpa的,由于用的比较少,还不如springboot+mybatis好玩,不过啊,由于我后面我要说springboot和一个东西的整合,太像springboot jpa了,因而我也顺便说说jpa得了。

相关文章
相关标签/搜索