首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot开发案例之整合Spring-data-jpa

SpringBoot开发案例之整合Spring-data-jpa

原创
作者头像
小柒2012
修改于 2018-03-31 09:34:54
修改于 2018-03-31 09:34:54
3.3K7
举报
文章被收录于专栏:IT笔记IT笔记

即使你是天才,如果你不努力,你也会被其它人超越。

201509100645102367.jpg
201509100645102367.jpg

扯淡

扯了那么多篇SpringBoot的相关案例,基本每行代码都是博主纯手工编写,附代码案例,懂Maven和Git的小伙伴必须可以手到擒来。

SpringBoot使得开发变的更加简洁,快速,当然被封装的越来越深。此时你就要引入越来越多的第三方工具类,虽然你可以把搭建好的项目运行起来,却无法理解是怎么跑起来的。有些人带着疑惑查阅文档,阅读源码,多年以后便成了大牛;有些人不求甚解,能跑就行,就这样干了N年CURD。

俗话说的好,燕雀安知鸿鹄之志哉?然子非鱼又焉知鱼之乐?curd并快乐着。每个人,都会有自己的成长轨迹,或平凡或精彩或或或或,快使用双节棍,嘿嘿哈嘿。

简介

好了,淡就扯这么多,今天与大家分享一款"超薄"的数据访问层框架Spring-data-jpa,依赖Hibernate,对Hibernate有一定的基础,可以更好的理解。

什么是spring-data

为了简化程序与数据库交互的代码,spring提供了一个现成的dao层框架,spring家族提供的spring-data适用于关系型数据库和nosql数据库。比如之前我们讲解的案例:

SpringBoot开发案例之整合mongoDB,当然还有Spring Data Solr,Spring Data Redis以及我们今天要分享的Spring Data JPA。

详解的可以参考:官网

什么是jpa

JPA全称为Java持久性API(Java Persistence API),JPA是java EE 5标准之一,是一个ORM规范,由厂商来实现该规范,目前有hibernate、OpenJPA、TopLink、EclipseJPA等实现。

如何使用JPA

查询
  • 查询所有数据 findAll()
  • 分页查询 findAll(new PageRequest(0, 2))
  • 根据id查询 findOne()
  • 根据实体类属性查询: findByProperty (type Property); 例如:findByAge(int age);
  • 排序: findAll(sort )
  • Sort sort = new Sort(Sort.Direction.DESC, "age").and (new Sort(Sort.Direction.DESC, "id"));
  • 条件查询 and/or/findByAgeLessThan/LessThanEqual 等,
  • 例如: findByUsernameAndPassword(String username , String password)
  • 总数 查询 count() 或者 根据某个属性的值查询总数countByAge(int age);
  • 是否存在某个id exists()
修改,删除,新增
  • 新增:直接使用 save(T) 方法
  • 删除: delete() 或者 deleteByProperty 例如:deleteByAge(int age) ;
  • 更新: @Modifying @Query("update Customer u set u.age = ?1 where u.id = ?2") int update(int age1 , long id);

项目结构

spring-data-jpa.png
spring-data-jpa.png

相关配置

pom.xml(部分代码,详见源码):

代码语言:txt
AI代码解释
复制
<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

application.properties:

代码语言:txt
AI代码解释
复制
# 项目contextPath
server.context-path=/jpa
# 服务端口
server.port=8080
# session最大超时时间(分钟),默认为30
server.session-timeout=60
# 该服务绑定IP地址,启动服务器时如本机不是该IP地址则抛出异常启动失败,只有特殊需求的情况下才配置
#server.address=192.168.1.66

# tomcat最大线程数,默认为200
server.tomcat.max-threads=100
# tomcat的URI编码
server.tomcat.uri-encoding=UTF-8

#注意中文乱码
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto" property. Default to "create-drop" when using an embedded database, "none" otherwise.
spring.jpa.hibernate.ddl-auto = update
# Hibernate 4 naming strategy fully qualified name. Not supported with Hibernate 5.
spring.jpa.hibernate.naming.strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置属性,其主要作用是:自动创建、更新、验证数据库表结构。该参数的几种配置如下:

  • create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
  • create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
  • update:最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
  • validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

实体类 User.java:

代码语言:txt
AI代码解释
复制
package com.itstyle.jpa.model;
import java.io.Serializable;
import javax.persistence.*;
/**
 * 用户实体(此处注意引用的注解包为javax.persistence*下面的)
 * 创建者 科帮网
 * 创建时间	2017年7月25日
 *
 */
@Entity
@Table(name = "sys_user")
public class User implements Serializable{
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "id", nullable = false)
	private Long id;
	@Column(nullable = false, name = "name")
	private String name;
	@Column(nullable = false, name = "age")
	private Integer age;
    --- 省略 get set 方法
}

数据操作UserRepository.java:

代码语言:txt
AI代码解释
复制
/**
 * 数据操作层
 * 创建者 科帮网
 * 创建时间	2017年7月25日
 *
 */
public interface UserRepository extends JpaRepository<User, Long> {

	User findByName(String name);
	
	User findByAge(Integer age);

	User findByNameAndAge(String name, Integer age);
	
	List<User> findByNameLike(String name);

	@Query("from User u where u.name=:name")
	User findUser(@Param("name") String name);
	
}

小伙伴没有没有发现,我们只是定义了一个方法而已,怎么就这么奇妙的实现的对应功能?其实这是Spring-data-jpa的新特性,通过解析方法名创建查询。更多解析说明如下:

And => 等价于 SQL 中的 and 关键字 例如:findByUsernameAndPassword(String user, Striang pwd);

Or => 等价于 SQL 中的 or 关键字,例如:findByUsernameOrAddress(String user, String addr);

Between => 等价于 SQL 中的 between 关键字,例如:SalaryBetween(int max, int min);

LessThan => 等价于 SQL 中的 "<",例如: findBySalaryLessThan(int max);

GreaterThan => 等价于 SQL 中的">",例如: findBySalaryGreaterThan(int min);

IsNull => 等价于 SQL 中的 "is null",例如: findByUsernameIsNull();

IsNotNull => 等价于 SQL 中的 "is not null",例如: findByUsernameIsNotNull();

NotNull=> 与 IsNotNull 等价;

Like => 等价于 SQL 中的 "like",例如: findByUsernameLike(String user);

NotLike => 等价于 SQL 中的 "not like",例如: findByUsernameNotLike(String user);

OrderBy => 等价于 SQL 中的 "order by",例如: findByUsernameOrderBySalaryAsc(String user);

Not => 等价于 SQL 中的 "! =",例如: findByUsernameNot(String user);

In => 等价于 SQL 中的 "in",例如: findByUsernameIn(Collection<String> userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;

NotIn => 等价于 SQL 中的 "not in",例如: findByUsernameNotIn(Collection<String> userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;

创建一个按单字段排序的Sort对象: new Sort(Sort.Direction.DESC, "description").and(new Sort(Sort.Direction.ASC, "id"))

最终测试类SpringbootJpaApplication.java:

代码语言:txt
AI代码解释
复制
package com.itstyle.jpa;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.itstyle.jpa.model.User;
import com.itstyle.jpa.repository.UserRepository;

@SpringBootApplication
public class SpringbootJpaApplication implements CommandLineRunner {

	@Autowired
	private UserRepository userRepository;

	public static void main(String[] args) {
		SpringApplication.run(SpringbootJpaApplication.class, args);
	}

	@Override
	public void run(String... args) throws Exception {
		try {
			User user = new User();
			user.setName("张三");
			user.setAge(20);
			userRepository.save(user);
			List<User> u = userRepository.findByNameLike("%张三%");
			System.out.println(u.size());
			User  us =  userRepository.findByAge(20);
			System.out.println(us.getAge());
			us =  userRepository.findByName("这是你干");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

偶遇问题

No identifier specified for entity:

检查一下包是否引入正确,引入一下:

代码语言:txt
AI代码解释
复制
import javax.persistence.*;

中文乱码问题:

代码语言:txt
AI代码解释
复制
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8

在高版本mysql中需要指定是否进行SSL连接

代码语言:txt
AI代码解释
复制
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&useSSL=false

代码:https://git.oschina.net/52itstyle/spring-data-jpa

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
7 条评论
热度
最新
只使用过springMVC ,不知这两者相比性能如何?
只使用过springMVC ,不知这两者相比性能如何?
回复回复点赞举报
看着有点晕,先收藏,谢谢楼主的经验
看着有点晕,先收藏,谢谢楼主的经验
回复回复点赞举报
简单用起来还挺方便,复杂的查询逻辑就很麻烦了
简单用起来还挺方便,复杂的查询逻辑就很麻烦了
回复回复点赞举报
感谢博主分享。SpringBoot是一个非常不错的框架,简化了Spring应用的搭建和开发
感谢博主分享。SpringBoot是一个非常不错的框架,简化了Spring应用的搭建和开发
回复回复点赞举报
感谢分享!
感谢分享!
回复回复点赞举报
用这个框架还是蛮简单的
用这个框架还是蛮简单的
回复回复点赞举报
Spring-data-jpa这个框架简化程序与数据库交互的代码。
Spring-data-jpa这个框架简化程序与数据库交互的代码。
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Spring-Data-JPA尝鲜:快速搭建CRUD+分页后台实例
JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate,TopLink,JDO等ORM框架各自为营的局面。值得注意的是,JPA是在充分吸收了现有Hibernate,TopLink,JDO等ORM框架的基础上发展而来的,具有易于使用,伸缩性强等优点。从目前的开发社区的反应上看,JPA受到了极大的支持和赞扬,其中就包括了Spring与EJB3.0的开发团队。
我没有三颗心脏
2019/02/14
1.7K0
Spring-Data-JPA尝鲜:快速搭建CRUD+分页后台实例
Spring Boot 与 Kotlin使用Spring-data-jpa简化数据访问层
在《Spring Boot 与 Kotlin 使用JdbcTemplate连接MySQL》 中介绍了一种基本的数据访问方式,结合构建RESTful API和使用Thymeleaf模板引擎渲染Web视图的内容就已经可以完成App服务端和Web站点的开发任务了。
全科
2018/08/15
3.8K0
SpringBoot整合Spring Data JPA
Spring Data JPA 是采用基于JPA规范的Hibernate框架基础下提供了Repository层的实现。Spring Data Repository极大地简化了实现各种持久层的数据库访问而写的样板代码量,同时CrudRepository提供了丰富的CRUD功能去管理实体类。SpringBoot框架为Spring Data JPA提供了整合,spring-boot-starter-data-jpa能够让你快速使用这门技术,它提供了以下依赖。
烂猪皮
2023/09/04
4810
SpringBoot整合Spring Data JPA
走进Java接口测试之持久层框架Spring-data-jpa
在接口测试中把 Case存储至数据库中,是比较常见的“数据驱动”做法。而在实际的接口测试用例开发中,对数据库的操作无非就是“增删改查”。就为最普遍的单表操作而言,除了表和字段不同外,语句都是类似的,测试人员需要写大量类似而枯燥的语句来完成业务逻辑。
高楼Zee
2019/07/17
2.7K0
走进Java接口测试之持久层框架Spring-data-jpa
SpringBoot2.0 基础案例(09):集成JPA持久层框架,简化数据库操作
JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范。主要是为了简化持久层开发以及整合ORM技术,结束Hibernate、TopLink、JDO等ORM框架各自为营的局面。JPA是在吸收现有ORM框架的基础上发展而来,易于使用,伸缩性强。
知了一笑
2019/07/19
7300
SpringBoot整合Spring-data-jpa
文章目录 1. SpringBoot整合Spring data jpa 1.1. 依赖 1.2. 主键生成策略 1.3. 配置 1.4. 创建一个实体类 1.5. 基本的查询 1.6. 自定义查询@Query 1.6.1. 使用HQL语句查询 1.6.2. 使用sql语句查询 1.6.3. 删除和修改 1.7. 复杂条件查询 1.8. 分页查询 1.8.1. PageRequest 1.8.2. Page 1.8.3. 简单查询 1.8.4. 简单条件分页查询 1.8.5. 复杂条件分页查询 1.9.
爱撒谎的男孩
2019/12/31
1.6K0
Spring与SpringBoot整合Spring Data JPA及使用
Spring Data JPA是Spring Data项目下的一个模块。提供了一套基于JPA标准操作数据库的简化方案,底层默认是依赖Hibernate JPA来实现的。
害恶细君
2022/11/22
4.8K0
Spring与SpringBoot整合Spring Data JPA及使用
Spring Boot 最佳实践(五)Spring Data JPA 操作 MySQL 8
JPA(Java Persistence API)Java持久化API,是 Java 持久化的标准规范,Hibernate是持久化规范的技术实现,而Spring Data JPA是在 Hibernate 基础上封装的一款框架。
磊哥
2018/09/07
4K0
Spring Boot 最佳实践(五)Spring Data JPA 操作 MySQL 8
第十五节:SpringBoot使用JPA访问数据库
第十四节:SpringBoot使用JdbcTemplate访问操作数据库基本用法
入门笔记
2022/06/02
8690
第十五节:SpringBoot使用JPA访问数据库
SpringBoot入门建站全系列(六)Spring-data-jpa进阶使用
上一篇介绍了Mybatis的配置和基本用法《SpringBoot入门建站全系列(五)使用Spring-data-jpa操作数据库CRUD》
品茗IT
2019/08/07
1.3K0
Spring Data JPA的使用及开启二级缓存
Hibernate 是一个广泛使用的 Java ORM(对象关系映射)框架,它提供了对关系型数据库的映射和操作功能,使开发者能够以面向对象的方式来处理数据库操作,而不用直接编写 SQL 语句。
码客说
2024/01/17
1.5K0
SpringBoot入门建站全系列(五)使用Spring-data-jpa操作数据库
Mybatis插件:比较时髦,比较适合sql复杂,或者对性能要求高的应用,因为sql都是自己写的。
品茗IT
2019/08/06
1.4K0
芋道 Spring Boot JPA 入门(一)之快速入门
摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/JPA/ 「芋道源码」欢迎转载,保留摘要,谢谢!
芋道源码
2019/11/29
1.6K0
Spring-data-jpa(spring数据持久层解决规范)详解
  1、Spring-data-jpa的基本介绍:JPA诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,百度百科说是JDK为了实现ORM的天下归一,目前也是在按照这个方向发展,但是还没能完全实现。在ORM框架中,Hibernate是一支很大的部队,使用很广泛,也很方便,能力也很强,同时Hibernate也是和JPA整合的比较良好,我们可以认为JPA是标准,事实上也是,JPA几乎都是接口,实现都是Hibernate在做,宏观上面看,在JPA的统一之下Hibernate很良好的运行。
ZhangXianSheng
2019/05/28
3.2K0
一起来学SpringBoot | 第六篇:整合SpringDataJpa
上一篇介绍了 SpringJdbcTemplate的使用,对比原始的 JDBC而言,它更加的简洁。但随着表的增加,重复的CRUD工作让我们苦不堪言,这时候 SpringDataJpa的作用就体现出来了.....
battcn
2018/08/03
1.7K0
springboot(五):spring data jpa的使用
在上篇文章springboot(二):web综合开发中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法以及注意事项 使用spring data jpa 开发时,发现国内对spring boot jpa全面介绍的文章比较少案例也比较零碎,因此写文章总结一下。 spring data jpa介绍 首先了解JPA是什么? JPA(Java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对
纯洁的微笑
2018/04/19
2.3K0
Spring-data-JPA详细介绍,增删改查实现「建议收藏」
本篇进行Spring-data-jpa的介绍,几乎涵盖该框架的所有方面,在日常的开发当中,基本上能满足所有需求。这里不讲解JPA和Spring-data-jpa单独使用,所有的内容都是在和Spring整合的环境中实现。如果需要了解该框架的入门,百度一下,很多入门的介绍。在这篇文章的接下来一篇,会有一个系列来讲解mybatis,这个系列从mybatis的入门开始,到基本使用,和spring整合,和第三方插件整合,缓存,插件,最后会持续到mybatis的架构,源码解释,重点会介绍几个重要的设计模式,这样一个体系。基本上讲完之后,mybatis在你面前就没有了秘密,你能解决mybatis的几乎所有问题,并且在开发过程中相当的方便,驾轻就熟。
全栈程序员站长
2022/06/26
3.8K0
Spring-data-JPA详细介绍,增删改查实现「建议收藏」
SpringBoot引入Spring Data JPA
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。
Bobby
2019/04/18
2K0
Spring Data JPA 就是这么简单
jpa 的全称是 Java Persistence API , 中文的字面意思就是 java 的持久层 API , jpa 就是定义了一系列标准,让实体类和数据库中的表建立一个对应的关系,当我们在使用 java 操作实体类的时候能达到操作数据库中表的效果(不用写sql ,就可以达到效果),jpa 的实现思想即是 ORM (Object Relation Mapping),对象关系映射,用于在关系型数据库和业务实体对象之间作一个映射。
程序员小猿
2021/01/19
7.5K0
Spring Data JPA 就是这么简单
Spring Data JPA 使用简解
Spring Data JPA 是一个强大的框架,它极大地简化了基于 JPA(Java Persistence API)进行数据访问层的开发。通过 Spring Data JPA,开发者几乎不需要编写实现代码,就能快速实现数据库操作。下面就简单介绍 Spring Data JPA 的部分概念和使用方法。
繁依Fanyi
2024/06/22
5040
相关推荐
Spring-Data-JPA尝鲜:快速搭建CRUD+分页后台实例
更多 >
交个朋友
加入腾讯云技术交流站
洞悉AI新动向 Get大咖技术交流群
加入云原生工作实战群
云原生落地实践 技术难题攻坚探讨
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档