• 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:

     

  • 相关阅读:
    P4016 负载平衡问题 网络流
    P3357 最长k可重线段集问题 网络流
    mysql部署
    pve配置
    PVE手册资料
    PVE授权条款
    ovirt磁盘类型(IDE, virtio, virtio-scsi)
    oVirt-postgresql
    ovirt常用后台维护命令
    oVirt部署
  • 原文地址:https://www.cnblogs.com/wfy680/p/14972849.html
Copyright © 2020-2023  润新知