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

news2024/11/24 20:54:29

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.auto
                            create: 程序运行时创建数据库表(如果有表,先删除在创建)
                            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;

    @Before
    public void before() {
        //EntityManagerFactory 创建工厂 对应 sqlSessionFactory  用来创建 entityManager
        factory = Persistence.createEntityManagerFactory("hibernateJPA");
    }

    @Test
    public 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();//关闭连接
            }
        }

    }

    @Test
    public 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();//关闭连接
            }
        }

    }
    @Test
    public 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();//关闭连接
            }
        }

    }


    @Test
    public 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();//关闭连接
            }
        }

    }
    @Test
    public 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();//关闭连接
            }
        }

    }

    @Test
    public 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#3

            transaction.commit();//事务提交
        } catch (Exception e) {
            e.printStackTrace();
            transaction.rollback();//事务回滚
        } finally {
            if (entityManager!=null){
                entityManager.close();//关闭连接
            }
        }

    }

    @Test
    public 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();//关闭连接
            }
        }

    }
}

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

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

相关文章

微信小程序、uniapp自定义底部导航栏(附源码)

需求分析 目前开发一套“同城跑腿平台”小程序&#xff0c;面向用户和骑手&#xff0c;需要两个不同的底部导航&#xff0c;uniapp原生导航不满足要求。所以需要自定义导航栏。 随着自定义导航卡完成&#xff0c;切换选项卡页面总是闪烁&#xff0c;在网上也没有搜到完整的解决…

性能监控体系:InfluxDB Grafana Prometheus

InfluxDB 简介 什么是 InfluxDB &#xff1f; InfluxDB 是一个由 InfluxData 开发的&#xff0c;开源的时序型数据库。它由 Go 语言写成&#xff0c;着力于高性能地查询与存储时序型数据。 InfluxDB 被广泛应用于存储系统的监控数据、IoT 行业的实时数据等场景。 可配合 Te…

Python安装基础之如何查看python版本、如何查看多个python版本

文章目录 前言最简单的验证手段查看python的路径直接查看python版本默认的python版本就是cmd进入的python关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小…

离散型随机变量的分布律(也称概率质量函数:probability mass function, PMF)

设是一个离散型随机变量&#xff0c;可能的取值为&#xff0c;取各个值的概率记为&#xff1a; &#xff08;1&#xff09; 其中 并且&#xff0c; 公式&#xff08;1&#xff09;就称为离散型随机变量的分布律&#xff0c;也称概率质量函数&#xff1a;probability ma…

Python 进阶(十三):JSON 序列化和反序列化(json 模块)

大家好,我是水滴~~ 本篇文章主要介绍json模块的功能,包括将Python对象序列化到文件、将Python对象序列化为字符串、序列化时类型的对照表、将文件中JSON数据反序列化为Python对象,将JSON字符串反序列化为Python对象、反序列化时类型的对照表等。 文章中包含大量的代码示例…

安防 音响 车载等产品中音频接口选型的高性能国产芯片分析

在人工智能兴起之后&#xff0c;安防市场就成为了其全球最大的市场&#xff0c;也是成功落地的最主要场景之一。对于安防应用而言&#xff0c;智慧摄像头、智慧交通、智慧城市等概念的不断涌现&#xff0c;对于芯片产业催生出海量需求。今天&#xff0c;我将为大家梳理GLOBALCH…

arcgis for js 添加自定义叠加图片到地图坐标点上

在使用arcgis for js开发地图绘制图层时&#xff0c;可以通过相关api实现添加图标到某个坐标点&#xff0c;那么如果现在有一个需要添加一个小图叠大图的需求&#xff0c;又或者是自定义绘制图标&#xff0c;如何实现&#xff1f; 1、简单地绘制一个图标到底图图层上面 const…

[C++] STL_priority_queue(优先级队列) 的使用及底层的模拟实现,容器适配器,deque的原理介绍

文章目录 1、priority_queue1.1 priority_queue的介绍和使用1.2 priority_queue的使用模拟实现&#xff1a; 2、容器适配器2.1 什么是适配器2.2 STL标准库中stack和queue的底层结构 3、deque3.1 deque的原理介绍3.2 deque的缺陷 4、为什么选择deque作为stack和queue的底层默认容…

笔记本电脑word打字延迟特别大,但是浏览器中打字没有延迟,如何解决这个问题。

问题描述&#xff1a; 笔记本电脑word打字延迟特别大&#xff0c;但是浏览器中打字没有延迟&#xff0c;如何解决这个问题。&#xff08;之前以为是自己的电脑用了6年&#xff0c;用的时间久了&#xff0c;硬件老化导致的&#xff0c;本来想直接换电脑的&#xff0c;但是想着去…

计算机毕业设计 基于SpringBoot的电动车租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Kafka事务是怎么实现的?Kafka事务消息原理详解

目录 一、Kafka事务性消息1.1 介绍Kafka事务性消息1.2 事务性消息的应用场景1.3 Kafka事务性消息的优势 二、Kafka事务性消息的使用2.1 配置Kafka以支持事务性消息生产者配置消费者配置 2.2 生产者&#xff1a;发送事务性消息创建Kafka生产者开始事务发送消息提交或中止事务 2.…

【MySQL】在 Centos7 环境下安装 MySQL

环境搭建 一、检查环境二、检查系统安装包三、安装 mysql yum 源四、安装 mysql 服务五、启动服务六、登录 mysql七、配置 my.cnf 注意&#xff0c;我们搭建的 mysql 环境是在 Linux 的 Centos7 环境下安装的~ 一、检查环境 注意&#xff0c;我们在安装和卸载中&#xff0c;先…

前端面试(5)

1、移动端适配 1.1、设置meta缩放比例&#xff0c;将设备窗口调整为设计图大小。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,initial-sc…

用到了C语言的函数指针功能。

请选择一个功能&#xff1a; 1. 加法 2. 减法 3. 乘法 4. 除法 5. 取模 6. 阶乘 7. 判断素数 8. 球体体积 9. 斐波那契数列 10. 幂运算 11. 最大公约数 12. 最小公倍数 13. 交换数字 14. 排序 15. 退出 请选择一个选项&#xff1a; #include <stdio.h> #include <stdl…

区块链实验室(31) - 交叉编译Ethereum的客户端Geth

编译Geth到X86架构平台 下载Geth源码&#xff0c;直接编译Geth源码&#xff0c;见下图。用file命令观察编译后的文件&#xff0c;架构是x86-64。 编译Geth到Arm64架构平台 直接用命令行编译&#xff0c;同时指定期望的架构为Arm64。编译脚本如下所示。 CGO_ENABLED0 GOOSlin…

LeetCode力扣每日一题(Java):35、搜索插入位置

一、题目 二、解题思路 1、我的思路&#xff08;又称&#xff1a;论API的重要性&#xff09; 读完题目之后&#xff0c;我心想这题目怎么看着这么眼熟&#xff1f;好像我之前学过的一个API呀&#xff01; 于是我回去翻了翻我之前写的博客&#xff1a;小白备战蓝桥杯&#xf…

JAVA安全之Spring参数绑定漏洞CVE-2022-22965

前言 在介绍这个漏洞前&#xff0c;介绍下在spring下的参数绑定 在Spring框架中&#xff0c;参数绑定是一种常见的操作&#xff0c;用于将HTTP请求的参数值绑定到Controller方法的参数上。下面是一些示例&#xff0c;展示了如何在Spring中进行参数绑定&#xff1a; 示例1&am…

前端知识(十)———JavaScript 使用URL跳转传递数组对象数据类型的方法

目录 首先了解一下正常传递基本数据类型 JavaScript跳转页面方法 JavaScript路由传递参数 JavaScript路由接收参数传递对象、数组 在前端有的时候会需要用链接进行传递参数&#xff0c;基本数据类型的传递还是比较简单的&#xff0c;但是如果要传递引用数据类型就比较麻烦了…

抖音直播匿名采集——协议分析

本文内容仅作学习参考&#xff0c;如侵权&#xff0c;请联系删除。 这次是关于匿名采集的分析&#xff0c;其中会涉及到以下几个只是点&#xff0c;websocket&#xff0c;protobuf&#xff0c;protobuf反序列化。 这里以web端的websocket做分析。 首先你需要将非匿名的代码给…

测试剪切板贴图,兼测试2023年12月7日更新的Bard

当前的情况好比&#xff0c;&#xff08;居然真的可以通过剪切板把图片放进来&#xff01;&#xff09; 听说2023年12月7日Bard有更新&#xff0c;所以&#xff0c;再测试了一次。这下&#xff0c;对大语言模型应该死心了&#xff1b;AI替代人的传闻应该是过早危言耸听了。