Jpa Day1

作者: 观潮n | 来源:发表于2019-07-24 00:24 被阅读0次

    什么是JPA

    JPA是Java Persistence API的简称。

    JPA作为 Java EE 5.0 平台标准的 对象关系映射(ORM)规范

    将得到所有Java EE服务器的支持。 Sun 这次吸取了之前 EJB 规范惨痛失败的经历,在充分吸收现有ORM框架(如Hibernate)的基础上,得到了一个易于使用、伸缩性强的 ORM 规范。

    [if !supportLists]3. [endif]从目前的开发社区的反应上看

    JPA受到了极大的支持和赞扬, JPA 作为 ORM 领域标准化整合者的目标已经实现。

    为什么需要JPA

    这个需要从Hibernate的起源说起。 Hibernate作者Gavin King发现以前写JDBC的开发效率太低,特别在Java这种面向对象的语言在与关系型数据库之间的数据转换太麻烦了。

    于是开发出了Hibernate,他当时的目标是,只要是Java程序员,就算不懂SQL语句,也可以来操作数据库。

    Hibernate和JPA的关系

    Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级(相对于EJB这一套)的对象封装,它将POJO(就是咱们的domain)与数据库表建立映射关系,是一个全自动的orm框架,Hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

    JPA是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate、TopLink(现在叫EclipseLink)等ORM框架各自为营的局面。

    值得注意的是,JPA是在充分吸收了现有Hibernate、TopLink等ORM框架的基础上发展而来的,具有易于使用、伸缩性强等优点。

    目标:

    简化现有Java EE和Java SE应用的对象持久化的开发工作;

    Sun希望整合ORM技术,实现一统江湖。

    简单一句话:JPA是持久化规范,而Hibernate是其实现。

    JPA的优缺点

    jdbc操作数据库底层技术

    ​ (1)转换的时候特别麻烦 对象需要进行封装和拆分 比较麻烦

    ​ (2)重复性代码比较多

    ​   (3)移植数据库比较麻烦

    ​ 操作数据库的时候,如果使用jdbc,可能要写两套代码

    ​ (4)jdbc 自身没有缓存(Cache),如果性能上面需要控制的化,就需要写缓存代码

    ​ (5)jdbc不是面向对象的思维来操作的呀 面向sql操作,如果是sql高手,操作jdbc很爽的;

    ​ (6)比较简单 比较直接,就可以操作数据库

    ​ JPA的:

    ​ (1)面向对象操作,操作对象 就相当于操作数据 比如  entityManager.perisit(employee)

    ​   (2) 移植数据比较方法,以后如果想换数据库,只需要换一个数据库方言就OK

    ​   (3)JPA有缓存,效率不错的 (一级缓存 二级缓存 查询缓存)

    ​ 缺点:

    ​ (1)不能干预sql的生成 ,查询一个数据 find  默认查询所有字段 (select * from )

    ​ (2)有些优化 jpa做不了,比如特别大数据量的时候,jpa也不适合,mybatis也解决不了 (架构策略 分库 分表 (分布式))

    ​   (3)一个项目里面 对sql要求比较高,就不适合jpa

    JPA使用于中小型的项目

    JPA CRUD

    和以前学习JDBC一样,咱们需要抽取一个工具类

    public class JPAUtils {

    //保证EntityManagerFactory是单例

      private static EntityManagerFactory entityManagerFactory;

      static {

        try {

    //对应配置文件里面的persistence-unit name="cn.itsource.jpa"

          entityManagerFactory = Persistence.createEntityManagerFactory("cn.itsource.jpa");

        } catch (Exception e) {

          e.printStackTrace();

    throw new RuntimeException("解析配置文件或者映射配置出现异常:" + e.getMessage());

        }

      }

      public static EntityManager getEntityManager() {

        return entityManagerFactory.createEntityManager();

      }

    }

    导入依赖的jar包


    persistence.xml的配置

    <?xml version="1.0" encoding="UTF-8"?>

    <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">

        <!--

            持久化单元名称

            name :取一个单元的名称

            transaction-type:事务类型 本地数据库的事务

        -->

        <persistence-unit name="cn.itsource.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="123456" />

                <!-- 必须配置1个方言属性 -->

                <!-- 实现跨数据库关键类 :查询MySQLDialect的getLimitString方法 -->

                <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />

                <!-- 可选配置 ddl数据定义语言(建库建表建约束)

                              dml数据操作语言 (insert update delete)

                              dql 数据查询语言(select)

                              tcl 事务控制语言 (commit rollback)

                              -->

                <!-- 是否自动生成表 -->

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

    每次都先添加数据


    domain


    add


    update


    查询一条


    查询全部


    删除



    建表策略

    create 创建策略,先删除 在创建

                      update (测试)更新策略  不会删除  如果发现没有表,也会创建

                            如果是表里面新增的字段 ,配置都有效果

                            如果这个表里面已经存在该字段 去修改属性 没有效果 比如length

                      create-drop 先删除 在创建 在删除  不怎么会用  面试会问

                                把entityManagerFactory关闭

                            临时表 临时使用表 使用完之后,数据就不应该存在

                      validate 验证策略 当前实体配置和数据库的配置进行对比验证

                                如果有对应实体,但是没有对应的数据库表 报错

                                数据库多字段 OK

                                数据库少字段 不OK

                      使用场景:比如已知数据库的前提下 就可以把实体的配置和数据库的配置进行对比

    相关文章

      网友评论

          本文标题:Jpa Day1

          本文链接:https://www.haomeiwen.com/subject/zxazlctx.html