当前位置: 首页 > news >正文

在SpringData JPA 中实现对持久层的操作

1.导入依赖 hibernate 这个依赖自带实现JPA接口

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>5.4.32.Final</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency></dependencies>

2.在resources目录下建立 META-INF文件夹 ,创建JPA   persistence.xml配置文件

 persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"><!--  需要配置persistence-unit 节点持久化单元:name: 持久化单元名称  可随时切换, 若是OpenJPA的实现方式就 换成 OpenJPA 就可以了transaction-type: 事务管理方式JTA:分布式事务管理RESOURCE_LOCAL:本地事务管理--><persistence-unit name="hibernateJPA" transaction-type="RESOURCE_LOCAL"><!--JPA 的 实现方式    顺序别搞错,要放在class上面    --><provider>org.hibernate.jpa.HibernatePersistenceProvider</provider><!--需要进行ORM 的POJO类 --><class>com.kuang.pojo.Customer</class><!-- 可选配置 :配置 JPA 实现方 的 配置信息       --><properties><!--   数据库信息用户名 , javax.persistence.jdbc.user密码  , javax.persistence.jdbc.password驱动  , javax.persistence.jdbc.driver数据库地址 , javax.persistence.jdbc.url--><property name="javax.persistence.jdbc.user" value="root"/><property name="javax.persistence.jdbc.password" value="2001"/><property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/><property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/springdata_jpa?useUnicode=true&amp;useSSL=false&amp;characterEncoding=UTF-8"/><!-- 配置JPA实现方 (hibernate) 的配置信息显示sql : false|true自动创建数据库表: hibernate.hbm2ddl.autocreate: 程序运行时创建数据库表(如果有表,先删除在创建)update: 程序运行时创建表(如果有表,不会创建表)none: 不会创建表--><property name="hibernate.show_sql" value="true"/><property name="hibernate.hbm2ddl.auto" value="update"/><property name="hibernate.dialect" value="org.hibernate.dialect.MySQL57InnoDBDialect"/></properties></persistence-unit></persistence>

3.创建测试类

package com.kuang.test;import com.kuang.pojo.Customer;
import org.junit.Before;
import org.junit.Test;import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.xml.soap.SAAJMetaFactory;public class JpaTest {private EntityManagerFactory factory;@Beforepublic void before() {//EntityManagerFactory 创建工厂 对应 sqlSessionFactory  用来创建 entityManagerfactory = Persistence.createEntityManagerFactory("hibernateJPA");}@Testpublic void insert() {//其实底层实现还是hibernate// entityManager 相当于 sqlSession 代码与数据库之间的桥梁EntityManager entityManager = null;EntityTransaction transaction=null;try {entityManager = factory.createEntityManager();transaction = entityManager.getTransaction();//获取事务对象transaction.begin();//事务开启Customer customer = new Customer();customer.setCustName("刘备");customer.setCustAddress("锦州");entityManager.persist(customer);transaction.commit();//事务提交} catch (Exception e) {e.printStackTrace();transaction.rollback();//事务回滚} finally {if (entityManager!=null){entityManager.close();//关闭连接}}}@Testpublic void select() {//其实底层实现还是hibernate// entityManager 相当于 sqlSession 代码与数据库之间的桥梁EntityManager entityManager = null;EntityTransaction transaction=null;try {entityManager = factory.createEntityManager();transaction = entityManager.getTransaction();//获取事务对象transaction.begin();//事务开启Customer customer = entityManager.find(Customer.class, 1L);
//            Customer customer = entityManager.getReference(Customer.class, 1L);//延迟查询
//            System.out.println("=======");System.out.println(customer);transaction.commit();//事务提交} catch (Exception e) {e.printStackTrace();transaction.rollback();//事务回滚} finally {if (entityManager!=null){entityManager.close();//关闭连接}}}@Testpublic void update() {//其实底层实现还是hibernate// entityManager 相当于 sqlSession 代码与数据库之间的桥梁EntityManager entityManager = null;EntityTransaction transaction=null;try {entityManager = factory.createEntityManager();transaction = entityManager.getTransaction();//获取事务对象transaction.begin();//事务开启Customer customer = new Customer();customer.setCustId(9L);customer.setCustName("lzl");customer.setCustAddress("为鲁斯");/*** 如果指定了主键:*          更新 :1. 先查询 看是否有变化*         *如果有变化 更新  如果没有变化 就不更新* 如果没有指定主键:*         插入:*///存在即修改, 不存在就添加//注意: 修改是覆盖操作,你没给的值,就全给你覆盖为null// 如果你不想让他查一遍,你可以自己写JPQL语句进行添加或者修改Customer merge = entityManager.merge(customer);transaction.commit();//事务提交} catch (Exception e) {e.printStackTrace();transaction.rollback();//事务回滚} finally {if (entityManager!=null){entityManager.close();//关闭连接}}}@Testpublic void update_JPQL() {//其实底层实现还是hibernate// entityManager 相当于 sqlSession 代码与数据库之间的桥梁EntityManager entityManager = null;EntityTransaction transaction=null;try {entityManager = factory.createEntityManager();transaction = entityManager.getTransaction();//获取事务对象transaction.begin();//事务开启String jpql="update Customer set custName=:custName , custAddress=:custAddress where custId=:id";entityManager.createQuery(jpql).setParameter("custName","张杰").setParameter("custAddress","广东").setParameter("id",3L).executeUpdate();transaction.commit();//事务提交} catch (Exception e) {e.printStackTrace();transaction.rollback();//事务回滚} finally {if (entityManager!=null){entityManager.close();//关闭连接}}}@Testpublic void test_SQL() {//其实底层实现还是hibernate// entityManager 相当于 sqlSession 代码与数据库之间的桥梁EntityManager entityManager = null;EntityTransaction transaction=null;try {entityManager = factory.createEntityManager();transaction = entityManager.getTransaction();//获取事务对象transaction.begin();//事务开启String sql="update tb_customer set cust_name=:custName , cust_address=:custAddress where  cust_id=:id";entityManager.createNativeQuery(sql).setParameter("custName","谢娜").setParameter("custAddress","湖南").setParameter("id",3L).executeUpdate();transaction.commit();//事务提交} catch (Exception e) {e.printStackTrace();transaction.rollback();//事务回滚} finally {if (entityManager!=null){entityManager.close();//关闭连接}}}@Testpublic void delete() {//其实底层实现还是hibernate// entityManager 相当于 sqlSession 代码与数据库之间的桥梁EntityManager entityManager = null;EntityTransaction transaction=null;try {entityManager = factory.createEntityManager();transaction = entityManager.getTransaction();//获取事务对象transaction.begin();//事务开启Customer customer = entityManager.find(Customer.class, 3L);entityManager.remove(customer);// 这样删除,是删除游离状态的,会抛异常不允许这样操作  IllegalArgumentException: Removing a detached instance com.kuang.pojo.Customer#3transaction.commit();//事务提交} catch (Exception e) {e.printStackTrace();transaction.rollback();//事务回滚} finally {if (entityManager!=null){entityManager.close();//关闭连接}}}@Testpublic void template() {//其实底层实现还是hibernate// entityManager 相当于 sqlSession 代码与数据库之间的桥梁EntityManager entityManager = null;EntityTransaction transaction=null;try {entityManager = factory.createEntityManager();transaction = entityManager.getTransaction();//获取事务对象transaction.begin();//事务开启transaction.commit();//事务提交} catch (Exception e) {e.printStackTrace();transaction.rollback();//事务回滚} finally {if (entityManager!=null){entityManager.close();//关闭连接}}}
}

相关文章:

在SpringData JPA 中实现对持久层的操作

1.导入依赖 hibernate 这个依赖自带实现JPA接口 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><depen…...

C++ SEH结构化异常捕获处理(双平台支持 Linux、Windows)。

测试&#xff1a; try_ctor();try_call([](){printf("1111111111111111111111\r\n");int* p NULL;*p 100;throw 1;// try_eeh();}, [](){printf("2222222222222222222222\r\n");}); 设置NULL指针P的值引发程式崩溃&#xff0c;可以被正确捕获&#xff0…...

jvm-sandbox-repeater 精简版部署之standalone模式

jvm-sandbox-repeater 仅仅提供了录制回放的能力&#xff0c;如果需要完成业务回归、实时监控、压测等平台&#xff0c;后面须要有一个数据中心负责采集数据的加工、存储、搜索&#xff0c;repeater-console提供了简单的demo示例&#xff1b;一个模块管理平台负责管理JVM-Sandb…...

【JavaWeb笔记】单选框,结合Servlet

各个部分的作用 jsp部分 form action"..."&#xff1a;表单标签&#xff0c;供用户提交数据。内部的submit点击之后相当于是点action的URL input type"radio"&#xff1a;输入类型为单选框。把name设置为一样的&#xff0c;这样效果上就是单选&#xff…...

Docker 与 Podman:揭示容器编排的最佳 25 大常见问题解答

让我们告诉你一件事。 这不仅仅是这两个强大平台之间的普通比较。 相反&#xff0c;我们分析并列出了有关 Docker 与 Podman 的最紧迫问题。 但这里有一件事——这些问题不仅被技术角度所包围。 我们还深入研究了业务环境&#xff0c;因为我们知道这不仅仅是关于代码。这是…...

Spark分布式内存计算框架

目录 一、Spark简介 &#xff08;一&#xff09;定义 &#xff08;二&#xff09;Spark和MapReduce区别 &#xff08;三&#xff09;Spark历史 &#xff08;四&#xff09;Spark特点 二、Spark生态系统 三、Spark运行架构 &#xff08;一&#xff09;基本概念 &#x…...

安装python第三方库后,在pycharm中不能正常导入

python小白学习opencv&#xff0c;使用pip安装完opencv库后import cv2报错&#xff0c;按照如下设置解决&#xff1a; 需要正确设置python解释器路径...

从“食”到“用”,燕之屋的未来增长价值几何?

12月12日&#xff0c;燕窝行业头部企业燕之屋在港交所上市。 作为新消费的热门赛道&#xff0c;近年滋补品的关注度一直比较高。“领头燕”登陆资本市场&#xff0c;是消费者健康养生意识不断提高&#xff0c;滋补品成为营养补充主流的一个积极信号。 长期以来&#xff0c;中…...

C++使用策略模式,减少使用switch...case...

目录 原理函数类模板函数使用switch...case...不使用switch...case... 知识点decltypestd::remove_reference 原理 函数 #include <iostream> #include <functional> #include <map>void fun1(int a, int b) {std::cout << "fun1 : a "<…...

.NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)

WebAppDbTest 项目准备 项目准备1、.net cli 创建项目2、nuget 包引用和项目结构2.1、项目添加相关 nuget 包2.2、WebAppDbTest 项目结构 3、项目代码说明3.1、CSharp/C# 类文件说明3.2、json 配置文件说明 4、项目运行预览 数据库 .db 文件准备1、创建 SQLite 数据库1.1、在 W…...

2024 年,新程序员如何与AI共赢!!

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

Debian 系统镜像下载

最近在看一些网络相关的文章需要用到 debian 11.x 的系统网上找了好多都发下载&#xff0c;在官网看一下 有个 11.8 的版本我无法下载&#xff0c;提示被最新的 debian-12.4.0 所代替&#xff0c;于是找到了这个链接 Index of /cdimage/unofficial/non-free/cd-including-fi…...

数据结构和算法(全)

1.了解数据结构和算法 1.1 二分查找 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将数组分成两半&#xff0c;然后比较目标值与中间元素的大小关系&#xff0c;从而确定应该在左半部分还是右半部分继续查找。这个…...

Vue项目中WebSocket封装

WEBSOCKET 封装引入初始化使用 封装 utils下建立WebSocketManager.js class WebSocketManager {constructor() {this.url null;this.websocket null;this.isConnected false;this.listeners {onopen: [],onmessage: [],onclose: [],onerror: [],};this.reconnectionOptio…...

018 OpenCV 人脸检测

目录 一、环境 二、分类器原理 2.1、概述 2.2、工作原理 三、人脸检测代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、分类器原理 CascadeClassifier是OpenCV&#xff08;开源计算机视觉库&#xff09;中的一个强大的类…...

Etcd实战(一)-部署etcd集群

1 概述 etcd是一个高可用的分布式键值存储系统&#xff0c;是CoreOS&#xff08;现在隶属于Red Hat&#xff09;公司开发的一个开源项目。它提供了一个简单的接口来存储和检索键值对数据&#xff0c;并使用Raft协议实现了分布式一致性。etcd广泛应用于Docker、Kubernetes等分布…...

Python绘制一个简单的圣诞树

在Python中,你可以使用基本的打印语句和循环来绘制一个简单的圣诞树。以下是一个例子: def draw_christmas_tree(height):for i in range(height):print( * (height - i - 1) +...

【CANoe】CANoe中使用RS232

文章目录 1、CANoe中自带示例2、示例讲解2.1CANoe自带Port A和Port B通讯2.2CANoe自带Port A和串口助手通讯 1、CANoe中自带示例 我使用的事CANoe12&#xff0c;RS232路径如下&#xff1a; C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 12.0.75\IO_HIL\RS23…...

Springboot内置Tomcat线程数优化

Springboot内置Tomcat线程数优化 # 等待队列长度&#xff0c;默认100。队列也做缓冲池用&#xff0c;但也不能无限长&#xff0c;不但消耗内存&#xff0c;而且出队入队也消耗CPU server.tomcat.accept-count1000 # 最大工作线程数&#xff0c;默认200。&#xff08;4核8g内存…...

vue+django 开发环境跨域前后端联调配置

vue环境是127.0.0.1:8080&#xff0c;django环境是127.0.0.1:8000 要解决url相对路径和Axios跨域权限问题。 注意&#xff1a;程序发起了一个 POST 请求&#xff0c;但请求的 URL 没有以斜杠结尾。Django 默认设置是无法执行重定向到带斜杠 URL的。例如&#xff1a;url http:/…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...