SpringBoot接入JPA连接数据库H2或MySQL例子

一,JPA相关的常用注解和对象

@Entity,用于实体类声明语句之前,‌指出该Java类为实体类,‌将映射到指定的数据库表;@Table,当实体类与其映射的数据库表名不同名时需要使用。‌该标注与@Entity标注并列使用,
‌置于实体类声明语句之前,‌用于指明数据库的表名。‌此外,‌@Table标注还有catalog和schema选项,‌
用于设置表所属的数据库目录或模式,‌通常为数据库名;@Basic:‌用于属性到表字段的映射。‌如果get方法前没加注解,‌默认是该注解。‌fetch属性
表示该属性的读取策略,‌EAGER表示主支抓取,‌LAZY表示延迟加载。‌
optional属性表示该属性是否允许为空,‌默认值为true。‌@Id,用于将实体类的属性映射为主键;
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "xx_seq"),指定主键生成策略,参见GenerationType 枚举类;
@SequenceGenerator(name = "xx_seq", sequenceName = "xx_seq"),
@Column(name="xxx"),位于属性前或get方法前,‌通常用于属性名与映射的表列名不同时,
‌name属性可以指定表名,‌还有unique、‌nullable、‌length等属性指定表列的属性;@Transient,表示当前类属性无需映射到数据库表中字段;@Temproal,主要针对 Date 类型的属性使用,可以通过该注解指定时间的精度,有
三种精确度:DATE,TIME,TIMESTAMP三种精确度:DATE,TIME,TIMESTAMP,
分别表示精确到日期,精确到时分秒,精确到日期+时分秒;EntityManagerFactory,类似与 hibernate 的 SessionFactory;EntityManager,是JPA中用于增删改查的接口,‌它充当了内存中的Java对象和数据库数据存储之间的桥梁;EntityTransaction,JPA事务处理相关,根据EntityManager对象建立;

二,SpringBoot接入JPA连接H2或MySQL例子

1,首先,在pom.xml中添加Spring Data JPA和数据库驱动的依赖:

<dependencies><!-- Spring Boot Starter Data JPA --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- 数据库驱动,以H2数据库为例 --><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency>
</dependencies>
<!-- 其它依赖省略 -->

2,然后,在 application.properties 或 application.yml 中配置数据库连接和JPA属性:

# application.properties
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
#下面两行是连接mysql数据库
#spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=sa
spring.datasource.password=spring.jpa.database-platform=org.hibernate.dialect.H2Dialect# 下面一行是使用mysql数据库
#spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect#下面一行表示每次运行应用程序时更新数据库模式,
#即会根据java实体类相应字段的变化情况更新DB中相关表的字段,
#值除了update外还有create,但推荐使用 update,因create会删除对应表然后再新创建表
spring.jpa.hibernate.ddl-auto=update#下面一行表示在控制台中显示执行的SQL语句
spring.jpa.show-sql=true

3,创建一个实体类User:

import javax.persistence.*;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false)private String name;@Column(nullable = false)private Integer age;// 更多字段增加,标准的getter和setter方法省略
}

4,创建一个继承自JpaRepository的接口UserRepository:

import org.springframework.data.jpa.repository.JpaRepository;@Repository
public interface UserRepository extends JpaRepository<User, Long> {/** 根据名字进行模糊查询返回对象结果列表,其中 ?1 代表传递给查询方法的第一个参数*/@Query("SELECT u FROM User u WHERE u.name LIKE %?1%")List<User> findByUserName(String text);/** 根据名字和年龄查找, 其中 :xxx 和 注解@Param("xxx")中指定的名称要对应上,nativeQuery=true, 表示采用原生SQL语句方式编写查询*/@Query(nativeQuery=true, value="select * from user where name = :uname and age = :uage")List<User> queryByCondition(@Param("uname") String uname, @Param("uage") Integer uage);}

5,创建一个服务类UserService:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@PersistenceUnitprivate EntityManagerFactory entityManagerFactory;// 查询public List<User> listAllUsers() {return userRepository.findAll();}// 模糊查询public List<User> findByUserName(String userName) {return userRepository.findByUserName(userName);}// 精确查询public User getUserById(Long id) {return userRepository.findById(id).orElse(null);}// 保存(新增或更新)public User saveUser(User user) {return userRepository.save(user);}// 精确删除public void deleteEntity(Long userId) {EntityManager entityManager = entityManagerFactory.createEntityManager();EntityTransaction transaction = null;try {// 开启事务transaction = entityManager.getTransaction();transaction.begin();// 通过ID查询到实体User entityToDelete = entityManager.find(User.class, id);// 删除实体entityManager.remove(entityToDelete);// 提交事务transaction.commit();			} catch(Exception e) {if (transaction != null && transaction.isActive()) {transaction.rollback();}// 处理异常e.printStackTrace();} finally {entityManager.close();}}//精确批量删除public void deleteEntity(Class<?> entityClass, String fieldName, List<?> fieldValues) {EntityManager entityManager = entityManagerFactory.createEntityManager();EntityTransaction transaction = null;try {// 开启事务transaction = entityManager.getTransaction();transaction.begin();Query query = entityManager.createQuery("delete from " + entityClass.getSimpleName() + " e where e." + fieldName + " in :fieldValues");query.setParameter("fieldValues", fieldValues);int delNum = query.executeUpdate();// 提交事务transaction.commit();} catch(Exception e) {if (transaction != null && transaction.isActive()) {transaction.rollback();}// 处理异常e.printStackTrace();} finally {entityManager.close();}	}	}

6,controller 层省略

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;/** 通过用户名称查询用户列表 */@GetMapping("/query")public List<User> queryUser(@RequestParam("name") String name){List<User> users = userService.findByUserName(name);return users;}}

7,最后,创建一个启动类SpringBootJpaApplication:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringBootJpaApplication {public static void main(String[] args) {SpringApplication.run(SpringBootJpaApplication.class, args);}
}

8,部分单元测试(对应的包名相应修改):

import com.xx.yy.kk.dao.UserRepository;
import com.xx.yy.kk.model.User;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.util.Optional;@RunWith(SpringRunner.class)
@SpringBootTest
public class UserTest {@Autowiredprivate UserRepository userRepository;@Beforepublic void before() {User user = new User();user.setId(1L);user.setName("张三");        userRepository.save(user);user = new User();user.setId(3L);user.setName("李四");        userRepository.save(user);user.setId(5L);user.setName("王五");        userRepository.save(user);}@Testpublic void testAdd() {User user = new User();user.setId(2L);user.setName("老六");        userRepository.save(user);User = new User();user.setId(4L);user.setName("王七");        userRepository.save(user);}@Testpublic void testQuery() {String userName="张三";List<User> users = userRepository.findByUserName(zhangsan);//...more...}@Afterpublic void after() {userRepository.deleteById(1L);userRepository.deleteById(3L);userRepository.deleteById(5L);}}

部分代码需要补全或结合自己的情况修改,这里仅展示SpringBoot接入JPA连接数据库H2或MySQL例子的过程,谢谢拍砖讨论...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/49895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

轻量化YOLOv7系列:结合G-GhostNet | 适配GPU,华为诺亚提出G-Ghost方案升级GhostNet

轻量化YOLOv7系列&#xff1a;结合G-GhostNet | 适配GPU&#xff0c;华为诺亚提出G-Ghost方案升级GhostNet 需要修改的代码models/GGhostRegNet.py代码 创建yaml文件测试是否创建成功 本文提供了改进 YOLOv7注意力系列包含不同的注意力机制以及多种加入方式&#xff0c;在本文…

pytest:4种方法实现 - 重复执行用例 - 展示迭代次数

简介&#xff1a;在软件测试中&#xff0c;我们经常需要重复执行测试用例&#xff0c;以确保代码的稳定性和可靠性。在本文中&#xff0c;我们将介绍四种方法来实现重复执行测试用例&#xff0c;并显示当前迭代次数和剩余执行次数。这些方法将帮助你更好地追踪测试执行过程&…

Linux 常用命令分类及示例

目录 文件系统操作进程管理网络工具系统信息文本处理包管理和软件安装 文件系统操作 1. ls 用途: 列出目录内容示例: ls -l 显示当前目录下的文件列表&#xff0c;并包含详细信息。 2. cd 用途: 改变工作目录示例: cd /etc 进入 /etc 目录。 3. mkdir 用途: 创建目录示例…

maven复习用

文章目录 一、Maven工具的使用1.1 Maven的介绍1.2 简化依赖的导入1.3 GAVP1.4 创建maven普通工程和Web工程1.5 maven依赖的传递 一、Maven工具的使用 1.1 Maven的介绍 Maven是什么&#xff1f; 软件 为什么服务&#xff1f; java项目 主要功能&#xff1f; 项目构建管理、依赖…

k8s部署kafka集群

k8s部署kafka集群 kafka&#xff08;Kafka with KRaft&#xff09; mkdir -p ~/kafka-ymlkubectl create ns kafkacat > ~/kafka-yml/kafka.yml << EOF apiVersion: v1 kind: Service metadata:name: kafka-headlessnamespace: kafkalabels:app: kafka spec:type: C…

【Java题解】以二进制加法的方式来计算两个内容为二进制数字的字符串相加的结果

&#x1f389;欢迎大家收看&#xff0c;请多多支持&#x1f339; &#x1f970;关注小哇&#xff0c;和我一起成长&#x1f680;个人主页&#x1f680; &#x1f451;目录 分析&#xff1a;&#x1f680; 数字层面分析⭐ 字符串层面分析⭐ 代码及运行结果分析:&#x1f6…

生活实用英语口语“拆迁”用英文怎么说?柯桥成人学英语到蓝天广场

● 1. “拆迁”英语怎么说&#xff1f; ● 01. 其实国外也有拆迁 但国外的拆迁&#xff0c;只管拆 不管安置&#xff0c;你爱去哪去哪 英文可以说 housing removal 02. 但我们中国的“拆迁” 既管“拆”也管“迁” &#xff08;还是中国人幸福~&#xff09; 英文可以说 housin…

仓颉语言 -- 泛型

1、泛型概述 在仓颉编程语言中&#xff0c;泛型指的是参数化类型&#xff0c;参数化类型是一个在声明时未知并且需要在使用时指定的类型。类型声明与函数声明可以是泛型的。最为常见的例子就是 Array<T>、Set<T> 等容器类型。以数组类型为例&#xff0c;当使用数组…

网络安全基础知识及安全意识培训(73页可编辑PPT)

引言&#xff1a;在当今数字化时代&#xff0c;网络安全已成为企业和个人不可忽视的重要议题。随着互联网的普及和技术的飞速发展&#xff0c;网络威胁日益复杂多变&#xff0c;从简单的病毒传播到高级持续性威胁&#xff08;APT&#xff09;、勒索软件攻击、数据泄露等&#x…

【Python】Facebook开源时间序列数据预测模型Prophet

文章目录 一、简介二、项目的文件解读三、Prophet类主要方法和参数3.1 主要参数3.2 主要方法 四、用法示例 一、简介 Prophet 是由 Facebook 开发的一个开源工具&#xff0c;用于时间序列数据的预测。它特别适用于处理具有强季节性和趋势的时间序列数据&#xff0c;并且对节假…

09-软件易用性

易用性是用户体验的一个重要方面&#xff0c;网站建设者一般会沉溺于自己的思维习惯&#xff0c;而造成用户使用的不畅。易用性不仅是专业UI/UE人员需要研究&#xff0c;对于网站建设其他岗位的人也应该了解一定的方法去检验和提升网站的易用性。通常对易用性有如下定义: 易理解…

【iOS】isMemberOfClassisKindOfClass

目录 前言class方法isMemberOfClass和isKindOfClass实例方法分析类方法分析 实例验证总结 前言 认识这两个方法之前&#xff0c;首先要了解isa指向流程和继承链&#xff08;【iOS】类对象的结构分析&#xff09;关系&#xff0c;以便理解得更透彻 上经典图&#xff1a; 要注意…

AM62x和rk3568的异同点

AM62x 和 RK3568 是两款不同的处理器&#xff0c;分别来自 Texas Instruments&#xff08;TI&#xff09;和 Rockchip。它们在设计目标、架构、性能和应用领域等方面存在一些异同。以下是这两款处理器的对比&#xff1a; 1. 基本架构 AM62x&#xff1a; 架构&#xff1a;基于…

与大数据相关的 Python 第三方库和工具

Python 在大数据领域有着广泛的应用&#xff0c;以下是一些与大数据相关的 Python 第三方库和工具&#xff1a; 1. **Pandas**&#xff1a;Pandas 是 Python 中最常用的数据处理和分析库之一&#xff0c;提供了高效的数据结构和数据分析工具&#xff0c;可以进行数据清洗、转换…

机器学习数学基础(1)--线性回归与逻辑回归

声明&#xff1a;本文章是根据网上资料&#xff0c;加上自己整理和理解而成&#xff0c;仅为记录自己学习的点点滴滴。可能有错误&#xff0c;欢迎大家指正。 1 线性回归和逻辑回归与机器学习的关系 线性回归属于机器学习 – 监督学习 – 回归 – 线性回归&#xff0c; 逻辑…

Maven概述

目录 1.Maven简介 2.Maven开发环境搭建 2.1下载Maven服务器 2.2安装&#xff0c;配置Maven 1.配置本地仓库地址 2.配置阿里云镜像地址 2.3在idea中配置maven 2.4在idea中创建maven项目 3.pom.xml配置 1.项目基本信息 2.依赖信息 3.构建信息 4.Maven命令 5.打包Jav…

企业微信报错,api forbidden 错误码 48002

业务场景是这边后端页面点同步就去企微接口拉取客户数据&#xff0c;然后报错如下。 后端抓包返回的json如下 {“errcode”:48002,“follow_user”:[],“errmsg”:“api forbidden, hint: [1721869790252850672734303], from ip: 203.88.203.216, more info at https://open.w…

数据结构(链表)

&#x1f30f;个人博客主页&#xff1a;心.c 前言&#xff1a; 最近练习算法回去学了链表&#xff0c;收获挺大的&#xff0c;大概内容整理了一下&#xff0c;语言是用c写的&#xff0c;所以在这里分享给大家&#xff0c;希望大家可以有所收获 &#x1f525;&#x1f525;&…

2024年技校大数据实验室建设及大数据实训平台整体解决方案

随着信息技术的迅猛发展&#xff0c;大数据已成为推动产业升级和社会进步的重要力量。为适应市场需求&#xff0c;培养高素质的大数据技术人才&#xff0c;技校作为职业教育的重要阵地&#xff0c;亟需加强大数据实验室的建设与实训平台的打造。本方案旨在提出一套全面、可行的…

Synchronized关键字和乐观锁(CAS)

一、Sychronized关键字 在Java中&#xff0c;synchronized 是一个关键字&#xff0c;用于实现线程同步。当一个方法或一个代码块被synchronized修饰时&#xff0c;它被称为同步方法或同步代码块。这意味着每次只有一个线程可以进入该方法或代码块&#xff0c;其他线程必…