在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.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.mfbz.cn/a/235926.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

openGauss学习笔记-149 openGauss 数据库运维-备份与恢复-逻辑备份与恢复之gs_restore

文章目录 openGauss学习笔记-149 openGauss 数据库运维-备份与恢复-逻辑备份与恢复之gs_restore149.1 背景信息149.2 命令格式149.3 参数说明149.3.1 通用参数-V, –version149.3.2 导入参数 149.4 示例 openGauss学习笔记-149 openGauss 数据库运维-备份与恢复-逻辑备份与恢复…

JVM虚拟机系统性学习-运行时数据区(方法区、程序计数器、直接内存)

方法区 方法区本质上是 Java 编译后代码的存储区域&#xff0c;存储了每一个类的结构信息&#xff0c;如&#xff1a;运行时常量池、成员变量、方法、构造方法和普通方法的字节码指令等内容 方法区主要存储的数据如下&#xff1a; Class 类型信息&#xff0c;如该 Class 为 …

conda 计算当前包的个数

Conda是一个强大的包管理器和环境管理器&#xff0c;它用于安装和管理来自不同源的软件包。若要计算当前conda环境中安装的包的数量&#xff0c;你可以使用以下命令&#xff1a; 首先&#xff0c;激活你想要检查的conda环境&#xff08;如果不是默认的base环境&#xff09;&am…

2023-2024年华为ICT网络赛道模拟题库

2023-2024年网络赛道模拟题库上线啦&#xff0c;全面覆盖网络&#xff0c;安全&#xff0c;vlan考点&#xff0c;都是带有解析 参赛对象及要求&#xff1a; 参赛对象&#xff1a;现有华为ICT学院及未来有意愿成为华为ICT学院的本科及高职院校在校学生。 参赛要求&#xff1a…

【XR806开发板试用】编译FreeRTOS系统

编译FreeRTOS系统&#xff0c;测试串口输出。 一、下载源码 1.1、获取源码 下载源码: rootubuntu:/home# wget https://bbs.aw-ol.com/assets/uploads/files/1693988430633-xr806_sdk.tar.gz 解压文件 rootubuntu:/home# tar xvf 1693988430633-xr806_sdk.tar.gz 1.2、获取…

用Kotlin抓取微博数据并进行热度预测

闲来无事&#xff0c;逛逛微博&#xff0c;看着每条热度很高的博文趣事&#xff0c;心想能否通过爬虫抓取微博热度并进行趋势分析&#xff0c;说干就干&#xff0c;这里需要注意的问题我会一一标注。 爬虫ip信息的设置是在爬虫程序中进行的。爬虫ip信息可以帮助爬虫程序在访问…

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

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

Maven项目引入本地jar

Maven项目引入本地jar 1.对应maven模块项目中建lib目录&#xff0c;将jar放入进去 2.在对应的模块pom.xml中引入此依赖jar 3.在对应的maven-plugin插件打包的pom.xml中指定需要includeSystemScope为true的jar

HTML的img常见应用属性

目录 一、src、alt、width、height 的运用二、title的运用三、align的运用四、border的运用 一、src、alt、width、height 的运用 src指定图像的URL&#xff0c;即图像的路径alt指定图像的替代文本&#xff0c;当图像无法显示时&#xff0c;会显示替代文本。width指定图像的宽…

【特殊文件(一)】属性文件读写实操

文章目录 属性文件特殊文件概述Properties属性文件概述Properties属性文件读取Properties属性文件写操作 属性文件 特殊文件概述 IO流是用来读、写文件中的数据。但是我们接触到的文件大部分都是普通的文本文件&#xff0c;普通的文本文件里面的数据是没有任何格式规范的&…

E. Greedy Shopping

线段树经典题 维护最大值和最小值 还有区间和 #include<bits/stdc.h> using namespace std; using ll long long; const int N 2e510; ll w[N]; struct Segment{ll l,r;ll val,fmin,fmax;ll lz; }tr[N<<2];int n,m;void pushup(int u){tr[u].val tr[u<<…

有关光伏电站绝缘阻抗异常排查分析-安科瑞 蒋静

近几年&#xff0c;光伏发电技术迅猛发展&#xff0c;光伏扶贫电站及分布式光伏使光伏发电走进千家万户。然而光伏发电设备运行期间仍存在隐患。及时发现并解决*常见异常运行故障&#xff0c;可以很大地提高光伏发电设备可利用率&#xff0c;是保证光伏发电设备正常运行、满足收…

class074 背包dp-分组背包、完全背包【算法】

class074 背包dp-分组背包、完全背包【算法】 算法讲解074【必备】背包dp-分组背包、完全背包 code1 P1757 通天之分组背包 // 分组背包(模版) // 给定一个正数m表示背包的容量&#xff0c;有n个货物可供挑选 // 每个货物有自己的体积(容量消耗)、价值(获得收益)、组号(分组)…

“我“的测试之路,从初级测试到测试开发,往后前景...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、测试工程师的现…

PHP基础 - 数组

在PHP中,数组是一种特殊的变量类型,可以存储多个值。PHP中有多种创建数组的方法,其中之一是使用array()函数。 1. 数值数组 带有数字 ID 键的数组 <?php $scars = array("age","name","domicile"); // 使用数组函数创建一个空数组# 人…

基于SpringBoot+Vue前后端分离的景点数据分析平台(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

TailwindCSS 配置可视化检查器

问题 TailwindCSS 框架为我们提供了大量默认的类和属性&#xff0c;而且开发者也能够自定义类和配置。 对于初学者来说&#xff0c;这些配置其实是比较复杂的&#xff0c;这也是tailwindcss最大的入手成本&#xff0c;开发者的记忆负担和心智负担也都比较大。 有没有办法能够…

vue3原生方法滚动列表

效果图 代码 import { ref, onBeforeUnmount, onUnmounted } from "vue"; //定时器初始化 let timer ref(null); //ref绑定初始化 let roll ref(null); //等同于vue2中的beforeDestroy onBeforeUnmount(() > {//清除定时器clearTimeout(timer.value); }); //等同…

简单实现Spring容器(二) 封装BeanDefinition对象放入Map

阶段2: // 1.编写自己的Spring容器,实现扫描包,得到bean的class对象.2.扫描将 bean 信息封装到 BeanDefinition对象,并放入到Map.思路: 1.将 bean 信息封装到 BeanDefinition对象中,再将其放入到BeanDefinitionMap集合中,集合的结构大概是 key[beanName]–value[beanDefintion…

【图对比学习】GACN:使用对抗网络增强图对比学习

#论文题目&#xff1a;Graph Contrastive Learning with Generative Adversarial Network&#xff08;使用对抗网络增强图对比学习&#xff09; #论文地址&#xff1a;https://dl.acm.org/doi/pdf/10.1145/3580305.3599370 #论文源码开源地址&#xff1a;暂无 #论文所属会议&am…