SpringBoot 学习记录(三): jpa

jpa详解 JPA使用 阅读详情

上篇学习了mybaits的使用,既可以通过注解方式实现,也可以使用常见的xml配置方式实现

这篇我们继续学习数据库访问层jpa,集各家所长,各取所需吧

一,第一步当然还是引入相关依赖包,在pom.xml中继续添加:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
二,jpa底层是由Hibernate来实现的,需要在application.properties中添加相关配置
#jpa
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql= true
spring.jackson.serialization.indent_output=true
这里说明一下:
hibernate.hbm2ddl.auto参数的作用主要用于:自动创建|更新|验证数据库表结构,有四个值:

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

另外新建sql脚本,命名schema.sql,并放在classpath下面,那么在应用启动的时候会在结束前读取脚本,执行命令
三,测试,我们新建实体类UserInfo,启动查看是否自动创建了table
package com.example.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;

@Entity
@Table(name="user_info")
public class UserInfo {

	@Id
	@GeneratedValue
	private long id;
	
	private String name;
	
	private String gender;
	
	/** 不映射成数据表 */
	@Transient
	private String status;

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}
		
}

四,启动查看,数据库创建了空的table,user_info

五,加入schema.sql脚本,重新启动

insert into user_info (name,gender) values('initname','M');

再查看数据库,此时已成功插入一条初始化数据,这里需要注意两点:

1,开始我引入的spring-boot-starter-parent版本是1.3.8的,前面都没问题,

引入jpa后项目就报错了,查看本地仓库,依赖包也下载下来了,不知道什么原因,

于是更改parent版本为1.3.6,成功启动

2,执行schema.sql脚本,前提是已经创建好了table,自动创建table是应用第一次启动结束后才会创建

而读取脚本文件是在应用启动结束前,如果没有创建table就加入脚本文件,会找不到table报错,另外每次重启都会执行一次。

六,创建UserInfoRepository 继承Repository接口,基本方法已经有实现,继承后能直接使用

这也是使用jpa的便利之处:

package com.example.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.example.entity.UserInfo;

public interface UserInfoRepository extends JpaRepository<UserInfo, Long>{

}

七,创建UserController,这里简化了代码,没有使用service层,仅供测试用

package com.example.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.example.entity.UserInfo;
import com.example.repository.UserInfoRepository;

@RestController
public class UserController {
	
	@Autowired
	private UserInfoRepository userRepository;
	
	@RequestMapping(value="/user/save",method=RequestMethod.GET)
	public void save(){
		UserInfo user = new UserInfo();
		user.setGender("F");
		user.setName("wendy");
		userRepository.save(user);
	}
	
}
八,查看控制台打印sql语句:
2017-04-07 17:09:01.728  INFO 516 --- [nio-8088-exec-1] o.a.c.c.C.[.[localhost].[/spring-boot]   : Initializing Spring FrameworkServlet 'dispatcherServlet'
2017-04-07 17:09:01.729  INFO 516 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2017-04-07 17:09:01.761  INFO 516 --- [nio-8088-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 32 ms
Hibernate: insert into user_info (gender, name) values (?, ?)
九,除了封装好的方法,我们也可以自定义查询,jpa会根据方法名自动创建sql语句

如,在UserInfoRepository中添加方法:

package com.example.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.example.entity.UserInfo;

public interface UserInfoRepository extends JpaRepository<UserInfo, Long>{

	UserInfo findById(long id);
	
	UserInfo findByName(String name);
}
在UserController中新增测试方法:
	@RequestMapping(value="/user/id",method=RequestMethod.GET)
	public UserInfo findById(long id){
		return userRepository.findById(id);
	}
	
	@RequestMapping(value="/user/name",method=RequestMethod.GET)
	public UserInfo findByName(String name){
		return userRepository.findByName(name);
	}

测试返回结果如下:


再查看控制台打印的sql语句:

Hibernate: select userinfo0_.id as id1_0_, userinfo0_.gender as gender2_0_, userinfo0_.name as name3_0_ from user_info userinfo0_ where userinfo0_.id=?
Hibernate: select userinfo0_.id as id1_0_, userinfo0_.gender as gender2_0_, userinfo0_.name as name3_0_ from user_info userinfo0_ where userinfo0_.name=?

十,很多时候我们需要根据业务需求写sql语句,下面我们来看如何使用注解写sql语句

如,在UserInfoRepository中添加方法:

/**
	 * 自定义查询语句
	 * @param id
	 * @return
	 */
	@Query("select gender from UserInfo where id=?1")
	String userGender(long id);
	
	/**
	 * 自定义更新语句
	 * @param firstname
	 * @param lastname
	 * @return
	 */
	@Transactional
	@Modifying 
	@Query("update UserInfo set name =:name where id =:id")
	int updateName(@Param("name")String name,@Param("id")Long id);
这里需要注意:

1,查询表名UserInfo对应的是实体类名,不是数据库表名

2,更新数据库操作,需要添加事务注解@Transactional,否则会报错:

javax.persistence.TransactionRequiredException
3,其他用法可以参见博客:http://jishiweili.iteye.com/blog/2088265

在UserController中新增测试方法:

	/**
	 * 使用注解写查询语句
	 * @param id
	 * @return
	 */
	@RequestMapping(value="/gender",method=RequestMethod.GET)
	public String getGender(long id){
		return userRepository.userGender(id);
	}
	
	/**
	 * 使用注解生成自定义方法
	 * @param id
	 * @return
	 */
	@RequestMapping(value="/update",method=RequestMethod.POST)
	public String update(@RequestBody UserInfo userInfo){
		String name = userInfo.getName();
		Long id = userInfo.getId();
		int count = userRepository.updateName(name,id);
		return "成功更新"+count+"条数据";
	}
	

启动测试:

http://localhost:8088/spring-boot/gender?id=1 ========== 返回结果:M

http://localhost:8088/spring-boot/update === params:{"name":"acc","id":"2"} ======= 返回结果:成功更新1条数据


===============================================================================================

jpa的使用就初步演示到这里,下篇我们继续学习日志框架,SpringBoot 学习记录(四): slf4j+logback



















Spring Boot学习记录(二):SpringBoot集成JPA JPA(Java Persistence API)是JavaEE的持久化标准规范,提供对象-关系映射功能。文章介绍了JPA的标准化、容器级支持、简单易用等优势,以及其面向对象的查询语言JPQL。Spring Data JPA是对JPA规范的二次封装,底层基于Hibernate实现。文章详细讲解了在SpringBoot中集成JPA的步骤:引入依赖、配置数据源、编写实体类、开发DAO层、实现Service和Controller。 阅读详情

相关推荐

NVIDIA DGX Spark 深度应用解析:从大模型训练到边缘推理的完整实践指南

内存管理:充分利用统一内存架构,避免不必要的数据传输批处理大小:根据模型大小调整批处理大小以优化内存使用精度选择:在精度损失可接受范围内使用较低精度计算流水线优化:重叠计算和数据传输操作DGX Spark作为一个专门的AI计算平台,在大模型开发的各个阶段都能发挥重要作用。从数据预处理到模型训练,从微调到推理部署,其统一内存架构和强大的计算能力为AI开发者提供了前所未有的本地开发体验。需要注意的是,虽然DGX Spark性能强大,但合理的算法设计和系统优化仍然是获得最佳性能的关键。

time_days的博客 2870

Java 包(package)

Java 包是一种用于组织类和接口的机制,类似于文件夹,可以将Java程序中的类组织在一起。通过使用Java 包,我们可以对类和接口进行逻辑上的分组。在Java中,每个源文件都属于一个包,源文件的第一行必须是package语句,用于指定该文件所属的包。例如,如果我们有一个名为这将使得该源文件属于包。我们也可以在同一个Java文件中定义多个类,但是只能有一个public类。如果我们不指定包名,Java会将它们放在默认包中。

笔记 2738

游戏安全逆向实战:如何用010Editor绕过ACE反作弊的文件校验(附详细步骤)

本文详细介绍了如何通过逆向工程思维和010Editor工具,针对PC游戏中ACE反作弊系统的文件校验机制进行分析与绕过。文章以实战案例为核心,逐步拆解了定位校验逻辑、解析校验数据文件、计算并替换哈希值的关键步骤,为安全研究人员提供了一种在用户态(Ring 3)层面进行轻量化对抗的思路与方法。

iii12的专栏 727

Java之包声明

例如,如果你的网址是www.example.com,那么你的包名就可以是com.example。包还可以用于控制访问权限。例如,一个类或类的成员(字段或方法)如果没有指定访问修饰符(public、protected或private),那么它的访问级别就是包级私有,这意味着它只能被同一个包中的类访问。在Java中,package com.example是一个包声明,它指定了接下来的类或接口属于哪个包。包是用来组织相关类和接口的一种机制,它们可以看作是命名空间,用于防止命名冲突,并控制访问权限。

weixin_63490470的博客 2080

I2C总线原理及总线信号的实现

I2C总线是一种多主机总线,连接IIC总线上的器件分为主机和从机,主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,I2C也具备冲突检测和仲裁的功能来防止错误产生;每个连接到IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作;I2C总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器;主要用于近距离(抗干扰能力稍弱),低速的芯片之间的通信(传输视频,带宽

YLG_lin的博客 3941

ncl泰勒图(均方根误差、标准差、相关系数)

ncl泰勒图(均方根误差、标准差、相关系数)

weixin_61281699的博客 8006

Java 的包(Package)?如何使用包?

这样,我们就可以方便地使用这些类了。总的来说,Java 的包机制是 Java 编程中的重要特性之一,它可以帮助我们更好地组织和管理代码,提高代码的可读性、可维护性和安全性。在实际编程中,我们应该充分利用包机制,合理地组织和管理代码,从而编写出更加优秀和可靠的 Java 代码。通过使用包,我们可以更好地组织和管理 Java 代码,提高代码的可读性和可维护性。在这个例子中,MyOtherClass 类可以直接使用 MyClass 类,因为 MyClass 类是公共的,并且属于 com.example 包。

weixin_44798281的博客 1809

Visual Studio 命令提示符工具区别与使用场景

Visual Studio会提供一系列命令提示符工具,这些工具应用在哪些场景呢?本文进行了相关介绍。

cicada15的博客 3493

新手项目结构的详细解释---包的使用/import

例如,如果你的域名是 example.com,那么你的顶级包名就是 com.example。例如,Main.java 位于 src/com/example/ 目录下,因为它的包名是 com.example。com.example 和 com.example.utils 是两个不同的包,分别用于组织不同的类。完整的包名是 com.example.utils。example/ 目录下的文件和子目录都是 com.example 包的一部分。这是一个Java源文件,位于 com.example.utils 包中。

2401_86356924的博客 1148

RandLA-Net Tensorrt 推理 c++

RandLA-Net 实现 Tensorrt 部署.

J。 1109

六种光耦综合对比——《器件手册--光耦》

可控硅输出光耦(SCR Optocoupler)是一种特殊的光电耦合器,由红外发光二极管(LED)和双向可控硅(SCR)组成,用于实现输入和输出之间的电气隔离和信号传输。逻辑输出光耦是一种高效、可靠的数字信号隔离和电平转换器件,通过电气隔离和逻辑电平输出,确保了系统的安全性和信号的稳定性。固态继电器(可控硅输出,SSR)是一种无触点电子开关设备,利用可控硅(SCR或Triac)作为主要开关元件,通过光耦合器实现输入和输出之间的电气隔离。光耦作为一种成熟的电气隔离器件,在电子电路设计中具有重要的地位。

XU157303764的博客 1726

java中package简单理解

包名定义的简单源文件: package com.example;   public class HW{     public static void main(String[]args){         System.out.println("Hello");     } } 这代码看上去没什么问题,执行: 编译:javac HW.java 运行:java HW Error: Could no...

jc_benben的专栏 900

华为OD机试真题 新系统 9月20号 【字符串分组求和】

华为OD新系统机试真题【字符串分组求和】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【字符串分组求和】解析。

qq_45776114的博客 616

【Springboot系列】SpringBoot整合Jpa

Spring Boot是一种快速开发框架,它简化了Java应用程序的开发过程。而Jpa(Java Persistence API)是Java持久化规范的一种实现,它提供了一种方便的方式来访问和操作数据库。将Spring Boot与Jpa整合可以更加方便地进行数据库操作,提高开发效率。本文将介绍如何使用Spring Boot整合Jpa,帮助读者快速上手并应用于实际项目中。Jpa(Java Persistence API)是Java持久化规范的一种实现,它提供了一种方便的方式来访问和操作数据库。

Venus's Blog 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SpringBoot系列教程JPA之新增记录使用姿势

SpringBoot系列教程JPA之新增记录使用姿势 上一篇文章介绍了如何快速的搭建一个JPA的项目环境,并给出了一个简单的演示demo,接下来我们开始业务教程,也就是我们常说的CURD,接下来进入第一篇,如何添加数据 通过本篇文章,你可以get到以下技能点 POJO对象如何与表关联 如何向DB中添加单条记录 如何批量向DB中添加记录 save 与 saveAndFlush的区别 I....

小灰灰blog的专栏 3689

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jpa怎么实现新增获取id_SpringBoot JPA新增记录的使用方法。

通过本篇文章,你可以get到以下技能点POJO对象如何与表关联如何向DB中添加单条记录如何批量向DB中添加记录save 与 saveAndFlush的区别环境准备实际开始之前,需要先走一些必要的操作,如安装测试使用mysql,创建SpringBoot项目工程,设置好配置信息1. 表准备沿用前一篇的表,结构如下CREATE TABLE `money` ( `id` int(11) unsigne...

weixin_35615475的博客 1890

快速上手SpringBoot整合JPA

Spring 的一个子项目。用于简化数据库访问,支持NoSQL和关系数据库存储。目标是使数据库操作变得简单便捷.JPA: Java Persistence API 叫做java持久化接口规范, 定义了java操作数据库的模式.: 是Spring Data项目的一部分, 基于JPA规范标准, 提供了一套简洁的API和注解, 用于与关系型数据库进行交互, 使我们可以通过简单的Java对象来表示数据库表, 并且通过继承提供的框架类来执行通用的CRUD操作.

2404_87285359的博客 1623

SpringBoot+JPA的配置

SpringBoot的一大特点来源于      1.去除了大量的xml配置文件      2.简化复杂的依赖管理      3.配合各种starter使用,基本上可以做到自动化配置      4.快速启动容器      5. 配合Maven或Gradle等构件工具打成Jar包后,Java -jar 进行部署运行还是蛮简单的创建独立Spring应用程序,嵌入式Tomcat,Jetty容器,无需部署W...

qq_36575306的博客 2715

JPA学习记录

文章目录前言一、 配置项目1.1 新建项目添加依赖1.2 配置yml 前言 学习JPA的记录,供自己参考,也让大家参考一下,有不足之处请大家指出来,看到后会修改。 本文用到的技术为:springboot、MySQL5.7、JPA、Swagger2 提示:以下是本篇文章正文内容,下面案例可供参考 一、 配置项目 1.1 新建项目添加依赖 <parent> <groupId>org.springframework.boot</groupId>.

bug制造者 823

springboot(三):springboot操作Spring Data JPA

1.创建项目时加上JPA和MySQL 2.建表 注意这里的主键设置为自增 3.实体类 4.创建JPA 创建JAP接口以后spring就直接可以通过自动装配的方式使用UserJPA了,并且不需要实现UserJPA就可以进行增删改查。 JpaRepository<UserEntity,Integer>中的UserEntity表示是对UserEntity这个实体的操作,Integer...

流的博客 431

SpringBoot整合JPA

SpringBoot整合JPA 使用数据库是开发基本应用的基础,借助于开发框架,我们已经不用编写原始的访问数据库的代码,也不用调用JDBC(Java Data Base Connectivity)或者连接池等诸如此类的被称作底层的代码,我们将从更高的层次上访问数据库,这在Springboot中更是如此,本章我们将详细介绍在Springboot中使用 Spring Data JPA 来实现对数据库的操作。 JPA & Spring Data JPA JPA是Java Persistence API的简

优快云_SHY的博客 1902

Spring Boot 实战(9) springboot 整合 JPA

这篇博客介绍了在 springboot 中如何整合 JPA,并有完整的代码实现。

扬帆向海的博客 2万+

SpringBoot ——JPA分页查询

JpaRepository提供了如下表所述的内置查询: 方法 描述 List findAll() 返回所有实体 List findAll(Iterable ids) 返回指定id的所有实体 T getOne(ID id) 根据id返回对应的实体,如果未找到,则返回空 List findAll(Sort sort) 返回所有实体,按照指定顺序排序返回 ...

ljcgit的博客 8076

springboot中使用jpa持久层操作数据库记录

 在springboot中,一些简单的单表语句使用jpa操作,需要对所有的表修改操作进行记录。主要记录修改前的数据信息,修改后的数据,当前修改的表名等信息。jpa的父类方法操作时没法获取表名。找了一天的资料找到解决的方法,记录一下:           1、jpa底层使用的是hibernate,所以写一个类继承hibernate中的EmptyInterceptor,EmptyIntercepto...

weixin_39733299的博客 1223

Springboot+MyBatis+JPA集成

Springboot最近可谓是非常的火,本人也在项目中尝到了甜头。之前一直使用Springboot+JPA,用了一段时间发现JPA不是太灵活,也有可能是我不精通JPA,总之为了多学学Springboot我决定尝试一下Springboot+MyBatis+JPA三项集成,集成过程中遇到了很多问题,但最后总算是集成成功了,现在记录一下方法。

一只没有脚的鸟 1万+
上一篇: SpringBoot 学习记录(二): mybaits
下一篇: SpringBoot 学习记录(四): slf4j+logback
小小小爬虫
博客等级 码龄10年 16粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值