带着新人学springboot的应用08(springboot+jpa的整合)
这一节的内容比较简单,是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的整合)的更多相关文章
- 带着新人学springboot的应用01(springboot+mybatis+缓存 上)
		
上一篇结束,第一次做一个这么长的系列,很多东西我也是没有说到,也许是还没有想到,哈哈哈,不过基本的东西还是说的差不多了的.假如以后碰到了不会的,随便查查资料配置一下就ok. 咳,还有大家如果把我前面的 ...
 - 带着新人学springboot的应用04(springboot+mybatis+redis 完)
		
对于缓存也说了比较多了,大家对下图这一堆配置类现在应该有些很粗略的认识了(因为我也就很粗略的认识了一下,哈哈!),咳,那么我们怎么切换这个缓存呢?(就是不用springboot提供的默认的Simple ...
 - 带着新人学springboot的应用07(springboot+RabbitMQ 下)
		
说一两句废话,强烈推荐各位小伙伴空闲时候也可以写写自己的博客!不管水平高低,不管写的怎么样,不要觉得写不好或者水平不够就不写了(咳,我以前就是这样的想法...自我反省!). 但是开始写博客之后,你会发 ...
 - 带着新人学springboot的应用13(springboot+热部署)
		
spring cloud我想做成一个系列,所以spring cloud+eureka后面会慢慢说到的,有兴趣的小伙伴可以关注后续! 这一节就简单说说springboot的热部署了(我一直想不通为什么叫 ...
 - 带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)
		
这次说个在大型项目比较常见的东西,就是分布式,分布式到底是个什么东西呢?概念太大,不好说,就像刚学javaee的人问你,什么是web啊,什么是spring啊等等,你可能觉得,这个东西我好像知道,但是用 ...
 - 带着新人学springboot的应用10(springboot+定时任务+发邮件)
		
接上一节,环境一样,这次来说另外两个任务,一个是定时任务,一个是发邮件. 1.定时任务 定时任务可以设置精确到秒的准确时间去自动执行方法. 我要一个程序每一秒钟说一句:java小新人最帅 于是,我就写 ...
 - 带着新人学springboot的应用09(springboot+异步任务)
		
本来想说说检索的,不过不知道什么鬼,下载ElasticSearch太慢了,还是放一下,后面有机会再补上!今天就说个简单的东西,来说说任务. 什么叫做任务呢?其实就是类中实现了一个什么功能的方法.常见的 ...
 - 带着新人学springboot的应用06(springboot+RabbitMQ 中)
		
上一节说了这么多废话,看也看烦了,现在我们就来用鼠标点点点,来简单玩一下这个RabbitMQ. 注意:这一节还是不用敲什么代码,因为上一节我们设置了那个可视化工具,我们先用用可视化工具熟悉一下流程. ...
 - 带着新人学springboot的应用05(springboot+RabbitMQ 上)
		
这次就来说说RabbitMQ,这个应该不陌生了,随便一查就知道这个是用来做消息队列的.(注意:这一节很多都是概念的东西,需要操作的比较少) 至于AMQP协议(Advanced Message Queu ...
 
随机推荐
- Java类是如何默认继承Object的
			
前言 学过Java的人都知道,Object是所有类的父类.但是你有没有这样的疑问,我并没有写extends Object,它是怎么默认继承Object的呢? 那么今天我们就来看看像Java这种依赖于虚 ...
 - vue 格式化银行卡(信用卡)每4位一个符号隔断
			
问题 在做银行卡输入框时有一个需求如题,这里举例用-隔断 调查 查看了很多大公司网站的银行卡输入,发现还有有很多缺陷的: 有的是在中间删除,光标会跳到最后: 有的是能删除掉中间隔断符的: 等等,逻辑感 ...
 - Kubernetes1.7—DNS安装
			
虽然通过了Service解决了Pod重建后IP动态变化(服务发现).负载均衡问题,但使用Service还是要需要知道CLUSTER-IP,而通过NDS可以解决该问题:在Kubernetes集群中可通过 ...
 - Anaconda虚拟环境
			
创建虚拟环境:conda create -n env_name packages 例:创建名为env1的虚拟环境,并在其中安装numpy,conda create -n env1 numpy. 指定特 ...
 - tyflow birth节点
			
0-50帧,持续出生5颗粒子,若范围为0-0,5颗粒子将在第一帧全部出生 每一帧出生5颗粒子,直到50帧结束 连续发射,在0-500帧范围内,每5颗粒子出生后,继续出生5颗 5颗粒子出生后持续50帧, ...
 - ES6的Module 的用法
			
在vue-cli中遇到的模糊参考 https://www.cnblogs.com/ppJuan/p/7151000.html 解决问题: 在 ES6 之前,社区制定了一些模块加载方案,最主要的有 Co ...
 - 快速搭建react项目骨架(按需加载、redux、axios、项目级目录等等)
			
一.前言 最近整理了一下项目骨架,顺便自定义了一个脚手架,方便日后使用.我会从头开始,步骤一步步写明白,如果还有不清楚的可以评论区留言.先大致介绍一下这个骨架,我们采用 create-react-ap ...
 - Oracle 闪回   找回数据
			
使用闪回技术,实现基于磁盘上闪回恢复区的自动备份与还原. 一.恢复表对象 1.创建学生表 create table STUDENT ( idno INTEGER, name VARCHAR2(30), ...
 - TCPDF解决保存中文文件名的方法
			
PHP使用TCPDF生成PDF文件时,如果文件名是中文会被直接过滤掉,以下是TCPDF不能保存中文文件名的解决方法: 打开tcpdf.php文件,找到output函数,大约在8467行 或(7554) ...
 - kali linux学习笔记(四) :  网络端口大全介绍
			
端口大全介绍 2端口:管理实用程序 3端口:压缩进程 5端口:远程作业登录 7端口:回显 9端口:丢弃 11端口:在线用户 13端口:时间 17端口:每日引用 18端口:消息发送协议 19端口:字符发 ...