JPA 概念

JPA(Java Persistence API)用于对象持久化的 API,是 Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层。

与 JDBC 的对比

JDBC 也是一种规范和接口,不过 JDBC 是面向 SQL 的,使用起来比较繁琐。所以就有了 ORM 框架,建立了 Java 对象与数据库表之间的映射关系,可以通过直接操作对象来实现持久化,简化了操作的繁杂度。而 JPA 就是 ORM 框架的规范,值得一提的是 Hibernate 是符合 JPA 规范的,而 MyBatis 却不符合,因为 MyBatis 还是需要写 SQL 的。

JDBC 示意图:

JPA 示意图:

例子

在 IDEA 下创建一个 JPA 项目,并实现基本的 CRUD。

1、创建一个 JavaEE Persistence 项目,具体如下所示

采用 Hibernate 实现 JPA。

2、导入相应的 Maven 依赖

添加 Maven 支持。

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>groupId</groupId>
<artifactId>jpa-helloworld</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.0.Final</version>
</dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency> </dependencies>
</project>

3、配置数据库(MySQL 8)相关内容 persistence.xml

注意此文件要位于类路径下,这里放在 resources/META-INF 下。

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> <persistence-unit name="jpa-1">
<!--是 PersistenceProvider 接口的实现类-->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <!--添加持久化类-->
<class>com.yunche.helloworld.Customer</class>
<properties>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpa?useSSL=false&amp;serverTimezone=Asia/Shanghai"/>
<property name="hibernate.connection.driver_class" value="com.mysql.cj.jdbc.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="123456"/>
<property name="hibernate.archive.autodetection" value="class"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<!--注意这个属性,自动生成的文件前面没有 hibernate,要加上 hibernate -->
<property name="hibernate.hbm2ddl.auto" value="update"/>
<!-- 使用 MySQL8Dialect -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/> </properties>
</persistence-unit>
</persistence>

4、新建一个持久化对象类

package com.yunche.helloworld;

import javax.persistence.*;

/**
* @ClassName: Customer
* @Description:
* @author: yunche
* @date: 2019/01/16
*/
@Entity(name = "customers")
public class Customer { private Integer age;
private String lastName;
private Integer id;
private String email; public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @Column(name = "last_name")
public String getLastName() {
return lastName;
} public void setLastName(String lastName) {
this.lastName = lastName;
} @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
}
}

并在 persistence.xml 中的 persistence-unit 节点下加入:

<!--添加持久化类-->
<!--后来发现:似乎可以不加-->
<class>com.yunche.helloworld.Customer</class>

5、Main 类

package com.yunche.helloworld;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence; /**
* @ClassName: Main
* @Description:
* @author: yunche
* @date: 2019/01/16
*/
public class Main {
public static void main(String[] args) { //persistence.xml 中的 persistence-unit
String persistenceUnitName = "jpa-1";
//1、创建 EntityManagerFactory
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName);
//2、创建 EntityManager
EntityManager entityManager = entityManagerFactory.createEntityManager();
//3、开启事务
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
//4、进行持久化操作
Customer customer = new Customer();
customer.setAge(13);
customer.setLastName("li");
customer.setEmail("123@qq.com"); entityManager.persist(customer);
//5、提交事务
transaction.commit();
//6、关闭 EntityManager
entityManager.close();
//7、关闭 EntityManagerFactory
entityManagerFactory.close();
}
}

6、结果

7、注意事项

我后来发现了一点问题,关于包 javax.persistence-api 的,我创建项目的时候选中了 persistence 2.0 , IDEA 自动导入了 javax.persistence-api-2.0.jar,而 maven 下的 hibernate-entitymanager 依赖含有 javax.persistence-api-2.2.jar ,所以 jar 包重复了,并且我发现2.0版本的有些方法没有,所以还是将2.0版本的jar包删除,用 2.2 版本的。

参考资料

尚硅谷 佟刚 JPA。

JPA 与 JDBC 的区别和基本用法的更多相关文章

  1. springboot-数据库访问之jpa+mybatis+jdbc的区别

    什么是jdbc jdbc(Java DataBase Connectivity)是java连接数据库操作的原生接口. 什么是jpa jpa(Java Persistence API)是java持久化规 ...

  2. Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍

    大家好,又见面了. 到这里呢,已经是本SpringData JPA系列文档的第三篇了,先来回顾下前面两篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring ...

  3. C#中 Request, Request.params , Request.querystring , Request.Form 区别 与联系用法

    C#中 Request, Request.params , Request.querystring , Request.Form 区别 与联系用法? Request.params , Request ...

  4. JNDI 和JDBC的区别

    1.JNDI 和JDBC的区别和联系.两者都是API,是一个标准.并不是什么产品或方法.JDBC 全称:Java Database Connectivity 以一种统一的方式来对各种各样的数据库进行存 ...

  5. 英文破折号(em dash)、连接号(en dash)与连字符(hyphen)的区别及各自用法是什么?

    英文破折号(em dash).连接号(en dash)与连字符(hyphen)的区别及各自用法是什么?在科技写作中有何特点?   2 条评论 分享   按票数排序按时间排序 6 个回答 赞同85反对, ...

  6. 简述 Hibernate 和 JDBC 的区别、优缺点

    1.hibernate是一个开源的.采用面向对象的思想实现ORM映射框架,它对jdbc进行了一层封装,对于数据库的连接.关闭.数据的持久化(增删改查).事务的管理都进行了封装,使得程序开发的时候可以用 ...

  7. JNDI和JDBC的区别和联系及其使用方法

    一.JNDI 和JDBC的区别和联系 两者都是API,是连接数据库的标准.并不是什么产品或方法. 二.JDBC 全称:Java Database Connectivity 以一种统一的方式来对各种各样 ...

  8. mysql中where和having子句的区别和具体用法

    1.mysql中的where和having子句的区别 having的用法 having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having ...

  9. JDBC ODBC区别

    一.JDBC(Java DataBase Connectivity standard) 1.JDBC,它是一个面向对象的应用程序接口(API), 通过它可访问各类关系数据库. 2. 驱动程序(JDBC ...

随机推荐

  1. Oculus Rift DK2 驱动安装教程

    第一次安装oculus rift硬件驱动的教程: 1.   执行驱动的下载网址:https://developer.oculusvr.com/ 下载驱动首先须要拥有一个oculus的帐号.点击Regi ...

  2. asp.net mvc 的 视图(view )的模块化开发

    目前所在项目有一个视图,几个模块都涉及到,对应不同的开发人员,虽然有SVN在管理,但代码冲突时有发生.并且大家的代码挤于其中,逻辑比较容易混乱. 将不同部件独立出去,实有必要. 分离方式,我知道的有 ...

  3. tf.float32 implicity

    简介  |  TensorFlow https://tensorflow.google.cn/programmers_guide/low_level_intro 我们来构建一个简单的计算图.最基本的指 ...

  4. UniDAC连接Embedded MySQL server

    Simple question about MySQL embedded application. Post a reply   7 posts • Page 1 of 1   Simple ques ...

  5. Vijos 1144 小胖守皇宫 【树形DP】

    小胖守皇宫 描述 huyichen世子事件后,xuzhenyi成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步 ...

  6. YTU 2506: 切面条

    2506: 切面条 时间限制: 1 Sec  内存限制: 128 MB 提交: 382  解决: 223 题目描述 一根高筋拉面,中间切一刀,可以得到2根面条.      如果先对折1次,中间切一刀, ...

  7. BZOJ_1692_[Usaco2007 Dec]队列变换_后缀数组

    BZOJ_1692_[Usaco2007 Dec]队列变换_后缀数组 Description FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛” ...

  8. [Jsoi2015]字符串树

    https://www.zybuluo.com/ysner/note/1298148 题面 字符串树本质上还是一棵树,即\(N\)个节点\(N-1\)条边的连通无向无环图,节点 从\(1\)到\(N\ ...

  9. IJ:工程配置Tomcat

    ylbtech-IJ:工程配置Tomcat 1.返回顶部 1. 1.2. 1.3. 1.4. 2. 2.返回顶部 1. 2. 3.返回顶部 1. 2. 4.返回顶部 0.修改文件位置 D:\work- ...

  10. end()与andSelf()

    end() 回到最近的一个"破坏性"操作之前.即,将匹配的元素列表变为前一次的状态. 如 果之前没有破坏性操作,则返回一个空集.所谓的"破坏性"就是指任何改变所 ...