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

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

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

1.大概说一下jpa的好处(熟悉的话可以跳过)

  前面说过springboot和mybatis的整合,用mybatis的最大优点就是可以看得见sql语句,我们想改就改,想怎么优化就怎么优化。

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

  那为什么这么麻烦呢?直接使用hibernate不就好了吗?

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

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

  有没有觉得,代码几乎一样,我们只需要搞清楚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得了。

 

带着新人学springboot的应用08(springboot+jpa的整合)的更多相关文章

  1. 带着新人学springboot的应用01(springboot+mybatis+缓存 上)

    上一篇结束,第一次做一个这么长的系列,很多东西我也是没有说到,也许是还没有想到,哈哈哈,不过基本的东西还是说的差不多了的.假如以后碰到了不会的,随便查查资料配置一下就ok. 咳,还有大家如果把我前面的 ...

  2. 带着新人学springboot的应用04(springboot+mybatis+redis 完)

    对于缓存也说了比较多了,大家对下图这一堆配置类现在应该有些很粗略的认识了(因为我也就很粗略的认识了一下,哈哈!),咳,那么我们怎么切换这个缓存呢?(就是不用springboot提供的默认的Simple ...

  3. 带着新人学springboot的应用07(springboot+RabbitMQ 下)

    说一两句废话,强烈推荐各位小伙伴空闲时候也可以写写自己的博客!不管水平高低,不管写的怎么样,不要觉得写不好或者水平不够就不写了(咳,我以前就是这样的想法...自我反省!). 但是开始写博客之后,你会发 ...

  4. 带着新人学springboot的应用13(springboot+热部署)

    spring cloud我想做成一个系列,所以spring cloud+eureka后面会慢慢说到的,有兴趣的小伙伴可以关注后续! 这一节就简单说说springboot的热部署了(我一直想不通为什么叫 ...

  5. 带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

    这次说个在大型项目比较常见的东西,就是分布式,分布式到底是个什么东西呢?概念太大,不好说,就像刚学javaee的人问你,什么是web啊,什么是spring啊等等,你可能觉得,这个东西我好像知道,但是用 ...

  6. 带着新人学springboot的应用10(springboot+定时任务+发邮件)

    接上一节,环境一样,这次来说另外两个任务,一个是定时任务,一个是发邮件. 1.定时任务 定时任务可以设置精确到秒的准确时间去自动执行方法. 我要一个程序每一秒钟说一句:java小新人最帅 于是,我就写 ...

  7. 带着新人学springboot的应用09(springboot+异步任务)

    本来想说说检索的,不过不知道什么鬼,下载ElasticSearch太慢了,还是放一下,后面有机会再补上!今天就说个简单的东西,来说说任务. 什么叫做任务呢?其实就是类中实现了一个什么功能的方法.常见的 ...

  8. 带着新人学springboot的应用06(springboot+RabbitMQ 中)

    上一节说了这么多废话,看也看烦了,现在我们就来用鼠标点点点,来简单玩一下这个RabbitMQ. 注意:这一节还是不用敲什么代码,因为上一节我们设置了那个可视化工具,我们先用用可视化工具熟悉一下流程. ...

  9. 带着新人学springboot的应用05(springboot+RabbitMQ 上)

    这次就来说说RabbitMQ,这个应该不陌生了,随便一查就知道这个是用来做消息队列的.(注意:这一节很多都是概念的东西,需要操作的比较少) 至于AMQP协议(Advanced Message Queu ...

随机推荐

  1. ISP PIPLINE (十一) color correction

    什么是color correction? 为什么要进行color correction? 转换后的色彩饱和度更加明显,更加符合人眼感官. 如何进行color correction? 下图是步骤: 第一 ...

  2. 2018-2019-2 网络对抗技术 20162329 Exp2 后门原理与实践

    目录 1.实践基础 1.1.什么是后门 1.2.基础问题 2.实践内容 2.1.使用netcat获取主机操作Shell,cron启动 2.2.使用socat获取主机操作Shell, 任务计划启动 2. ...

  3. 记一次非常规方法对接硬件设备(Grason Stadler GSI 61)

    Grason Stadler GSI 61 电测听设备 (写下设备的名字, 希望别人遇坑可以搜到) 对接说明 设备厂家提供自带的软件,但是没有找到接口说明.我们需要获取设备发送过来的数据. 厂家提供的 ...

  4. angular1.3 video

    video标签动态获取播放链接是出现 Error: $interpolate:interr Interpolation Error Error: $sce:insecurl Processing of ...

  5. hive动态分区和混合分区

    各位看官,今天我们来讨论下再Hive中的动态分区和混合分区方面的一些知识点以及相关的一些问题. 前面我们已经讲过管理表和外部表的一般分区的一些知识点,对于需要对表创建很多的分区,那么用户就需要些很多的 ...

  6. Shell 编程注意点

    (一)判断语句 [$# -lt 4 ]判断语句,格式[空格 比较对象1 比较符号 比较对象2] $# 启动脚本时携带参数个数;参数个数总数. $1 代表第一个参数. $? 最后一次执行名命令的退出状态 ...

  7. 【C语言】多项式加法(mooc第七周测试题)

    这个小题目吧我折磨的够呛,,主要在于特殊情况考虑不周,测试用例老是通不过.. 小结: 做法:用一个数组来存储多项式,用下标表示幂次数,数组元素值表示对应系数 输出特殊格式考虑:系数和幂次数为0,1,- ...

  8. 12.JavaScript字符串方法

    JS字符串常用方法总结 动态方法:1.str.charAt(index);  返回子字符串,index为字符串下标,index取值范围[0,str.length-1] 动态方法:2.str.charC ...

  9. 微信小程序开发工具中快捷键

    微信小程序开发工具表面上是没有更多的样式类的工具,例如缩进.隐藏代码什么的. 现在总结一下小程序开发工具常用的一些快捷键: 格式调整 Ctrl+S:保存文件Ctrl+[, Ctrl+]:代码行缩进Ct ...

  10. 深入解析Java反射-invoke方法

    博客原文:http://www.sczyh30.com/posts/Java/java-reflection-2/ 上篇文章中回顾了一下Java反射相关的基础内容.这一节我们来深入研究Method类中 ...