Spring Boot整合Spring Data JPA操作数据
一、 Sping Data JPA 简介
Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套 JPA 应用框架,底层使用了 Hibernate 的 JPA 技术实现,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring Data JPA 可以极大提高开发效率!
二、 将Spring Data JPA集成到Spring Boot
第一步:引入maven依赖包,包括Spring Data JPA和Mysql的驱动
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
第二步:修改application.yml,配置好数据库连接和jpa的相关配置
spring:datasource:url: jdbc:mysql://192.168.1.91:3306/testdb?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: testpassword: 4rfv$RFVdriver-class-name: com.mysql.jdbc.Driverjpa:hibernate:ddl-auto: updatedatabase: mysqlshow-sql: true
spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置属性,其主要作用是:自动根据实体类的定义创建、更新、验证数据库表结构。该参数的几种配置如下:
- create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
- create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
- update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
- validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
三、 基础核心用法
我们来实现一个简单的使用JPA操作数据库的例子。
3.1.实体Model类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Table(name="article")
public class Article {@Id@GeneratedValueprivate Long id;@Column(nullable = false,length = 32)private String author;@Column(nullable = false, unique = true,length = 32)private String title;@Column(length = 512)private String content;private Date createTime;
}
- @Entity 表示这个类是一个实体类,接受JPA控制管理,对应数据库中的一个表
- @Table 指定这个类对应数据库中的表名。如果这个类名和数据库表名符合驼峰及下划线规则,可以省略这个注解。如FlowType类名对应表名flow_type。
- @Id 指定这个字段为表的主键
- @GeneratedValue(strategy=GenerationType.IDENTITY) 指定主键的生成方式,一般主键为自增的话,就采用GenerationType.IDENTITY的生成方式
- @Column 注解针对一个字段,对应表中的一列。nullable = false表示数据库字段不能为空, unique = true表示数据库字段不能有重复值,length = 32表示数据库字段最大程度为32.
关于更多注解的详细用法,请参考: Hibernate Annotations 参考文档
3.2.数据操作接口
public interface ArticleRepository extends JpaRepository<Article,Long> {
}
XxxRepository继承 JpaRepository<T,ID>为我们提供了各种针对单表的数据操作方法:增删改查。只要你不是完全英语小白,通过调用接口的方法名称就能知道方法是做什么操作的。
3.3.service层接口:
public interface ArticleRestService {ArticleVO saveArticle(ArticleVO article);void deleteArticle(Long id);void updateArticle(ArticleVO article);ArticleVO getArticle(Long id);List<ArticleVO> getAll();
}
3.4.service层接口实现
@Service
public class ArticleJPARestService implements ArticleRestService {//将JPA仓库对象注入@Resourceprivate ArticleRepository articleRepository;@Resourceprivate Mapper dozerMapper;public ArticleVO saveArticle( ArticleVO article) {Article articlePO = dozerMapper.map(article,Article.class);articleRepository.save(articlePO); //保存一个对象到数据库,insertreturn article;}@Overridepublic void deleteArticle(Long id) {articleRepository.deleteById(id); //根据id删除1条数据库记录}@Overridepublic void updateArticle(ArticleVO article) {Article articlePO = dozerMapper.map(article,Article.class);articleRepository.save(articlePO); //更新一个对象到数据库,仍然使用save方法}@Overridepublic ArticleVO getArticle(Long id) {Optional<Article> article = articleRepository.findById(id); //根据id查找一条数据return dozerMapper.map(article.get(),ArticleVO.class);}@Overridepublic List<ArticleVO> getAll() {List<Article> articleLis = articleRepository.findAll(); //查询article表的所有数据return DozerUtils.mapList(articleLis,ArticleVO.class);}
}
注意:虽然新增和修改都是使用的save方法,但是完成的功能是不一样的。当保存的对象有主键id的时候,save方法会根据id更新记录;当保存的对象没有主键id的时候,save方法会向数据库里面insert一条记录。
然后大家可以在控制层调用一下service层方法,用postman测试一下.
四、关键字查询接口
除了上文中JpaRepository为我们提供的增删改查的方法。我们还可以自定义方法,非常简单。把下面的方法名放到ArticleRepository 里面,它就自动为我们实现了通过author字段查找article表的所有数据。也就是说,我们使用了find(查找)关键字,JPA就自动将方法名为我们解析成数据库操作,太智能了。
//注意这个方法的名称,jPA会根据方法名自动生成SQL执行Article findByAuthor(String author);
其他具体的关键字,使用方法和生产成 SQL 如下表所示
Keyword | Sample | JPQL snippet |
---|---|---|
And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
Or | findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2 |
Is,Equals | findByFirstnameIs,findByFirstnameEquals | … where x.firstname = ?1 |
Between | findByStartDateBetween | … where x.startDate between ?1 and ?2 |
LessThan | findByAgeLessThan | … where x.age < ?1 |
LessThanEqual | findByAgeLessThanEqual | … where x.age ⇐ ?1 |
GreaterThan | findByAgeGreaterThan | … where x.age > ?1 |
GreaterThanEqual | findByAgeGreaterThanEqual | … where x.age >= ?1 |
After | findByStartDateAfter | … where x.startDate > ?1 |
Before | findByStartDateBefore | … where x.startDate < ?1 |
IsNull | findByAgeIsNull | … where x.age is null |
IsNotNull,NotNull | findByAge(Is)NotNull | … where x.age not null |
Like | findByFirstnameLike | … where x.firstname like ?1 |
NotLike | findByFirstnameNotLike | … where x.firstname not like ?1 |
StartingWith | findByFirstnameStartingWith | … where x.firstname like ?1 (parameter bound with appended %) |
EndingWith | findByFirstnameEndingWith | … where x.firstname like ?1 (parameter bound with prepended %) |
Containing | findByFirstnameContaining | … where x.firstname like ?1 (parameter bound wrapped in %) |
OrderBy | findByAgeOrderByLastnameDesc | … where x.age = ?1 order by x.lastname desc |
Not | findByLastnameNot | … where x.lastname <> ?1 |
In | findByAgeIn(Collection ages) | … where x.age in ?1 |
NotIn | findByAgeNotIn(Collection age) | … where x.age not in ?1 |
TRUE | findByActiveTrue() | … where x.active = true |
FALSE | findByActiveFalse() | … where x.active = false |
IgnoreCase | findByFirstnameIgnoreCase | … where UPPER(x.firstame) = UPPER(?1) |
可以看到我们这里没有任何类SQL语句就完成了两个条件查询方法。这就是Spring-data-jpa的一大特性:通过解析方法名创建查询。针对单表的数据查询简单到令人发指,怎么可以这么简单,照这个趋势发展,程序员早晚失业。
五、测试关键字查询
@RunWith(SpringRunner.class)
@SpringBootTest
public class JPAKeyWordTest {@Resourceprivate ArticleRepository articleRepository;@Testpublic void userTest() {Article article = articleRepository.findByAuthor("54188");System.out.println(article);}}
六、其他
Spring-data-jpa的能力远不止本文提到的这些,由于本文主要以整合介绍为主,对于Spring-data-jpa的使用只是介绍了常见的使用方式。
相关文章:
常用Linux命令总结
常用Linux命令总结 2013-12-08 压缩为gz格式 gzip error_2018082217.log 解压gz格式 gzip -d error_2018082217.log.gz 不解压来搜索gz格式的文件中的匹配行内容 gunzip -c 不真正解压.gz文件,而是检查该文件,不会生成多余的文件 gunzip -c error_20…
调试uIP出现死机问题
在调试uIP,加入http功能时,调试出现死循环 原因是所加入的http文件中含有printf等输出函数,遇到这种情况,有2种解决方法: 1.Keil中勾选“Use MicroLIB” 2. //加入以下代码,支持printf函数,而…

html+spring boot简单的ajax数据传输实现
本篇讲解在前后端不分离情况下的htmlspring boot的项目数据传输实现 首先,后台我写了三个接口 package com.demo.ajax.controller;import com.demo.ajax.Entity.Person; import lombok.extern.slf4j.Slf4j; import org.jboss.logging.Param; import org.springfram…

Tafficserver旁路接入方案综述
转载自 https://blog.zymlinux.net/index.php/archives/821 随着宽带技术的加速普及,目前,几款高性能开源CDN方案在广大开源爱好团队的充分的测试、企业服务应用验证中破壳而出。实际这个地球的互联网用户都在知情与不知情之间使用了ATS的环保服务。这方…

url中去掉index.php,方便redirect()
01 配置文件 return Array( URL_MODEL > 2,); 02 index.php入口文件下面加入文件 .htaccess -->使用editplus-->另存为 <IfModule mod_rewrite.c>RewriteEngine onRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ i…

js校验复选框(多选按钮)是否被选中的方法
js校验复选框是否被选中的方法 方法一:(使用下标进行标记) if ($("#checkbox-id")get(0).checked) {// do something }方法二:(对被选中的进行操作) if($(#checkbox-id).is(:checked)) {// do…

ATS插件开发基础
转载自 https://blog.zymlinux.net/index.php/archives/540 ATS插件开发需要提前了解ATS的插件的一些设计思想,以及系统提供的一些不同方向。我们将会介绍ATS的基础开发知识,以利于后续的插件开发课程讲解。 ATS的SDK文档,是了解ATS的核心设…

NET基础(3):is 和 as 操作符
在C#语言中进行类型转换的另外一种方式是使用is和as操作符。is检查对象是否兼容于指定类型,返回Boolean值true或false。注意,is操作符永远不抛出异常,例如以下代码: Object o new Object();Boolean b1 (o is Object); //返回…

制作大白菜PE盘
大白菜是一款功能非常强大的U盘启动盘制作工具,通过大白菜我们可以把U盘做成可以引导电脑启动的启动盘,同时可以用于装系统或维护系统,虽然制作方法非常简单,不过还是有很多人不懂如何制作大白菜U盘启动盘,这两天我刚好…
为方便ATS管理建立的一些命令别名
转载自https://blog.zymlinux.net/index.php/archives/129 玩ats经常需要切换目录什么感觉敲得麻烦了就建立了一些命令别名,就方便多了。 在用户目录下的.bashrc文件中加入以下内容: alias alogcd /usr/local/var/log/trafficserver;pwd alias atscd /us…

short s1 = 1; s1 = s1 + 1;有错而short s1 = 1; s1 += 1正确
这个问题以前碰到过,也研究过,发表一下: 如果你认为表达式(x i)只是表达式(x x i)的简写方式,这并不准确。这两个表达式都被称为赋值表达式。第二个表达式使用的是简单赋值操作…

pom文件中引入常用的maven仓库
给大家分享几个maven仓库,如果本地总是下载很慢的话可以尝试换一下仓库或者多加几个。可以直接拖放在pom.xml中使用。 阿里云仓库 <mirrors><mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.ali…

ats新手学习参考
转载自https://blog.zymlinux.net/index.php/archives/129 首先申明本人是个实实在在的菜鸟,现在也只是搭建起来ats玩玩简单的,写本文只是为了给完全的小白一个参考而已。 本人刚开始接触ats的时候,从ats安装到配置也遇到了很多基本的问题&am…

[svc]磁盘接口与RAID
一 磁盘接口 IDE 传统家用: /dev/hda1 SISC 传统服务器: /dev/sdb1 SATA 现在家用 SAS 现在服务器用 FC(光纤通道) 高级服务器 注意: 分区编号,1-4只能给主分区或扩展分区使用,逻辑分区是基于扩展分区来搞的,编号从5开始. MBR分区参考 现在计算机性能瓶颈往往在硬盘: …

条形码?二维码?生成、解析都在这里!
二维码生成与解析 一、生成二维码 二、解析二维码 三、生成一维码 四、全部的代码 五、pom依赖 直接上代码: 一、生成二维码 public class demo {private static final String path1"D:\\code.jpg";private static void qr(String text,int width,int w…

异步预热在线视频实现
转载自https://blog.zymlinux.net/index.php/archives/100 毕业之际给学校搭建了基于ATS的正向代理缓存服务器,专门用来处理优酷土豆等在线视频流量。通过改写一个浏览器做成在线视频专用浏览器,内置了ATS的代理设置。 用php配合memcacheq和小脚本实现了…

文本输入框、密码输入框
当用户要在表单中键入字母、数字等内容时,就会用到文本输入框。文本框也可以转化为密码输入框。 语法: <form><input type"text/password" name"名称" value"文本" /> </form> 1、type: 当t…

Linux安装mysql,一步到位!
今天在腾讯云上面买了一个服务器,想要把自己的项目部署一下,就要安装mysql,以下是我的安装步骤,在网上有很多人把install敲错了,还有的少-get,种种错误试完之后,我决定发一篇 sudo apt-get install mysql-…

Ubuntu 12.04安装firefox 26中的flash plugin方法
Ubuntu 12.04 64bit中安装firefox 26中的flash player插件的方法昨天, 有最新的firefox 26更新了,可是我在软件更新中无法下载到ubuntu官方源中的flash plugin,详细的情况可以参见如下网页,这个问题我一年前也遇到过,特记录下来,以备后来查阅.http://blog.sina.com.cn/s/blog_9…

内联式css样式,直接写在现有的HTML标签中
CSS样式可以写在哪些地方呢?从CSS 样式代码插入的形式来看基本可以分为以下3种:内联式、嵌入式和外部式三种。这一小节先来讲解内联式。 内联式css样式表就是把css代码直接写在现有的HTML标签中,如下面代码: <p style"col…

Linux下安装Java8
Linux(ubuntu)下Java8安装 1.下载jdk8 这个看大家了,linux版本的就可以 2.创建jvm文件夹 在根目录下创建名为jvm的文件夹(在哪里创建看个人) $ sudo mkdir jvm3.将下载的包解压到jvm文件夹下 $ sudo tar zxvf 压缩包路径/名字 -C /jvm…

RTMFP协议
RTMFP是Adobe公司开发的一套新的通信协议,该协议可以让使用Adobe Flash Player的终端用户之间进行直接通信。用Adobe AIR框架开发的程序也可以用此协议来发布直播、实时信息。 通过使用RTMFP, 那些原来直播、实时通信的应用,比如社区、音视频聊天和多人…

CodeForces 595A
题目链接: http://codeforces.com/problemset/problem/595/A 题意: 一栋楼,有n层,每层有m户,每户有2个窗户,问这栋楼还有多少户没有睡觉(只要一个窗户灯亮就代表这户没有睡觉&#x…

将Eclipse中Web项目打成war包
将Eclipse中Web项目打成war包 请按如下操作即可:

测试代码发布到博客效果(Windows Live Writer发布)
测试代码发布到博客效果(Windows Live Writer发布) public class SwitchCase {/*** 1、switch后面的表达式为常量表达式,类型只能是可以转化为int、enum(1.6)、String(1.7)的类型* 2、可以转化为int类型的数据类型有:byte、short、int、char* 3、boolean类型的数据类…

设置腾讯云linux服务器中 MySQL 允许远程访问
申请了一台linux腾讯云服务器,想要把数据库搭建在上面,本地的Windows直接可以访问 以下就是具体的操作流程,首先你需要安装好一个mysql,安装方法–>mysql安装(Linux) 接着就开始操作咯: 一、开启 MySQL 远程访问权…

js 判断js,css是否引入,确保不重复引入
js 判断js,css是否引入,确保不重复引入 (2009-10-31 21:33:44) 转载▼标签: 杂谈 分类: js基本原理:function loadjscssfile(filename, filetype){if (filetype"js"){ //if filename is a external JavaScript filev…

Ubuntu18彻底删除MySQL5.7数据库
首先在终端中查看MySQL的依赖项:dpkg --list|grep mysql (有或者没有都可以继续执行) 移除所有mysql公共依赖:sudo apt-get remove mysql-common 卸载:sudo apt-get autoremove --purge mysql-server-5.7 清除残留数据:dpkg -…

软件缺陷处理流程
今天,我们的主任研究了一下我出的软件缺陷处理流程,觉得不严谨,他重新梳理了一个,偶还是觉得自己梳理的比较直接,没有那么复杂。 这里博客记录,用于纪念我的心血,因为说不定哪天偶的这点心血会被…

Linux下tomcat的安装与卸载以及配置(超简单)
无敌简单的几步 1、安装 //首先你需要下载好tomcat包 sudo tar -xvzf apache-tomcat-7.0.85.tar.gz(这里是包名) -C 你要放的位置2、卸载 rm -rf 你的tomcat目录3配置: 进入目录/tomcat/apache-tomcat-8.5.51/bin,编辑文件startup.sh,在…