JPA概述及helloworld
时间:2019-12-11
本文章向大家介绍JPA概述及helloworld,主要包括JPA概述及helloworld使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、JPA概述
1. 是什么
- JPA全称
Java Persistence API
:意思是 Java 持久化 API- 它是Java EE5.0平台指定的的 ORM 规范,使得应用程序以统一的方式访问持久层
2. JPA和 hibernate 的关系(JPA是hibernate的创作者提出的...)
- JPA 是 hibernate 的一个抽象(就像是 JDBC 和 JDBC 驱动之间的关系)
- JPA是规范:JPA是一种ORM规范,而不是ORM框架,它只是提供了接口,具体的实现由ORM厂商实现
- hibernate 是实现:hibernate 除了是 ORM 框架以外,也是JPA的实现
- 从功能上说,JPA是hibernate的子集
3. JPA有哪些实现
- hibernate(毕竟JPA就是它的作者提出来的)、OpenJPA、TopLink
4. JPA 包括什么
- ORM 映射元数据:主要学习注解方式
- API
- 查询语言(JPQL):类似于 hibernate 的 hql
二、hello world
1. 创建项目
导包(依赖)
<properties> <hibernate.version>5.0.7.Final</hibernate.version> <slf4j.version>1.6.6</slf4j.version> <log4j.version>1.2.12</log4j.version> <c3p0.version>0.9.5.4</c3p0.version> <mysql.version>5.1.28</mysql.version> </properties> <dependencies> <!-- junit单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- hibernate --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.18.Final</version> </dependency> <!-- c3p0 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>${c3p0.version}</version> </dependency> <!-- log --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> </dependencies>
编写配置文件
log4j
# 为了直观的看输出结果和sql,我设置了打印级别为ERROR级 log4j.rootLogger=ERROR log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
JPA配置文件:路径必须是
META_INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> <!-- transaction-type:指定 JPA 的事务处理策略。 RESOURCE_LOCAL:默认值,数据库级别的事务,只能针对一种数据库,不支持分布式事务。 如果需要支持分布式事务,使用JTA:transaction-type="JTA" name 属性用于定义持久化单元的名字, 必选 --> <persistence-unit name="jpa01" transaction-type="RESOURCE_LOCAL"> <!-- 配置ORM映射产品来实现JPA映射 实际上是 javax.persistence.spi.PersistenceProvider的实现类 如果项目中只有一个JPA实现产品,则不需要配置该节点 --> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <!-- 添加持久化类 --> <class>cn.ann.entity.User</class> <properties> <!-- 连接数据库的基本信息 --> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3307/jpa_test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai" /> <property name="javax.persistence.jdbc.user" value="root" /> <property name="javax.persistence.jdbc.password" value="password" /> <!-- ORM 框架的基本信息 --> <property name="hibernate.hbm2ddl.auto" value="update"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> </properties> </persistence-unit> </persistence>
创建实体类(getter和setter略)
@Entity // 表明这是一个与数据库表对应的实体类 @Table(name = "t_user") // 表明关联的表名称 public class User implements Serializable { private static final long serialVersionUID = -5201721404180914044L; @Id // 表明该字段是主键 private Long id; @Column(name = "last_name") private String lastName; private Integer age; private String email; }
2. 测试
编写测试类
public class JpaDemo { @Test public void JpaTest_persistence() { // 1. 创建实体管理工厂:EntityManagerFactory EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa01"); // 2. 创建实体管理类:EntityManager EntityManager entityManager = factory.createEntityManager(); // 3. 获取事务 EntityTransaction tx = entityManager.getTransaction(); try { // 4. 开启事务 tx.begin(); // 5. 操作 for (int i = 1; i <= 100; i++) { User user = new User(); user.setLastName("程序员"+i+"号"); user.setAge(20 + i%20); user.setEmail("john"+i+"@ann.cn"); entityManager.persist(user); } // 6.1 提交事务 tx.commit(); } catch (Exception e) { // 6.2 发生异常就回滚事务 tx.rollback(); e.printStackTrace(); } finally { // 7. 释放资源 entityManager.close(); factory.close(); } } }
本节代码:点击此处
原文地址:https://www.cnblogs.com/ann-zhgy/p/12022152.html
- 64位centos 下编译 hadoop 2.6.0 源码
- Python基础原理:FP-growth算法的构建
- MFC中如何画带实心箭头的直线
- 非域环境下使用证书设置数据库镜像
- velocity模板引擎学习(3)-异常处理
- Oracle Coherence应用部署到Jboss EAP 6.x 时 NoClassDefFoundError: sun/rmi/server/MarshalOutputStream 的解决办法
- 推荐Visual Studio 2010新功能-IntelliTrace(智能跟踪)
- 搭建consul 集群
- Windows更新清理工具 (winsxs 清理工具)
- Windows NLB搭配IIS的ARR搭建高可用环境
- hadoop: hbase1.0.1.1 伪分布安装
- InstallShield 脚本语言学习笔记
- C++服务器开发之笔记三
- 分布式服务注册和发现consul 简要介绍
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python | 面试的常客,经典的生产消费者模式
- LeetCode 87,因为题目晦涩而被点了1500+反对的搜索问题
- LeetCode 87,远看是字符串其实是搜索,你能做出来吗?
- Golang中的interface是干嘛的?从面向对象中的多态与接口开始说起……
- pandas | DataFrame基础运算以及空值填充
- C++设计模式笔记(08) - Factory Method工厂方法
- 【Code】GraphSAGE 源码解析
- Kafka常见的导致重复消费原因和解决方案
- 近30个MySQL常用函数,必须推荐!
- 搞定 CompletableFuture,并发异步编程和编写串行程序还有什么区别?你们要的多图长文
- 用注解实现 MyBatis 开发
- MyBatis 实现数据的增删改查
- 0790-5.16.2-NameNode服务的edits不同步异常
- 0789-不停止MySQL服务重做备库的方法
- 防盗链Apache和Nginx配置对比