Java Persistence API:快速入门

各位读者好! 在我的一些朋友提出无数请求之后,我决定写一篇关于Java Persistence API的简短文章。 面向对象的编程范式是当​​今最流行和使用最广泛的模型,它具有无缝建模现实生活实体的能力,因此它胜过大多数其他范式。 但是,在开发诸如学生数据库或员工数据库等中型数据导向的应用程序时,人们只是打破了面向对象模型并将数据库连接直接链接到前端GUI。 但这不是一个好的编程习惯。 当我刚开始构建面向数据库的小型应用程序时,我是一名顽固的OOP迷,有点担心不使用OOP模型。 良好的编程习惯是拥有一个Solid Object模型并拥有一个数据存储区来保存数据,然后是一个GUI。 所以模型基本上是这样的

但是我偶然发现了另一个问题。 如何链接对象和数据库。 对象中的数据与关系数据库中的数据存储方式不同。 关系数据库不支持许多对我们的对象模型至关重要的OOP概念。 因此,我想到了酿造自己的类,以将数据从数据库传输到对象,然后再传输回来。 但是我面临很多困难和绊脚石。 然后休息了! 我遇到了Java Persistence的东西,这些东西使我可以在程序的生命周期之外保留或保存对象的数据。 这意味着,您现在可以将对象存储到关系数据库或XML文件等数据存储中,而无需编写复杂的代码来转换格式和管理CRUD操作。

这篇小文章将向您介绍这个很棒的功能,并且您将可以开始在项目中实现Persistence。 我不想在本文中涉及复杂的主题。 因此,我决定使用ObjectDB数据库。 使用ObjectDB的优点是,它不需要JPA通常需要的复杂配置和映射文件。 我们将使用流行的Eclipse IDE 。 我将提供一个简单的示例程序,该程序将存储和处理Employee详细信息(名称和薪水)。 好吧,让我们开始吧…………!

持久性服务由许多提供程序提供,我们将使用ObjectDB的实现。 因此,请下载其DB和API文件 。 现在让我们通过一些基础知识。 然后,我们将看到如何实现这些以创建程序……

一,实体类:

要使用持久性,您需要将其对象存储在数据库中的类。 这些类称为实体类,除了一些额外的注释外,它们与POJO(普通的旧Java对象)相同。 您需要定义此类中必须保留的字段(保存在db中)。 实体类必须在类上方具有“ @Entity ”注释。 现在定义该类的所有字段和方法。 瞧,我们为自己准备了实体课! 现在,您可以向实体类添加其他功能。 例如,您可以使用该字段上方的“ @Id ”注释来指示哪个字段用作主键。 您还可以使用“ @GeneratedValue(strategy = GenerationType.AUTO) ”批注使ObjectDB为持久存入数据库的对象生成主键值。 还有更多注释,功能和构造。 但是我们现在不需要了解它们。 这是我们将用作实体类的类。

package employeeDB;import javax.persistence.*;@Entity
publicclass Employee {@Id String name;Double salary;public Employee(){}public Employee (String name, Double Salary){this.name=name;this.salary=Salary;}publicvoid setSalary(Double Salary){this.salary=Salary;}publicString toString(){return"Name: "+name+"\nSalary: "+salary ;}}

如您所见,我们通过@Entity注释标识了Entity类。 然后,将员工姓名作为主键。 并且您需要在实体类中有一个不带参数的默认构造函数。

在其他JPA实现中,您可能必须在单独的XML文件中提供有关实体类的详细信息。 但是ObjectDB不需要这样做。

二。 连接到数据库

在JPA中,数据库连接由EntityManager接口表示。 为了访问和使用ObjectDB数据库,我们需要一个EntityManager实例。 我们可以使用EntityManagerFactory实例获得EntityManager的实例,该实例是使用EntityManagerFactory类的静态createEntityManagerFactory方法创建的。 您需要指定数据库文件的存储位置,作为createEntityManagerFactory方法的参数。 例:

EntityManagerFactory emf=Persistence.createEntityManagerFactory("empDB.odb");
EntityManager em=emf.createEntityManager();

现在我们有了一个EntityManager,它将我们的应用程序连接到数据库。 通常,在一个程序中创建几个EntityManager,但是仅创建一个EntityManagerfactory实例。 大多数JPA实现都需要称为“持久性单元”的XML映射文件作为创建EntityManagerFactory实例的参数。 但是ObjectDB具有仅接受数据库位置的规定。 如果数据库已经存在,它将被打开,否则将为我们创建一个新的数据库。

可以如下关闭EntityManagerFactory和EntityManager,

em.close();
emf.close();

对于每个类(负责某些数据库活动)或在多线程应用程序的情况下,每个线程都有一个单独的EntityManager是一个好习惯。 现在让我们看看如何使用数据库进行交易…。

三, 执行交易

为了对数据库执行任何操作或对数据库执行任何操作,我们必须首先启动事务。 只有使用EntityManager启动事务后,才能执行任何操作。 我们可以使用以下电话开始交易。

em.getTransaction().begin();

现在,我们可以执行各种事务,例如创建新的Record(对象),从数据库中删除,更新和检索数据。 在执行任何CRUD操作之前,我们需要将数据添加到数据库中。 在JPA中,将对象插入数据库称为“持久”对象。 可以使用em.persist(Object)方法执行此操作。 现在,此对象变为“托管”对象,但变为EntityManager(em)。 这意味着对该对象所做的任何更改都将反映在数据库文件的副本中。 要从数据库中删除任何对象,我们可以使用em.remove(Object)方法。 我们可以使用em.find(Class,primaryKeyValue)方法使用对象的主键从数据库中检索对象。 您需要将Entity类的Class实例和主键传递给此方法,它将返回一个“ Object”,该对象必须转换为Entity Class。 最后,执行交易后,我们必须使用结束交易,

em.getTransaction().commit();

只有在提交事务后,对内存中对象的更改才会反映在数据库文件中的对象上。 以下代码将持久存储一个Employee对象,然后搜索一个Employee对象并对其进行修改。

Employee emp1=new Employee ("Gugan",50000);em.getTransaction().begin();//Persist (store) emp1 object into Database
em.persist(emp1);//Search for Gugan
Employee gugan=(Employee) em.find(Employee.class,"Gugan");
gugan.setSalary(100000);em.getTransaction().commit();

我们还可以使用SQL之类的查询(称为JPQL)来执行CRUD操作。

JPA中有两种查询类型。 普通查询和TypedQueries。 普通查询是非类型安全查询。 (即)查询不知道将要检索或使用的对象的类型。 但是TypedQuery是类型安全的查询。 为了创建类型化查询,您需要指定将要使用的类的类型,并将类的Class实例作为参数以及查询字符串传递。 TypedQueries是使用数据库的标准方法,因此我们将仅使用它们。 可以使用以下语法创建它们,

TypedQuery  q=em.createQuery(queryString,EntityClass.class);

如果查询仅返回一个对象或结果,例如查找条目数(计数),则可以使用q.getSingleResult()方法。 另一方面,如果您的查询将返回对象的集合,例如从数据库中检索雇员列表,则可以使用q.getResultList()方法,它将返回创建时指定类型的List对象。 TypedQuery。 下面的代码首先将找到那里有多少雇员,然后将从数据库中检索所有雇员对象。

em.getTransaction().begin();//find number of Employees
TypedQuery  count=em.createQuery("Select count(emp) from Employee emp",Employee.class);
System.out.println("\n"+count.getSingleResult()+" employee record(s) Available in Database!\n");//Retrieve All Employee Objects in the database
TypedQuery  e=em.createQuery("Select emp from Employee emp", Employee.class);
List  employees=e.getResultList();em.getTransaction().commit();

JPQL与SQL查询非常相似。 唯一的区别是您使用类名和对象名而不是表名。 JPQL还支持查询中的参数。 例如。 如果要查找名称为“ Steve”的Employee,并且仅在运行时知道名称“ Steve”,则可以使用以下查询样式。

String name=scannerObj.nextLine();
TypedQuery<employee> query = em.createQuery("SELECT e FROM Employee e WHERE e.name = :name", Employee.class);
query.setParameter("name", name);
Employee emp=query.getSingleResult();

这用给定的“ name”变量替换“:name”参数。 除了这些查询外,还有许多其他查询。 有关JPQL的完整教程,您可以阅读有关JPQL的ObjectDB手册 。

IV。 使用Eclipse进行ObjectDB JPA实现

Eclipse是Java AFAIK的最佳IDE。 因此,我建议使用Eclipse开发应用程序。 从此处下载最新的Eclipse Indigo。 如果您已经拥有Eclipse Indigo或更旧的版本,那么它就很好了。 使用文件菜单创建一个新的Java项目。 然后在新的项目对话框中,为您的项目输入一个项目名称,然后选择要在其中存储项目的目录,然后选择下一步。 按下一步后,将为您提供几个选项,现在在此窗口中选择库选项卡。 然后选择“添加外部罐子”按钮,这将打开一个新对话框。 现在浏览到您提取ObjectDB API文件的位置,然后转到其中的bin文件夹并选择“ objectdb.jar”文件。 按打开,将添加库。 现在按完成以创建您的项目。

现在我们已经创建了项目,我们需要向其添加类。 现在,在Eclipse IDE窗口左侧的Project Explorer窗格中,右键单击您的项目名称,然后选择New-> Class。 现在将打开“新类”对话框。 在其中,输入要创建的类名称,然后也输入包名称。 所有其他选项都不必干预……! 在示例程序中,我们将使用两个类。 一个用于雇员实体,另一个用于容纳应用程序的主要方法和关键功能。 确保两个类都在同一个程序包中。 要查看创建的类,请在“项目资源管理器”窗格中展开您的“项目”,然后从节点列表中展开src,然后您将在其中看到您的包。 展开它,您将看到这些类。

五,范例程序

既然您已经掌握了JPA的基本概念,那么我将介绍一个示例控制台应用程序,该应用程序将从数据库中存储,修改和删除员工。如果您已阅读上述内容,则可以轻松地遵循以下程序。 我在需要使程序更清晰的地方提供了注释。

使用上一节中告诉您的方法创建一个名为Employee的类,并使用employeeDB作为包名,并粘贴本教程第一节中给出的Employee Entity类的代码。

现在,在同一软件包employeeDB下创建另一个名为Main的类,并将以下代码放入其中。

package employeeDB;import javax.persistence.*;
import java.util.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {/*** Displays all Employees in the Database*/private static void displayAll(){em.getTransaction().begin();TypedQuery  e=em.createQuery(displayAllQuery, Employee.class);List <Employee> employees=e.getResultList();if(employees.size()>0){for(Employee temp:employees){System.out.println(temp);System.out.println();}System.out.println(employees.size()+" Employee Records Available...!");}elseSystem.out.println("Database is Empty!");em.getTransaction().commit();}/*** Insets an Employee into the Database.*/private static void insert(){System.out.print("Enter the number of Employees to be inserted: ");n=input.nextInt();em.getTransaction().begin();for(int i=0;i<n;i++){ System.out.println("Enter the details of Employee "+(i+1)+": ");System.out.print("Name: ");//I use BufferedReader to read String and hence I need to // Catch the IOException that it may throwtry{name=bufferedReader.readLine();}catch (IOException e){e.printStackTrace();}System.out.print("Salary: ");Salary=input.nextDouble();Employee emp=new Employee(name,Salary);em.persist(emp);                                //Store emp into Database}em.getTransaction().commit();System.out.println("\n"+n+" employee record(s) Created!\n");TypedQuery  count=em.createQuery(countQuery,Employee.class);System.out.println("\n"+count.getSingleResult()+" employee record(s) Available in Database!\n");}/*** Deletes the specified Employee from the database*@param name*/private static void delete(String name){em.getTransaction().begin();Employee e=(Employee) em.find(Employee.class, name);         //Find Object to be deletedem.remove(e);                                                //Delete the Employee from databaseSystem.out.printf("Employee %s removed from Database....",e.name);em.getTransaction().commit();//Display Number of Employees leftTypedQuery  count=em.createQuery(countQuery,Employee.class);System.out.println("\n"+count.getSingleResult()+" employee record(s) Available in Database!\n");}/*** Changes salary of the specified employee to passed salary*@param name*@param Salary*/private static void modify(String name,Double Salary){em.getTransaction().begin();Employee e=(Employee) em.find(Employee.class, name);  //Find Employee to be modifiede.setSalary(Salary);                                  //Modify the salaryem.getTransaction().commit();System.out.println("Modification Successful!\n");}public static void main(String arg[]){System.out.println("Welcome to the Employee Database System!\n\n");do{    System.out.print("Menu: \n 1. View DB\n2. Insert \n3. Delete \n4. Modify\n5. Exit\nEnter Choice...");int ch=input.nextInt();try{switch(ch){case 1:displayAll();break;case 2:insert();break;case 3:System.out.print("Name of Employee to be Deleted2: ");name=bufferedReader.readLine();delete(name);break;case 4:System.out.print("Name of Employee to be Modified: ");name=bufferedReader.readLine();System.out.print("New Salary: ");Salary=input.nextDouble();modify(name,Salary);break;case 5:if(em!=null) em.close();        //Close EntityManagerif(emf!=null) emf.close();        //Close EntityManagerFactoryexit=true;break;}}catch (IOException e){e.printStackTrace();}}while(!exit);}static EntityManagerFactory emf=Persistence.createEntityManagerFactory("empDB.odb");static EntityManager em=emf.createEntityManager();static Scanner input=new Scanner(System.in);static BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));static int n;static String name;static Double Salary;static boolean exit=false;//Query Repositorystatic String countQuery="Select count(emp) from Employee emp";static String displayAllQuery="Select emp from Employee emp";}

现在保存您的项目,然后按运行按钮或按Ctrl + F11。 现在该程序应该运行了,您可以在底部窗格的“控制台”部分中看到输出。 这只是一个控制台应用程序。 我鼓励您为此开发一个GUI!

VI。 ObjectDB资源管理器工具

在结束之前,我想向您介绍ObjectDB提供的一个非常有用的工具。 它称为ObjectDB Explorer,可用于查看数据库文件包含的内容。 (即)您可以浏览数据库而无需编写代码来访问它。 这对于了解您的应用程序和进行调试非常有用。 您可以在Object DB的bin目录(您在其中提取ObjectDB文件)中找到资源管理器。 运行explorer.exe。 现在,您可以使用File-> Open Local选项打开数据库。 当您访问服务器中存储的数据库时,将完成“打开远程”。 现在浏览并选择数据库并打开它。 现在,双击左侧“持久性支持的类”窗格中显示的数据库。 现在,对象浏览器将显示您的数据库。 您可以展开数据库中的每个对象以查看其内容。 相当整洁吧?

以下是插入后我的数据库的样子……

该资源管理器还提供了许多其他选项。 随意探索它们!

我想您会对JPA有一个生动的想法。 我已经解释了使用ObjectDB实现的JPA的基本知识。 为了了解更多信息并增加知识,您可以参考ObjectDB手册 ,该手册提供了有关带有ObjectDB的JPA的详尽详尽的文本。 这是Java真正有用的功能,将对您有很大帮助。 对我有很大帮助! 因此,尝试更多地了解它。

您可以从此处下载源代码

参考: Java持久性API:一个快速的介绍......从我们JCG伙伴史蒂夫·罗宾逊在褴褛“N”科技博客。

相关文章:
  • GWT 2 Spring 3 JPA 2 Hibernate 3.5教程
  • JBoss 4.2.x Spring 3 JPA Hibernate教程
  • DataNucleus 3.0与Hibernate 3.5
  • Spring和AspectJ的领域驱动设计
  • 提升您的休眠引擎
  • 依赖注入–手动方式

翻译自: https://www.javacodegeeks.com/2011/08/java-persistence-api-quick-intro.html

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

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

相关文章

线性回归、梯度下降(Linear Regression、Gradient Descent)

转载请注明出自BYRans博客&#xff1a;http://www.cnblogs.com/BYRans/ 实例 首先举个例子&#xff0c;假设我们有一个二手房交易记录的数据集&#xff0c;已知房屋面积、卧室数量和房屋的交易价格&#xff0c;如下表&#xff1a; 假如有一个房子要卖&#xff0c;我们希望通过上…

力扣35. 搜索插入位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 二分搜索法 class Solution {public int searchInsert(int[] nums…

@Resource和@Autowired作用和区别

区别&#xff1a; 1&#xff0c;Resource&#xff08;JSR-250标准注解&#xff0c;推荐使用它来代替Spring专有的Autowired注解&#xff09; 2&#xff0c;Spring 不但支持自己定义的Autowired注解&#xff0c;还支持几个由JSR-250规范定义的注解&#xff0c;它们分别是Resourc…

使用Oracle WebLogic对应用程序外部的EJB的引用

在之前的文章中&#xff0c;我们对EJB v。3.0及其为您提供的用于构建Java EE应用程序的可移植机制进行了概述。 由于Java EE规范都是关于可移植性的&#xff0c;因此冒着重复自己的风险&#xff0c;我们经常强调EJB v。3.0规范上仍然存在最重要的可移植性限制&#xff1a;没有在…

基于verilog的分频器设计(奇偶分频原理及其电路实现:上)

在一个数字系统中往往需要多种频率的时钟脉冲作为驱动源&#xff0c;这样就需要对FPGA的系统时钟&#xff08;频率太高&#xff09;进行分频。分频器主要分为奇数分频&#xff0c;偶数分频&#xff0c;半整数分频和小数分频&#xff0c;在对时钟要求不是很严格的FPGA系统中&…

Java判断布尔类型是否相等

public class Solution{public static void main(String args[]){boolean x1 true;boolean x2 false;boolean x3 true;if(x1!x2){System.out.println("布尔类型变量判断是否相等可以用!");}if(x1x3){System.out.println("布尔类型变量判断是否相等可以用&quo…

mysql 中文乱码解决方法

最近在.NET 项目中用EF连接mysql&#xff0c;插入中文数据时老是显示乱码&#xff0c;在创建表时都已将编码指定了&#xff0c;但是还是出现乱码&#xff0c;折腾了一阵子才发现在连接字符串里面也要加上指定编码 Character Setutf8(serverXXXXX;user idXXXX;passwordXXXXX;Cha…

提升您的休眠引擎

是否想知道如何调整基于Hibernate的应用程序以获得无缝的可伸缩性和最佳性能&#xff1f; 本文探讨了基于Hibernate的应用程序的调整技术&#xff0c;重点是有效但文献记载不足的调整主题&#xff0c;例如继承映射&#xff0c;二级缓存和增强的序列标识符生成器。 它还提供了一…

力扣53. 最大子序和

给定一个整数数组 nums &#xff0c;找到一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 思路&#xff1a;每个循环中&#xff0c;sum表示以nums[i]结尾的最大子序和&#xff0c;res表示目前得到的最大子序和。当循环结…

Swift中的延迟加载(懒加载)

Swift方式的延迟加载 而在Swift中&#xff0c;你只需一行代码即可实现此机制&#xff1a; lazy var players String[]() 简单、简洁&#xff0c;直入主题。 但你得记住&#xff0c;你必须使用var关键字来定义延迟加载的属性&#xff0c;不能使用let关键字&#xff0c;因为常量…

Spring,Quartz和JavaMail集成教程

Quartz是一个作业调度框架&#xff0c;用于调度要在指定的时间表上执行的作业。JavaMail是一个用于从Java应用程序发送/接收电子邮件的API。 Spring具有集成点&#xff0c;可以集成Quartz和JavaMail&#xff0c;从而使这些API易于使用。 让我们创建一个小型演示应用程序&#x…

Java_Web三大框架之Hibernate操作数据库(三)

使用Hibernate操作数据库需要七个步骤&#xff1a;&#xff08;1&#xff09;读取并解析配置文件Configuration conf newConfiguration().configure(); &#xff08;2&#xff09;读取并解析映射信息&#xff0c;创建SessionFactorySessionFactory sf conf.buildSessionFacto…

android布局1

第二类&#xff1a;属性值必须为id的引用名“id/id-name” 仅RelativeLayout中有效 android:layout_below 在某元素的下方 android:layout_above 在某元素的的上方 android:layout_toLeftOf 在某元素的左边 android:layout_toRightOf 在某元素的右…

Spring MVC开发–快速教程

这是我们的JCG合作伙伴之一&#xff0c;来自Manoj的有关使用Spring开发Web应用程序的简短教程&#xff0c; 网址为“ The Khangaonkar Report ”。 &#xff08;注意&#xff1a;对原始帖子进行了少量编辑以提高可读性&#xff09; Spring MVC使用基于模型视图控制器体系结构&…

spring mvc controller间跳转 重定向 传参

url&#xff1a;http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ 1. 需求背景 需求&#xff1a;spring MVC框架controller间跳转&#xff0c;需重定向。有几种情况&#xff1a;不带参数跳转&#xff0c;带参数拼接url形式跳转&#xff0c;带参数不拼接参…

寻找数组的中心索引

给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端&#xff0c;那么左侧数之和视为 0 &#xff0c;因为在下标的左侧不存在元素。这一点…

STL sector 应用

1 #include <iostream>2 #include <string>3 #include <vector>4 #include <cstdio>5 using namespace std;6 int n;7 vector<int> pile[30];8 9 //找到a所在pile和height&#xff0c;以应用的形式返回调用者&#xff0c; 10 void find_block(in…

将Jersey与Spring整合

Spring提供了很多好处&#xff0c;并通过其依赖项注入机制&#xff0c;应用程序生命周期管理和Hibernate支持&#xff08;仅举几例&#xff09;促进了最佳实践。 另外&#xff0c;当您想拥有干净的类似于REST的服务器端JSON Api时&#xff0c;我发现Jersey非常方便。 本文简要介…

JAVAWEB 生成excel文字在一格显示两位不变成#号

在用java生成excel的时候会发现这种问题&#xff0c; 如果是人家给的模板还好&#xff0c;如果不是模板&#xff0c;而是通过代码生成的话&#xff0c; 就需要进行处理了&#xff0c; 一个小单元格&#xff0c;如果是一位的话&#xff0c;如1-9显示没有问题&#xff0c;一旦是两…

力扣面试题 01.07. 旋转矩阵

给你一幅由 N N 矩阵表示的图像&#xff0c;其中每个像素的大小为 4 字节。请你设计一种算法&#xff0c;将图像旋转 90 度。 不占用额外内存空间能否做到&#xff1f; 代码一 思路&#xff1a;对于矩阵中第 ii 行的第 jj 个元素&#xff0c;在旋转后&#xff0c;它出现在倒数…