JAVA学习笔记:JPA入门&核心API

本文详细介绍了JPA的概念、与Hibernate和JDBC的对比,阐述了为何需要JPA,并讲解了JPA的使用步骤,包括导入Jar包、配置persistence.xml、操作数据库的CRUD以及建表策略。同时,对JPA的核心API如EntityManagerFactory、EntityManager和EntityTransaction进行了深入解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. JPA入门

1.1 什么是JPA

JPA是对象关系映射(ORM) 规范
它是做持久层,操作数据库的

1.2 为什么需要JPA

  1. 使用JDBC,在对象和数据库数据之间转换比较麻烦
  2. 它可以以面向对象的思想来操作数据库数据

1.3 JPA和Hibernate的关系

  1. Hibernate是一个开源的对象关系映射框架(轻量级)
  2. JPA是对象关系映射规范
  3. JPA是持久化规范,而Hibernate是其实现

1.4 JPA和JDBC的优缺点

JDBC优点:
操作数据库最底层,性能最高(但必须是数据库大神)
JDBC缺点:
(1)转换的时候特别麻烦,对象需要进行封装和取值,重复性代码多
(2)移植数据库比较麻烦
​(3)自身没有缓存,如果性能上面需要控制,就需要写缓存代码
​(4)不是面向对象的思想来操作
​JPA优点:
​(1)面向对象的思想来操作
(2) 移植数据比较方便
(3)有缓存
JPA缺点:
(1)不能干预sql的生成
(2)有些优化 jpa做不了,不适合处理特别大数据量的数据
(3)如果一个项目里面,对sql要求比较高,就不适合jpa
(4)JPA一般适用于中小型项目

2. JPA的使用

2.1 导入Jar包

<dependencies>
<!-- hibernate的包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.8.Final</version>
</dependency>
<!-- hibernate对于jpa的支持包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.8.Final</version>
</dependency>
<!-- mysql的驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- junit的测试包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<finalName>pss</finalName>
<plugins>
<plugin>
<!-- Maven的编译插件-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>

2.2 核心配置文件persistence.xml

需要放在src/main/resources/META-INF中
配置中修改连接数据库属性,以及persistence-unit name属性等

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
	version="2.0">
	<persistence-unit name="com.cctv.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="admin" />

			<!-- 必须配置1个方言属性 -->
			<!-- 实现跨数据库关键类 :查询MySQLDialect的getLimitString方法 -->
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />

			<!-- 可选配置 -->
			<!-- 是否自动生成表 -->
			<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>

2.3 使用JPA完成CRUD

步骤:

  1. 生成实体管理工厂
  2. 获取EntityManager对象
  3. 获取事务,开启事务
  4. CRUD
    新增 persist() 修改 merge() 删除remove() 查询 find() 查询所有 使用jpql语句
  5. 提交事务
  6. 关闭资源
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("配置文件中设置的persistence-unit name属性");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
// 添加
entityManager.persist(user);
entityManager.getTransaction().commit();
entityManager.close();
entityManagerFactory.close();

2.4 建表策略

  1. create-drop:先删除表,再建表,再删除表
  2. create:先删除表,再建表
  3. update:如果没表就创建表,如果存在,就不会创建,
    如果表里面已经有这个属性,再修改属性的长度,不会更新到表里面,需要更新这个列先删除表或者删除这个属性对应的列名
    如果表里面没有属性,映射信息存在,会增加这个列
  4. validate 验证策略:当前实体配置和数据库的配置进行对比验证
    如果有对应实体,但是没有对应的数据库表 报错
    如果数据库多字段,验证通过
    如果数据库少字段,验证不通过

3. 核心API简介

3.1 EntityManagerFactory

EntityManagerFactory中应保存了对应的persistence unit中的数据库配置信息和所有实体及关系以及预定义的JPQL语句。同时,EntityManagerFactory还负责维护二级缓存。
EntityManagerFactory对象的创建会有较大的开销,而且EntityManagerFactory对象采取了线程安全的设计方式,因此在实际中EntityManagerFactory对象可以尽量的共享,
在大多数情况下,一个应用中针对一个持久化单元可以共享一个EntityManagerFactory实例。
一个应用程序对应一个EntityManagerFactory对应一个数据库

3.2 EntityManager

  1. EntityManager对象:轻量级的对象
  2. 创建与销毁不怎么费性能(可以随时创建与销毁)
  3. 提供了相应的CRUD(线程不安全)
  4. 一个EntityManager对象只可以由一个线程使用
  5. 一个请求,一个响应
  6. 它里面还装了一个一级缓存

3.3 EntityTransaction

  1. javax.persistence.EntityTransaction
    只能控制相同一个数据库不同表的事务管理,大多数情况都使用这种
  2. javax.transaction.Transaction JTA事务
    处理不同数据库不同表的事务管理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值