【Spring Data 系列学习】Spring Data JPA 基础查询

前面的章节简单讲解了 了解 Spring Data JPA 、 Jpa 和 Hibernate,本章节开始通过案例上手 Spring boot Jpa 。

spring data

Spring Data 库的核心接口是 Repository。首先需要定义实体类的接口,接口必须继承 repository 并且输入实体类型和 ID 类型,如果需要用到 CRUD 方法,可以使用 CrudRepository 来替代 Repository 。除了 CrudRepository 还有 PagingAndSortingRepository JpaRepository 等。

我们用工具 IntelliJ IDEA,打开类 Repository.class,默认快捷键 CTRL+H ,如图显示:

从上图我们可以看出继承关系,点击 JpaRepository 打开Navigate→File Structure,或者点击最左边的 Structure,可以查看此类的结构以及有哪些方法和继承类。

  • CrudRepository :基本的 CRUD 方法。
  • PagingAndSortingRepository :继承 CrudRepository,并增加分页功能。
  • JpaRepository :继承 PagingAndSortingRepository QueryByExampleExecutor

快速上手

创建一个 Spring boot 项目,创建项⽬在 Chapter1项⽬ pom.xml 加入需要使⽤的依赖,如下所示:

<!--   引入  jpa-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--mysql 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>

配置文件application.properties

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456 # 打印 sql 语句
spring.jpa.show-sql= true
# 自动创建表
spring.jpa.properties.hibernate.hbm2ddl.auto=create
# 默认创建的mysql表为 MyISAM 引擎修改为InnoDB问题
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect

spring.jpa.properties.hibernate.hbm2ddl.auto 参数说明:

  • create:每次运行会先删除对应的表,通过实体类重新生成表。请勿再生产环境。
  • create-drop:sessionFactory 关闭时会清空表中的数据。
  • update:运行时如果没有表会自动创建表,只会更新表内数据不会请空数据。(推荐使用)
  • validate:运行时验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

实体类映射数据库表

user 实体类

@Entity
public class User implements Serializable { private static final long serialVersionUID = -390763540622907853L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private String name; private Integer age; // 省略构造器 set/get }

@Entity 定义对象将会成为被JPA管理的实体,将映射到指定的数据库表。

@Id 定义属性为数据库的主键,一个实体里面必须有一个。

@GeneratedValue(strategy = GenerationType.IDENTITY) 自增长 ID 策略

继承 CrudRepository

public interface UserCrudRepository extends CrudRepository<User, Long> {
}

CrudRepository<实体类,主键>

CURD 测试类

路径:src/test/java/com/mtcarpenter/repository/UserCrudRepositoryTest.java

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserCrudRepositoryTest { /**
* ⽇志对象
*/
private Logger logger = LoggerFactory.getLogger(UserCrudRepositoryTest.class); @Autowired
private UserCrudRepository userCrudRepository; @Test
public void save() {
logger.info("新增数据 result = {}", userCrudRepository.save(new User("小米", 9)));
logger.info("新增数据 result = {}", userCrudRepository.save(new User("张三", 16)));
logger.info("新增数据 result = {}", userCrudRepository.save(new User("三哥", 12)));
logger.info("新增数据 result = {}", userCrudRepository.save(new User("米二", 8)));
} @Test
public void edit() {
logger.info("编辑用户 result = {}", userCrudRepository.save(new User(3L, "三三", 16)));
} @Test
public void delete() {
userCrudRepository.deleteById(3L);
} @Test
public void findById() {
logger.info("通过 id 查询 result = {}",userCrudRepository.findById(1L));
} @Test
public void findAll(){
logger.info("查询所有记录 result = {}",userCrudRepository.findAll());
} }

输出日志:

Hibernate: insert into user (age, name) values (?, ?)
2020-02-29 13:18:36.809 INFO 48452 --- [ main] c.m.c.repository.UserCrudRepositoryTest : 新增数据 result = User{id=1, name='小米', age=9}
Hibernate: insert into user (age, name) values (?, ?)
2020-02-29 13:18:36.828 INFO 48452 --- [ main] c.m.c.repository.UserCrudRepositoryTest : 新增数据 result = User{id=2, name='张三', age=16}
Hibernate: insert into user (age, name) values (?, ?)
2020-02-29 13:18:36.848 INFO 48452 --- [ main] c.m.c.repository.UserCrudRepositoryTest : 新增数据 result = User{id=3, name='三哥', age=12}
Hibernate: insert into user (age, name) values (?, ?)
2020-02-29 13:18:36.861 INFO 48452 --- [ main] c.m.c.repository.UserCrudRepositoryTest : 新增数据 result = User{id=4, name='米二', age=8}

spring.jpa.show-sql= true 开启之后会在控制台输出 SQL 语句,在日常测试环境也能提高一定的开发效率。

示例代码-github

【Spring Data 系列学习】Spring Data JPA 基础查询的更多相关文章

  1. Spring Data Jpa (二)JPA基础查询

    介绍Spring Data Common里面的公用基本方法 (1)Spring Data Common的Repository Repository位于Spring Data Common的lib里面, ...

  2. 【Spring Data 系列学习】Spring Data JPA @Query 注解查询

    [Spring Data 系列学习]Spring Data JPA @Query 注解查询 前面的章节讲述了 Spring Data Jpa 通过声明式对数据库进行操作,上手速度快简单易操作.但同时 ...

  3. Spring Data JPA 简单查询--接口方法

    一.接口方法整理速查 下表针对于简单查询,即JpaRepository接口(继承了CrudRepository接口.PagingAndSortingRepository接口)中的可访问方法进行整理.( ...

  4. Spring Data JPA简单查询接口方法速查

    下表针对于简单查询,即JpaRepository接口(继承了CrudRepository接口.PagingAndSortingRepository接口)中的可访问方法进行整理.(1)先按照功能进行分类 ...

  5. 【Spring Data 系列学习】了解 Spring Data JPA 、 Jpa 和 Hibernate

    在开始学习 Spring Data JPA 之前,首先讨论下 Spring Data Jpa.JPA 和 Hibernate 之前的关系. JPA JPA 是 Java Persistence API ...

  6. spring data jpa 分页查询

    https://www.cnblogs.com/hdwang/p/7843405.html spring data jpa 分页查询   法一(本地sql查询,注意表名啥的都用数据库中的名称,适用于特 ...

  7. springboot整合spring data jpa 动态查询

    Spring Data JPA虽然大大的简化了持久层的开发,但是在实际开发中,很多地方都需要高级动态查询,在实现动态查询时我们需要用到Criteria API,主要是以下三个: 1.Criteria ...

  8. springboot集成Spring Data JPA数据查询

    1.JPA介绍 JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据.它的出现主要是为 ...

  9. spring data JPA entityManager查询 并将查询到的值转为实体对象

    spring data JPA entityManager查询 并将查询到的值转为实体对象 . https://blog.csdn.net/qq_34791233/article/details/81 ...

随机推荐

  1. 计量经济与时间序列_ADF单位根检验步骤

    1 ADF检验也叫扩展的迪克富勒检验,主要作用是检测序列的平稳性,也是最常用检测序列平稳性的检验方法. 2 何为:平稳性?单位根?(略),见这部分随便的其他内容有讲解.是建模对数据的先决条件. 3 A ...

  2. Helvetic Coding Contest 2019 差A3 C3 D2 X1 X2

    Helvetic Coding Contest 2019 A2 题意:给一个长度为 n 的01序列 y.认为 k 合法当且仅当存在一个长度为 n 的01序列 x,使得 x 异或 x 循环右移 k 位的 ...

  3. Windows_Management_Instrumentation

    WMI是管理系统中的核心 使用本工具的前提是:系统的服务列表中,Windows_Management_Instrumentation(winmgmts)这个服务处于运行状态.如果处于关闭状态,请在运行 ...

  4. 存储映射I/O函数

    1.void  * mmap((void *addr, size_t length, int prot, int flags, int fd, off_t offset) 参数: addr:用于指定映 ...

  5. XRichText

    XRichText是一个可以显示Html富文本的TextView.可以用于显示新闻.商品详情等场景.欢迎star.fork,提出意见. 使用 Gradle : compile 'cn.droidlov ...

  6. PCA的原理简述

    PCA的实质就是要根据样本向量之间的相关性排序,去掉相关性低的信息,也就是冗余的特征信息. 我们都知道噪声信号与待测量的信号之间实际上是没有相关性的,所以我我们利用这个原理就可以将与待测量无关的噪声信 ...

  7. python-django项目基础-haystack&whoosh&jieba_20191124

    全文检索框架和搜索引擎的安装和配置: 安装全文检索框架,pip install django-haystack, 安装搜索引擎,pip install whoosh settings里面配置 1,注册 ...

  8. javascript中的undefined 和 not defined

    经研究发现,两者之间有很大的区别,不知从英语讲,这两者都有啥区别,研究结果如下 测试os:ubuntu 测试浏览器:chrome 测试案例1 console.log(a) 报错 ReferenceEr ...

  9. cs231n spring 2017 lecture12 Visualizing and Understanding

    这一节课很零碎. 1. 神经网络到底在干嘛? 浅层的是具体的特征(比如边.角.色块等),高层的更抽象,最后的全连接层是把图片编码成一维向量然后和每一类标签作比较.如果直接把图片和标签做像素级的最近领域 ...

  10. rocket mq 入门文档

    原文地址: http://jm.taobao.org/2017/01/12/rocketmq-quick-start-in-10-minutes/ 感谢原作者 十分钟入门RocketMQ 本文首先引出 ...