【自我提升】JPA从搭建到CRUD快速入门(IDEA+MAVEN)

news2024/10/7 10:13:06

写在前面:今天又学习一点新的东西,方面日后查询和巩固学习,下面将学习过程记录下来。

一、创建MAVEN工程

1. 打开IDEA创建一个纯净的maven工程项目

 2. 打开pom文件,导入maven坐标

注意:我使用的postgres数据库,如果你使用的其他数据库,只需要将这个依赖替换即可。不管什么数据库,你都需要注意依赖的版本,和你自己下载的数据库相匹配。

maven仓库地址:

maven仓库地址https://central.sonatype.com/?smo=true

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.hibernate.version>5.0.7.Final</project.hibernate.version>
    </properties>


    <dependencies>
        <!-- junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- hibernate对jpa的支持包 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>${project.hibernate.version}</version>
        </dependency>

        <!-- c3p0 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>${project.hibernate.version}</version>
        </dependency>
        

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.6.0</version>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>

二、项目结构完善

目录结构如下所示:

 1. 创建实体类

package com.study.entity;


import lombok.Data;

import javax.persistence.*;

/**
 * 客户类
 */
@Entity
@Table(name = "cst_customer")
@Data
public class Customer {
    /**
     * 声明主键的配置
     * @Id 主键
     * @GeneratedValue 主键生成策略,GenerationType.IDENTITY为自增策略
     * @Column 配置属性和字段映射关系
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "cust_id")
    private Long custId;
    @Column(name = "cust_name")
    private String custName;
    @Column(name = "cust_source")
    private String custSource;
    @Column(name = "cust_level")
    private String custLevel;
    @Column(name = "cust_industry")
    private String custIndustry;
    @Column(name = "cust_phone")
    private String custPhone;
    @Column(name = "cust_address")
    private String custAddress;
}

2. 创建工具类

        通过静态代码块的形式来解决EntityManagerFactory创建实例浪费资源的问题。

  • 第一次访问getEntityManager:首先经过静态代码块,创建工厂对象,再调用方法,创建一个EntityManager对象。
  • 第二次访问getEntityManager,直接通过一个已经创建好的factory对象,返回一个EntityManager对象 。
package com.study.utils;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 * 1. 解决通过EntityManagerFactory浪费资源的问题
 * 2. 静态代码块的形式来解决
 *
 * 第一次访问getEntityManager:首先经过静态代码快,创建工厂对象,再调用方法,创建一个EntityManager对象
 * 第二次访问getEntityManager,直接通过一个已经创建好的factory对象,返回一个EntityManager对象
 */
public class JPAUtil {
    private static EntityManagerFactory factory;
    static {
        //加载配置文件,创建EntityManagerFactory
        factory = Persistence.createEntityManagerFactory("myJpa");

    }

    /**
     * 获取EntityManager实体对象
     */
    public static EntityManager getEntityManager(){
        return factory.createEntityManager();
    }
}

3. persistence.xml 持久化配置

注意:如果使用的是mysql,则需要将数据库配置替换:

            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="root"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/HeimaSpringData?userSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai"/>
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <!--需要配置persistence-unit节点
        持久化单元:
            name:持久化单元名称
            transaction-type:事务管理的方式
                JTA:分布式事务管理
                RESOURCE_LOCAL:本地事务管理
    -->
    <persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
        <!--jpa的实现方式-->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <!--可选配置:配置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="postgres"/>
            <property name="javax.persistence.jdbc.password" value="123456"/>
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/lianxi"/>


            <!--配置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" />
        </properties>
    </persistence-unit>

</persistence>
  • create      : 程序运行时创建数据库表(如果有表,先删除表再创建)
    update      :程序运行时创建表(如果有表,不会创建表)
    none        :不会创建表

三、JAP之CRUD操作

在测试目录下,创建一个测试类JpaTest.java;CRUD大体上可以分为五个步骤:

  1. 获取EntityManager对象
  2. 开启事务
  3. CRUD操作
  4. 提交事务
  5. 释放资源

1. 新增操作

    @Test
    public void testSave(){
        //加载配置文件创建工厂
        //通过实体管理工厂获取实体管理器
        EntityManager em = JPAUtil.getEntityManager();
        //获取事务对象,开启事务
        EntityTransaction tx = em.getTransaction();
        tx.begin();//开启事务
        //完成增删改查操作
        Customer customer = new Customer();
        customer.setCustName("测试88");
        customer.setCustIndustry("测试行业");
        //保存
        em.persist(customer);
        //提交事务
        tx.commit();
        //释放资源
        em.close();
    }

2. find()查询和 getReference()查询,两个查询的结果都是一样的。只不过getReference()是懒加载,可以节省资源。

    /**
     * 查询操作
     */
    @Test
    public void testFind(){
        //通过工具类获取一个EntityManager对象
        EntityManager em = JPAUtil.getEntityManager();
        EntityTransaction ts = em.getTransaction();
        ts.begin();//开启事务
        //根据id查询数据
        Customer customer = em.find(Customer.class, 1L);
        System.out.println(customer);
        //提交事务
        ts.commit();
        //释放资源
        em.close();
    }

    /**
     * 查询操作
     * 特点:获取的是一个动态代理对象,调用getReference不会立即发送sql语句查询。当调用查询结果对象的时候才会查询(什么时候用什么时候查)
     * 什么时候用什么时候才加载,懒加载
     * 一般用延迟加载的方式比较好,这样可以节省资源,避免浪费效率
     */
    @Test
    public void textReference(){
        //通过工具类获取一个EntityManager对象
        EntityManager em = JPAUtil.getEntityManager();
        EntityTransaction ts = em.getTransaction();
        ts.begin();//开启事务
        //根据id查询数据
        Customer customer = em.getReference(Customer.class, 1L);
        System.out.println(customer);
        //提交事务
        ts.commit();
        //释放资源
        em.close();
    }

3.  删除操作(先查询,然后删除)

    /**
     * 删除客户方法
     */
    @Test
    public void testDelete(){
        EntityManager entityManager = JPAUtil.getEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        //根据id查询数据
        Customer customer = entityManager.getReference(Customer.class, 4L);
        //删除对象
        entityManager.remove(customer);
        transaction.commit();
        entityManager.close();
    }

4.更新操作(先查询后更新操作)

    /**
     * 客户的更新操作
     */
    @Test
    public void testUpdate(){
        EntityManager entityManager = JPAUtil.getEntityManager();
        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();
        //根据id查询数据
        Customer customer = entityManager.find(Customer.class, 5L);
        //更新对象
        customer.setCustPhone("147852369");
        entityManager.merge(customer);
        transaction.commit();
        entityManager.close();
    }

jpql常用条件查询

        在JPA(Java Persistence API)中,可以使用JPQL(Java Persistence Query Language)进行条件查询。JPQL是一种面向对象的查询语言,类似于SQL,但是操作的是实体对象而不是数据库表。

下面是一些示例JPQL查询的条件语句:

(1)基本的条件查询:例如查询工资大于50000的员工对象.

String jpql = "SELECT e FROM Employee e WHERE e.salary > :salary";
List<Employee> employees = entityManager.createQuery(jpql, Employee.class)
    .setParameter("salary", 50000)
    .getResultList();

(2)使用逻辑运算符:查询工资大于50000且所属部门为"IT"的员工对象.

String jpql = "SELECT e FROM Employee e WHERE e.salary > :minSalary AND e.department = :department";
List<Employee> employees = entityManager.createQuery(jpql, Employee.class)
    .setParameter("minSalary", 50000)
    .setParameter("department", "IT")
    .getResultList();

(3)使用模糊查询:查询名字中包含"Smith"的员工对象。

String jpql = "SELECT e FROM Employee e WHERE e.name LIKE :keyword";
List<Employee> employees = entityManager.createQuery(jpql, Employee.class)
    .setParameter("keyword", "%Smith%")
    .getResultList();

(4)使用IN子句:查询所属部门为"IT"或"HR"的员工对象。

String jpql = "SELECT e FROM Employee e WHERE e.department IN :departments";
List<String> departmentList = Arrays.asList("IT", "HR");
List<Employee> employees = entityManager.createQuery(jpql, Employee.class)
    .setParameter("departments", departmentList)
    .getResultList();

(5) 使用like查询

String jpql = "FROM Customer WHERE custName LIKE ?";
List<Customer> customers = entityManager.createQuery(jpql, Customer.class)
    .setParameter(1, "%Smith%")
    .getResultList();

(6) 查询排序

String jpql = "select count(custId) from Customer";
Query query = em.createQuery(jpql);//创建Query查询对象,query对象才是执行jqpl的对象

(7)分页查询

        //3.查询全部
        //i.根据jpql语句创建Query查询对象
        String jpql = "from Customer";
        Query query = em.createQuery(jpql);
        //ii.对参数赋值 -- 分页参数
        //起始索引
        query.setFirstResult(1);
        //每页查询的条数
        query.setMaxResults(2);

        //iii.发送查询,并封装结果

        /**
         * getResultList : 直接将查询结果封装为list集合
         * getSingleResult : 得到唯一的结果集
         */
        List list = query.getResultList();

        for(Object obj : list) {
            System.out.println(obj);
        }

差不多敲完上面的代码后,基本就熟练了,入门上手应该是够了。

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

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

相关文章

【微服务】搭建项目以及子模块

目录 方法一&#xff1a;搭建远程仓库新建idea 项目创建子模块创建父模块的pom父模块的gitignore文件修改查看远程代码仓库 方法二 方法一&#xff1a; 搭建远程仓库 选择 下载地址 新建idea 项目 复制 项目远程仓库的下载地址 下载完成 创建子模块 导入微服务的必要组件…

Apache Pulsar 分布式部署

1.Pulsar 简介 Pulsar 是一个支持多租户的、高性能的消息中间件&#xff1b;最初是由 Yahoo 研发的开源&#xff0c;分布式pub-sub系统&#xff0c;现在是Apache的一个顶级开源项目 Pulsar 提供了四种订阅类型&#xff0c;它们可以共存在同一个主题上&#xff0c;以订阅名进行区…

【html页面引入vue3语法模板】在html页面中使用vue3语法和elementul-plus组件库的简单模板

前言 这是最近在看这些东西&#xff0c;因为看别的地方是用脚手架直接用的。 我这个项目想要在html上直接使用。 所以我就试了下如何在html上使用vue3语法 目前摸索出来的是这样可以使用。 记录下来供参考&#xff0c;如果有不好的地方后续改进 效果图 这里就是简单的试了一…

修改npm路径

npm config ls如果是第一次使用NPM安装包的话&#xff0c;在配置中只会看到prefix的选项&#xff0c;就是NPM默认的全局安装目录。但是如果有多次使用NPM安装包的话&#xff0c;就会看到cache和prefix两个路径。 新建两个文件夹node_global_modules和node_cache npm config s…

mac android studio设置跟mac系统一样的快捷键

mac版的android studio 跟mac系统的快捷键不一样,主要修改了下面几组操作,为了跟mac系统快捷键相同 setting->Keymap 搜索bottom 修改3个快捷键: cmd↓ 设置让鼠标移动到屏幕最后面 shiftcmd↓ 选中从当前位置到屏幕最下面 option↓. 或者 end 滚动到屏幕最下方 // 因为默认…

详解 HTTPS、TLS、SSL、HTTP区别和关系

一、什么是HTTPS、TLS、SSL HTTPS&#xff0c;也称作HTTP over TLS。TLS的前身是SSL&#xff0c;TLS 1.0通常被标示为SSL 3.1&#xff0c;TLS 1.1为SSL 3.2&#xff0c;TLS 1.2为SSL 3.3。下图描述了在TCP/IP协议栈中TLS(各子协议)和HTTP的关系。 二、HTTP和HTTPS协议的区别 …

【开源项目】中后台开发框架vue-next-admin

vue-next-admin 基本介绍 基于 vue3.x CompositionAPI setup 语法糖 typescript vite element plus vue-router-next pinia 技术&#xff0c;适配手机、平板、pc 的后台开源免费模板&#xff0c;希望减少工作量&#xff0c;帮助大家实现快速开发。 在线预览 账号: adm…

Braindecode系列 (1):在BCIC IV 2a数据集上进行试验

Braindecode系列&#xff1a;在BCIC IV 2a数据集上进行试验 0. 引言1. 环境介绍1.1 环境配置1.2 运行环境 2. Python实现2.1 加载和预处理数据集2.2 创建模型2.3 模型训练2.4 结果输出图像 3. 结果展示4. 总结 0. 引言 最近在看运动想象相关的论文时&#xff0c;找到了一个很好…

在线培训系统的保障措施带来安全、可靠的学习环境

在今天的数字时代&#xff0c;越来越多的人选择在线培训系统作为学习的方式。然而&#xff0c;随着在线教育市场的不断增长&#xff0c;安全和可靠性成为消费者普遍关心的问题。因此&#xff0c;在线培训系统需要采取一系列保护措施以确保学生的数据和隐私得到保护&#xff0c;…

Python 运算符(二)

文章目录 Python逻辑运算符Python成员运算符Python身份运算符Python运算符优先级后记 Python逻辑运算符 Python语言支持逻辑运算符&#xff0c;以下假设变量 a 为 10, b为 20: 运算符逻辑表达式描述实例andx and y 布尔"与" - 如果 x 为 False&#xff0c;x and y …

php周练

前言&#xff1a;博主个人小练&#xff08;纯小白&#xff09;。 目录 1.[SWPUCTF 2021 新生赛]gift_F12已解决2.[SWPUCTF 2021 新生赛]jicao3.[ZJCTF 2019]NiZhuanSiWei4.[SWPUCTF 2021 新生赛]no_wakeup5.[SWPUCTF 2021 新生赛]ez_unserialize 1.[SWPUCTF 2021 新生赛]gift_…

Ae 效果:CC RepeTile

风格化/CC RepeTile Stylize/CC RepeTile CC RepeTile&#xff08;CC 重复拼贴&#xff09;效果可对整个图层进行复制并扩展&#xff0c;通过重复拼贴来创建平铺效果。 ◆ ◆ ◆ 效果属性说明 Expand Right 向右扩展 设置图层向右扩展的距离。 Expand Left 向左扩展 设置图层…

VMware vCenter Server 7.0 Update 3n 下载 - 集中管理 vSphere 环境

VMware vCenter Server 7.0 Update 3n 下载 - 集中管理 vSphere 环境 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vcenter-7-u3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org VMware vCenter Server 是一款高…

【菜菜丸的菜鸟教程】制作带闹铃和振动功能的仿真闹钟

一、准备闹钟模型 (一)下载模型 从Unity资源商店和其他模型网站可以下载到各种各样的闹钟模型。为了帮助大家了解机械钟表的设置原理&#xff0c;建议使用带有时针、分针和秒针的钟表&#xff0c;如下图。 注意&#xff1a;时针、分针和秒针最好是挂在闹钟父物体下的三个独立的…

【数据结构】--二叉树

注&#xff1a;本文树和二叉树的概念及结构部分有部分参考了别的文章&#xff0c;其他的二叉树的实现和性质习题等等都是自己一点点写的&#xff0c;创作不易&#xff0c;希望支持&#xff01; ————————————————————— 目录 一. 树概念及结构 1、树概念…

springboot家具商城系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…

Spring Boot 系列2 -- 配置文件

目录 1. 配置文件的作用 2. 配置文件的格式 3. properties 配置文件说明 3.1 properties 基本语法 3.2 读取配置文件 3.3 properties 缺点 4.yml 配置文件说明 4.1 yml 基本语法 4.2 yml 使用进阶 4.2.1 yml 配置不同数据类型及 null 4.2.2 yml 配置读取 4.2.3 注意…

FPGA学习——点亮流水灯

文章目录 一、前言二、源码三、ModelSim仿真3.1 tb文件源码&#xff1a;3.2 创建项目3.3 ModelSim仿真 一、前言 在FPGA开发板中&#xff0c;一般板载LED默认高电平点亮&#xff0c;因此我们只需要将想要亮起的LED赋值为1即可。 本入门实验要求为每隔1s开发板上的LED轮流亮起&…

STM32 Proteus仿真医用仓库环境控制系统紫外线消毒RS232上传CO2 -0066

STM32 Proteus仿真医用仓库环境控制系统紫外线消毒RS232上传CO2 -0066 Proteus仿真小实验&#xff1a; STM32 Proteus仿真医用仓库环境控制系统紫外线消毒RS232上传CO2 -0066 功能&#xff1a; 硬件组成&#xff1a;STM32F103R6单片机 LCD1602显示器DHT11温度湿度电位器模拟…