首页 > 数据库 >通过JPA API访问数据库的方法和范例

通过JPA API访问数据库的方法和范例

时间:2023-10-16 22:06:14浏览次数:53  
标签:范例 Customer entityManager tx JPA 接口 API persistence

Hibernate API和JPA API中主要接口之间有一些对应关系,例如:

JPA API ----------------------- Hibernate API

EntityManagerFactory ----- SessionFactory

EntityManager ---------------- Session

EntityTransaction ------------- Transaction

SessionFactory接口在JPA API中的对等接口是javax.persistence.EntityManagerFactory;Session接口在JPA API中的对等接口是javax.persistence.EntityManager;Transaction接口在JPA API中的对等接口是javax.persistence.EntityTransaction。Query接口在JPA API中的对等接口是javax.persistence.Query。

通过JPA API访问数据库的方法和范例_Customer

EntityManager接口提供了操纵数据库的各种方法,如:

(1) persist()方法:把Java对象保存到数据库中。等价于Session接口的persist()方法。

(2) merge()方法:保存或更新数据库中的Java对象。等价于Session接口的merge()方法。

(3) remove()方法:把特定的Java对象从数据库中删除。类似于Session接口的delete()方法。EntityManager接口的remove()方法只能删除持久化状态的对象,而Session接口的delete()方法可以删除持久化状态或游离状态的对象。。

(4) find()方法:从数据库中加载Java对象。等价于Session接口的get()方法。


下面这个BusinessService类通过JPA API来访问数据库:

package mypack;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import java.io.*;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.*;

public class BusinessService{

  public static EntityManagerFactory entityManagerFactory;
  
  /** 初始化JPA,创建EntityManagerFactory实例 */
  static{
    try{
      entityManagerFactory=
           Persistence.createEntityManagerFactory( "myunit" );
    }catch(Exception e){
      e.printStackTrace();
      throw e;
    }
  }
  
  /** 查询所有的Customer对象,
      然后调用printCustomer()方法打印Customer对象信息 */
  public void findAllCustomers(PrintWriter out)throws Exception{
    EntityManager entityManager =
           entityManagerFactory.createEntityManager();
    EntityTransaction tx = null;
    try {
      tx = entityManager.getTransaction();
      tx.begin(); //开始一个事务
      Query query=entityManager.createQuery(
           "from Customer as c order by c.name asc");
      List customers=query.getResultList();
      for (Iterator it = customers.iterator(); it.hasNext();) {
         printCustomer(out,(Customer) it.next());
      }

      tx.commit(); //提交事务

    }catch (RuntimeException e) {
      if (tx != null) {
         tx.rollback();
      }
      throw e;
    } finally {
       entityManager.close();
    }
  }

  /** 持久化一个Customer对象 */
  public void saveCustomer(Customer customer){
    EntityManager entityManager =
            entityManagerFactory.createEntityManager();

    EntityTransaction tx = null;
    try {
      tx = entityManager.getTransaction();
      tx.begin();
      entityManager.persist(customer);
      tx.commit();

    }catch (RuntimeException e) {
      if (tx != null) {
        tx.rollback();
      }
      throw e;
    } finally {
      entityManager.close();
    }
  }

  /** 按照OID加载一个Customer对象,然后修改它的属性 */
  public void loadAndUpdateCustomer(Long customer_id,String address){
    EntityManager entityManager =
                  entityManagerFactory.createEntityManager();
    EntityTransaction tx = null;
    try {
      tx = entityManager.getTransaction();
      tx.begin();
      Customer c=entityManager
                    .find(Customer.class,customer_id);
      c.setAddress(address);
      tx.commit();

    }catch (RuntimeException e) {
      if (tx != null) {
        tx.rollback();
      }
      throw e;
    } finally {
      entityManager.close();
    }
  }

  /**删除Customer对象 */
  public void deleteCustomer(Customer customer){
    EntityManager entityManager =
            entityManagerFactory.createEntityManager();
    EntityTransaction tx = null;
    try {
      tx = entityManager.getTransaction();
      tx.begin();
      //获得持久化状态的Customer对象
      Customer c=entityManager
          .find(Customer.class,customer.getId());
      entityManager.remove(c);
      tx.commit();

    }catch (RuntimeException e) {
      if (tx != null) {
        tx.rollback();
      }
      throw e;
    } finally {
      entityManager.close();
    }
  }
  
  /** 把Customer对象的信息输出到控制台,如DOS 控制台*/
  private void printCustomer(PrintWriter out,Customer customer)
                                      throws Exception{……}

  public void test(PrintWriter out) throws Exception{……}

  public static void main(String args[]) throws Exception{
    new BusinessService2().test(new PrintWriter(System.out,true));
    entityManagerFactory.close();
  }
}

对JPA的初始化非常简单,只要通过javax.persistence.Persistence的静态方法createEntityManagerFactory()来创建EntityManagerFactory对象:

entityManagerFactory=
  Persistence.createEntityManagerFactory( "myunit" );

以上Persistence.createEntityManagerFactory( “myunit” )方法中的参数“myunit”指定持久化单元包的名字。JPA会到persistence.xml配置文件中读取相应的持久化单元包中的配置信息。

所有访问数据库的操作都使用以下流程:

EntityManager entityManager =
     entityManagerFactory.createEntityManager();
EntityTransaction tx = null;
try {
  tx = entityManager.getTransaction();
  tx.begin();  //声明开始事务
  //执行查询、保存、更新和删除等各种数据访问操作
  ……
  tx.commit();  //提交事务
}catch (RuntimeException e) {
  if (tx != null)
    tx.rollback();
  throw e;
} finally {
  entityManager.close();
}

标签:范例,Customer,entityManager,tx,JPA,接口,API,persistence
From: https://blog.51cto.com/sunweiqin/7893942

相关文章

  • boot驱动模型中的常用API--Apple的学习笔记
    一,前言之前解决ping问题的过程中,需要看uboot的代码,感觉看起来很轻松,我一直觉得代码写的小学生都能看懂的,这才是高手写的代码。面向对象设计的好,封装做的也好。虽然和qemu的Qobject设计雷同,但是我又手痒想画图了。二,学习1,uclass_find(id)根据uclassid来找uclass。在gd->uclass_roo......
  • 03 K8S API资源对象介绍02(Deployment Service DaemonSet StatefulSet)
    一、API资源对象DeploymentDeploymentYANL示例vimnginx-deploy.yamlapiVersion:apps/v1kind:Deploymentmetadata:labels:app:myngname:ng-deployspec:replicas:2##副本数selector:matchLabels:app:myngtemplate:metadata:......
  • 日均数十亿访问,个推API网关如何架构?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • 【Azure APIM】解决APIM Self-hosted Gateway在AKS上,最开始访问时候遇见的404问题
    问题描述根据APIM官方文档,创建Self-hosted网关在AKS中( 使用YAML将自承载网关部署到Kubernetes :https://docs.azure.cn/zh-cn/api-management/how-to-deploy-self-hosted-gateway-kubernetes),但是访问AKS中Services的Endpoint,得到的确实404页面。{"statusCode":40......
  • Stable-diffusion WebUI API调用方法
    写这篇文章的主要原因是工作中需要写一个用训练好的模型批量生图的脚本,开始是想用python直接加载模型,但后来发现webui的界面中有不少好用的插件和参数,所以最终改成调用WebUI接口的方式来批量生图。Stable-diffusion的webui界面使用比较方便,但是它的api文档比较简陋,很多功能需要......
  • WebAPI和MVC的区别
    1.MVC主要用于建站,WebAPI主要用于构建http服务MVC是前端和后端不分离,WebApi是后端写的http服务提供前端,是前后端分离的写法;2.MVC可以返回JsonResult,前端可以直接使用;WebAPI要返回JSON数据,必须JSON.parse()转化为(Maticsoft.Json.dll)3. MVC直接继承system.mvc.cont......
  • 订阅计划推送钉钉消息出现"oapi.dingtalk.com: Name or service not known"
    一、问题描述BI系统需要每天将报表推送给钉钉用户,但是偶尔会出现推送失败的情况,提示oapi.dingtalk.com:Nameorservicenotknown,即钉钉域名解析出现错误,后续重新推送又成功了,该情况具有偶然性。可能的原因是:1、钉钉IP地址是一个地址池,域名oapi.dingtalk.com对应多个IP地址,浏......
  • ASP.NET Core Minimal API之optional route parameter with default value and option
    publicstaticvoidMain(string[]args){varbuilder=WebApplication.CreateBuilder(args);varapp=builder.Build();app.MapGet("/product/{name}",(stringname)=>$"Theproductis{name}").WithName("product&......
  • 华为云发布CodeArts APIMock服务,精准Mock,并行开发零等待!
    本文分享自华为云社区《华为云发布CodeArtsAPIMock服务,精准Mock,并行开发零等待!》,作者:华为云头条。2023年10月10日,华为云正式发布CodeArtsAPIMock服务,这是一款模拟API响应的仿真工具,能够生成开发者所需的API响应数据,帮助开发人员和测试人员在软件研发过程中快速开展调试和验证......
  • Google – Cloud Translation API
    前言通常网站内容翻译,我们都不推荐使用GoogleTranslate。但网站中一些不那么重要的内容确实可以用GoogleTranslate。比如CustomerReviews。这篇是续 GoogleMapsEmbedAPI&JavaScriptAPIGoogle–ReviewsYouTubeDataAPI又一篇关于GoogleCloudAPI的教程。......