JPA框架初次见面

2024-01-14 10:58
文章标签 框架 初次见面 jpa

本文主要是介绍JPA框架初次见面,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.JPA的认识

1.1 什么是JPA(了解)

jpa:

​ (1)Java持久层API,jpa就是做持久层,操作数据库

​ (2)它是对象映射框架(ORM)的规范

​ ORM: 对象关系映射(Object Relational Mapping,简称ORM)

​ 数据表库 t_employee

idname
12

t_employee ---- 类对应上 Employee

字段id/name ----- 类里面的属性 id name

一行数据 ----- new Employee(1,‘豪豪’);

对象(Domain类 Entity类 对象)

1.2 为什么需要JPA

(1)以前使用jdbc,在对象和数据库数据之间转换特别麻烦

(2)他以面向对象的思维来操作数据,比如我操作一个java里面对象,就相当于操作数据库表数据

1.3 hibernate和JPA的关系(理解)

JPA:他是ORM的规范

Hibernate:它是ORM这个规范实现的框架

JPA是持久化规范,而Hibernate是其实现。

1.4 jdbc和jpa优缺点(理解)

jdbc:优缺点:

​ jdbc操作数据库底层技术

​ (1)转换的时候, 对象需要进行封装和拆分 比较麻烦

​ (2)重复性代码比较多

​ (3)移植数据库比较麻烦

​ 操作数据库的时候,如果使用jdbc,可能要写两套代码

​ (4)jdbc 自身没有缓存(Cache),如果性能上面需要控制的话,就需要写缓存代码

​ (5)jdbc不是面向对象的思维来操作的,它是面向sql操作,如果是sql高手,操作jdbc很爽的;

​ (6)比较简单 比较直接,就可以操作数据库

​ JPA的:

​ (1)面向对象操作,操作对象 就相当于操作数据 比如 entityManager.perisit(employee)

​ (2) 移植数据比较方便,以后如果想换数据库,只需要换一个数据库方言就OK

​ (3)JPA有缓存,效率不错的 (一级缓存 二级缓存 查询缓存)

​ 缺点:

​ (1)不能干预sql的生成 ,查询一个数据 find 默认查询所有字段 (select * from )

​ (2)有些优化 jpa做不了,比如特别大数据量的时候,jpa也不适合,mybatis也解决不了 (架构策略 分库 分表 (分布式))

​ (3)一个项目里面 对sql要求比较高,就不适合jpa

JPA适用于中小型的项目

jpa小结

  1. 什么是JPA?java persistence api ,对象关系映射(ORM) 规范(持久化)
  2. Hibernate和JPA的关系? JPA是规范,Hibernate是它的一个实现。
  3. Hibernate是一个完整的对象关系映射框架 mybatis半自动ORM框架
  4. 什么是ORM? 对象关系映射
  5. JDBC与JPA的优缺点?

​ JDBC操作更加底层,它的性能是完全可控的(前提:有控制它性能的能力)

​ JPA对JDBC的封装,快速开发,自身已经有了很好的性能优化,兼容各种数据库

​ 缺点:不能干涉SQL生成 ,有些性能问题无法解决

3jpa的使用(掌握)

3.1导入依赖的jar包

3.2 persistence.xml的配置(掌握)

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"><!--持久化单元名称name :取一个单元的名称transaction-type:事务类型 本地数据库的事务--><persistence-unit name="cn.itsource.jpa" transaction-type="RESOURCE_LOCAL"><properties><!-- 必须配置4个连接数据库属性 --><property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" /><property name="hibernate.connection.url" value="jdbc:mysql:///jpa" /><property name="hibernate.connection.username" value="root" /><property name="hibernate.connection.password" value="123456" /><!-- 必须配置1个方言属性 --><!-- 实现跨数据库关键类 :查询MySQLDialect的getLimitString方法 --><property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /><!-- 可选配置 ddl数据定义语言(建库建表建约束)dml数据操作语言 (insert update delete)dql 数据查询语言(select)tcl 事务控制语言 (commit rollback)--><!-- 是否自动生成表 --><property name="hibernate.hbm2ddl.auto" value="create" /><!-- 是否显示sql --><property name="hibernate.show_sql" value="true" /><!-- 格式化sql --><!--<property name="hibernate.format_sql" value="true" />--></properties></persistence-unit>
</persistence>

3.3 使用JPA完成一个新增操作

1new 一个pojo类,调用set方法赋值
2、获得entityManagerFactory实体管理工厂
3、获得entityManager实体管理器(对象)
4、获取事务,然后开启事务
5、持久化操作,persist(Object)
6、提交事务
7、关闭资源
持久化操作实现CRUD方法,添加:persist();修改:merge()	;删除:remove();查找:find()查询所有:jpql语句;
@Testpublic void testAdd() throws Exception{User user = new User();user.setName("覃璇璇");//实体管理工厂EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("cn.itsource.jpa");//通过工厂生成EntityManager(实体管理的对象)EntityManager entityManager = entityManagerFactory.createEntityManager();//获取事务entityManager.getTransaction().begin();//开启事务entityManager.persist(user);entityManager.getTransaction().commit();//提交事务entityManager.close();entityManagerFactory.close();}/**方法:   新增 persist修改 merge删除remove查询 find查询所有 jpql语句/
查询所有: jpql语句@Testpublic void testQueryAll() throws Exception{/** 查询所有* jpql语句,类似于sql语句,JPA提供的查询数据的语言* 写法:sql:select * from t_user;*       jpql: select o from User o;  //o,为对象的别名* *///获得实体管理器EntityManager entityManager = JPAUtils.getEntityManager();//开启事务EntityTransaction transaction = entityManager.getTransaction();transaction.begin();String jpql = "select o from User o";Query query = entityManager.createQuery(jpql);List list = query.getResultList();//for增强快捷键iterfor (Object o : list) {System.out.println(o);}}

3.4 建表策略(掌握)

	        建表自动生成表的策略,配置是persistence.xml时对以下策略进行选择<!-- 是否自动生成表 --><property name="hibernate.hbm2ddl.auto" value="create" />create 创建策略,先删除 在创建update (测试)更新策略   不会删除  如果发现没有表,也会创建如果是表里面新增的字段 ,配置都有效果如果这个表里面已经存在该字段 去修改属性 没有效果 比如lengthcreate-drop 先删除 在创建 在删除  不怎么会用  面试会问并且 把entityManagerFactory关闭临时表 临时使用表 使用完之后,数据就不应该存在validate 验证策略 当前实体配置和数据库的配置进行对比验证如果有对应实体,但是没有对应的数据库表 报错数据库多字段 OK数据库少字段 不OK使用场景:比如已知数据库的前提下 就可以把实体的配置和数据库的配置进行对比

3.5 JPA的API的认识

[外链图片转存失败(img-wj44wlQT-1563983994045)(E:\课程文件\2019-07-23-jpa01\doc\图片2.png)]

Persistence=>EntityManagerFactory-

3.5.1 EntityManagerFactory

EntityManagerFactory这个类他是重量级的,要与数据库建立联系。不要频繁创建和销毁,很销毁性能

怎么类应该怎么设计?

​ 1:1:1 1个应用程序 对应1个entityManagerFactory 对应1个数据库==>持久化单元Persistence Unit

这个类也应该设计成共享的。在设计成共享的时候,尽量线程安全(ThreadLocal --Map(threadid,object))

​ 1.数据库配置信息它里面有一个连接池(本身就重,创建与销毁太费时间)

​ 2.有二级缓存(查询缓存,…) – 后面讲

​ 3.预定义的JPQL语句(JPQL,SQL) – 后面讲

​ 4.维护所有实体已经它们之间关系 --后面讲

3.5.2 EntityManager

EntityManager 它是实体管理的类,可以管理实体(crud),它是轻量级的类,可以频繁创建和销毁不会销毁太多的性能,他是线程不安全的,但是在设计,多个线程来访问的时候,尽量的保证线程是安全,如果没有线程安全,出现事务并发带来的问题;(脏读 虚度(幻读) 不可重复读)

事务并发:多个事务同时操作同一个数据的时候

小屋 10000$ – 小房+10000$ – 转账事务

小业--- 操作数据事务 -- >是可以解决的   乐观锁 悲观锁

(1)管理实体(crud)

(2)EntityManager里面有一个一级缓存(掌握)

​ 缓存:Cache 在内存里面开辟一块空间来临时存储数据

​ 目的:提高查询的效率

​ 缓存什么时候才能用上:(一级缓存命中之后就可以用来)

同一个EntityManagerFactory 同一个EntityManager 同一个OID(实体对象的ID --主键ID)

3.5.3 EntityTransaction(了解)

实体的事务对象

现在 EntityTransaction – 都是本地事务 同一个库里面事务

JTA

不同库的事务: 分布式事务 解决方案 --redis

分布式事务:

​ 不同服务 同一个库 --属于分布式事务

​ 不同服务 不同库 --属于分布式事务

电商:订单模块(order库–tomcat1)–> 库存模块(store库-tomcat2) 支付模块(pay-tomcat3) …

分布式:

比如 转账

3.6 单表映射配置(掌握)

	@Entity@Table(name="t_employee")public class Employee {@Id@GeneratedValueprivate Long id; //要求:主键,使用数据库的自动生成策略@Column(length = 20,name = "username",unique=true,nullable=false)private String name;  //要求:varchar(20),数据库名称为username,不能为空,唯一private String password;/***  create table t_bb(*      id  int(20),*      name varchar(200),*      age int(20) default 25*  )**  PK:primary key   主键*  UK :unique key  唯一键*  FK :foreign key  外键**/@Column(columnDefinition="int(20) default 25",insertable = false )private Integer age = 25; //要求:默认值是25,在插入数据时不允许覆盖(添加数据时不操作该字段)private Boolean sex;// 数据库没有布尔类型,bit对象@Column(columnDefinition ="decimal(19,2)")private BigDecimal salary;// 19,2@Column(updatable=false)@Temporal(TemporalType.TIMESTAMP)private Date createTime;//包含年月日时分秒,不允许修改 update@Temporal(TemporalType.DATE)private Date birthday;//包含年月日@Temporal(TemporalType.TIME)private Date time;//包含时分秒@Lobprivate String text;//这是一个大文本 longtext@Transientprivate String temp;//这一个字段不要同步到数据库}

这篇关于JPA框架初次见面的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/604921

相关文章

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Spring Framework系统框架

序号表示的是学习顺序 IoC(控制反转)/DI(依赖注入): ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean 用对象的时候不用new,直接外部提供(bean) 当外部的对象有关系的时候,IOC给它俩绑好(DI) DI和IO

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简

Yii框架relations的使用

通过在 relations() 中声明这些相关对象,我们就可以利用强大的 Relational ActiveRecord (RAR) 功能来访问资讯的相关对象,例如它的作者和评论。不需要自己写复杂的 SQL JOIN 语句。 前提条件 在组织数据库时,需要使用主键与外键约束才能使用ActiveReocrd的关系操作; 场景 申明关系 两张表之间的关系无非三种:一对多;一对一;多对多; 在

使用Spring Boot集成Spring Data JPA和单例模式构建库存管理系统

引言 在企业级应用开发中,数据库操作是非常重要的一环。Spring Data JPA提供了一种简化的方式来进行数据库交互,它使得开发者无需编写复杂的JPA代码就可以完成常见的CRUD操作。此外,设计模式如单例模式可以帮助我们更好地管理和控制对象的创建过程,从而提高系统的性能和可维护性。本文将展示如何结合Spring Boot、Spring Data JPA以及单例模式来构建一个基本的库存管理系统