JPA Hibernate JDBC

原文:https://blog.csdn.net/zc1320030382/article/details/78366370?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-1.baidujs&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-1.baidujs

什么是JPA?

JPA是Java 持久化的API【Java Persistence API的简称】;

JPA规范:JPA本质是一种ORM规范,不是ORM框架,因为JPA没有提供ORM实现,他只是订制一些规范,提供一些编程的API的接口,在充分吸收现有 ORM 框架(如Hibernate)的基础上,得到了一个易于使用、伸缩性强的 ORM 规范。

Hibernate和JPA的关系:Hibernate是开源的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级(相对于EJB这一套)的对象封装,它将POJO(就是咱们的domain)与数据库表建立映射关系,是一个全自动的orm框架,Hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。值得注意的是,JPA是在充分吸收了现有Hibernate、TopLink等ORM框架的基础上发展而来的,具有易于使用、伸缩性强等优点。简单一句话:JPA是持久化规范,而Hibernate是其实现。

JDBC的优缺点
本质:处理Java对象和关系型数据库表之间的转换
优点:操作数据库最底层,性能最高(前提是你要有相应的经验,并且是一个数据库高手)
缺点:

1.使用复杂(重复代码太多)
2.移植数据库很麻烦,改动比较多
主键的生成方式不同(mysql使用自增,oracle使用序列sequence)
分页的sql语句也是不同(mysql使用limit,oracle使用ROWNUM)
3.性能优化得自己处理,没有提供数据的缓存,需要自己实现
4.面向sql语句操作,不是面向对象的


JPA的优缺点
本质:处理Java对象和关系型数据库表之间的转换,只是对JDBC再次做了一层封装
优点:

1.程序员操作很简单,代码简单 entityManager.persist(employee);
2.直接面向持久对象操作
3.提供世界级数据缓存(现在几乎所有的ORM框架的缓存都是学的Hibernate)
一级缓存,二级缓存,查询缓存(空间换速度)
4.数据库移植性很强,很少的修改(通过配置方言搞定)
把各种数据库抽取了一个方言接口
不同数据库实现一个方言接口,如果换了数据库,必须修改方言实现,驱动jar文件,连接数据库信息。


缺点:

1.不能干预sql语句的生成
  entityManager.find(User.class, 1L);
  find方法默认查询t_user表的所有字段
  自动生成select user0_.id,user0_.name,user0_.age from t_user user0_ where user0_.id=?
2.一个项目中,如果对sql语句的优化要求比较高,不适合用JPA(不过可以使用JPA对原生sql的支持来解决)
3.如果一张表中有上亿级别的数据量,也不适合用JPA,其实也不适合用jdbc(可以使用数据库读写分离,分库分表方案解决)。

JPA三方面的技术:

ORM映射元数据;JPA的API;查询语句(JPQL)

总结

1.什么是JPA : java persistence api 对象关系映射(ORM) 规范(持久化)
2.Hibernate和JPA的关系 :JPA是规范,Hibernate是它的一个实现。
3.Hibernate是一个完整的对象关系映射框架 mybatis半自动ORM框架
4.什么是ORM : 对象关系映射
5.JDBC与JPA的优缺点 
  JDBC操作更加底层,它的性能是完全可控的(前提:有控制它性能的能力)
  JPA对JDBC的封装,快速开发,自身已经有了很好的性能优化,兼容各种数据库
  缺点:不能干涉SQL生成(有些性能问题无法解决)


JPA 的基本注解:
@Entity :指出该Java类为实体类,将映射到指定的数据库
@Transient :忽略该属性,不需要映射到数据表的一列,否则默认为@Basic
@Temporal :在属性上调整精度,比如Date
@Table :标注常用name属性,用于指定数据库的表明
@Id :映射主键(放在getter方法之前)
@GeneratedValue :用于标注主键的生成策略,通过strategy属性指定
@Column :映射数据表的列名,指定unique,length等
@Basic :基本注解,默认有

4.使用JPA持久化对象的步骤:
创建perisistence.xml文件,在配置文件中配置持久化单元(需要跟哪个数据库进行交互,使用哪个持久化框架以及配置框架的基本属性)
创建实体类,使用annotation来描述实体类跟数据表之间的映射关系
使用JPA API完成数据CRUD操作

  


6.JPA API:
Persistence:Persistence类用于获取EntityManagerFactory实列,该类包含一个名为createEntityManagerFactory的静态方法
EntityManagerFactory:主要用来创建EntityManager实列 createEntityManager();创建实体管理对象的实例。close():关闭EntityManagerFactory
refresh() ;clear() ; isOpen() ; close() ;
EntityTransaction:接口用来管理资源层实体管理器的事务操作。 getTransaction();获得其实例
begin() ; commit() ; rollback() ; setRollbackOnly() ; getRollbackOnly() ; isActive() ;

7.映射关系:
单向多对一:使用@ManyToOne来映射多对一关系映射;使用@JoinColumn来映射外键;建议先保存1的一端,后保存n的一端;可以使用@ManyToOne的fetch来修改默 认的关联属性的加载策略
单向一对多:使用@OneToMany来映射一对多关系映射;使用@JoinColumn来映射外键;
双向一对一:使用@OneToOne来映射一对一对应关系映射;建议先保存不维护关联关系的一方,既没有外键的一方,
双向多对多:使用@ManyToMany来映射多对多关系映射;使用@JoinTable来映射中间表;name:指定外键的列名;rederenedColumnName:指定外键列关联的当期表 的那一列;inverseJoinColumns:映射关联的类所在中间表的外键

8.Spring整合JPA:

LocalContainerEntityManagerFactoryBean:

 

原文地址:https://www.cnblogs.com/wfy680/p/14972849.html