1. 程式人生 > >JPA基礎學習

JPA基礎學習

1.什麼是JPA

     JPA是一種ORM規範

    ORM:物件(java)關係(資料庫)對映

    JPA優缺點:開發效率高,資料庫相容,但是效能低。

2.Hibernate

 Hibernate是一個開放原始碼的物件關係對映(ORM)框架。

 優缺點:開發效率不高(只是相對而言,大神還是可以做到的很好),效能高,相容性強,有快取機制

3.使用JPA完成基礎的CRUD(增刪改查)

3.1導包

<!-- hibernate的包 -->

        <dependency>

            <groupId>org.hibernate</groupId>

            <artifactId>hibernate-core</artifactId>

            <version>4.3.8.Final</version>

        </dependency>

        <!-- hibernate對於jpa的支援包 -->

        <dependency>

            <groupId>org.hibernate</groupId>

            <artifactId>hibernate-entitymanager</artifactId>

            <version>4.3.8.Final</version>

        </dependency>

        <!-- mysql的驅動包 -->

        <dependency>

            <groupId>mysql</groupId>

            <artifactId>mysql-connector-java</artifactId>

            <version>5.1.6</version>

        </dependency>

        <!-- junit的測試包 -->

        <dependency>

            <groupId>junit</groupId>

            <artifactId>junit</artifactId>

            <version>4.12</version>

        </dependency>

    </dependencies>

    <build>

        <finalName>pss</finalName>

        <plugins>

            <plugin>

                <!-- Maven的編譯外掛-->

                <groupId>org.apache.maven.plugins</groupId>

                <artifactId>maven-compiler-plugin</artifactId>

                <configuration>

                    <source>1.8</source>

                    <target>1.8</target>

                </configuration>

            </plugin>

        </plugins>

</build>

3.2Domain:使用註解建立表

         @Entity//建表
	 @Table(name="xx")//給表一個名字
	    
         public class Product{
                @Id//一個類必需要加主鍵
	        @GeneratedValue//自動給值
	        private Long id;

                public void setId(Long id){
                   this.id=id
                }
                 public Long getId(){
                   return id;
                }
   

         }
     

3.3.程式碼完成

   1.獲取EntityManager 物件

     EntityManagerFactory f =Persistence.createEntityManagerFactory();

     EntityManager eg = f.createEntityManager();

    2.開啟事務(同生共死,要麼都成功,要麼都失敗)

        entityManager.getTransaction().begin();

    3.提交事務

        entityManager.getTransaction().commit();

    4.關閉事務

        entityManager.close();

        entityManagerFactory.close();

     5.增刪改需要新增事務

        save:persist();

        edit:merge();

        delect:先查在刪   remove()

    查詢不要事務的:

       queryOne:find()

       queryAll:  creatQuery() 然後 getResultList();

3.4.WEN-INF/persistence.xml

<property name="hibernate.<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <!--
      persistence-unit:持久化單元(一個數據庫對應一個持久化單元)
              name="" :為持久化單取個名字
              transaction-type:事務型別
                      RESOURCE_LOCAL:本地(資料庫自帶)
                      JTA:用於分散式系統
              我要操作資料庫->最少配置基本屬性:driven,url,username,password
                自帶連線池
  -->
    <persistence-unit name="cn.itsource.jap" transaction-type="RESOURCE_LOCAL">
        <!--
            properties:屬性配置
            全部可以在:   \hibernate-release-4.3.8.Final\project\etc\hibernate.properties
           -->
        <properties>
            <!-- 操作資料庫的四個基本屬性 -->
            <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="root" />
            <!-- 配置方言:根據不同資料庫的特性去生成SQL -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <!--
                建立表
                ddl:建庫建表建約束
            -->
hbm2ddl.auto" value="update" />
            <!-- 顯示SQL -->
            <property name="hibernate.show_sql" value="true" />

        </properties>
    </persistence-unit>
</persistence>

4.建表策略

create-drop -> 刪 - 建 -刪(儲存關閉EntityManagerFactory)

create -> 刪 -建

update -> 修改(如果沒有表會建立)【只增不減】

validate -> 驗證 【只驗證domain中有的資料】

5.四大物件

1.Persistence:

          工具類,建立EntityManagerFactory(解析xml)

2.EntityManagerFactory:

        重(連線池,sql,二級快取,domain關係等)

        執行緒安全  

        一個應用程式對應一個EntityManagerFactory:一個數據庫   1:1:1

       建立EntityManager

3.EntityManager:

     輕(連線,一級快取)

     執行緒不安全的

     一個請求(執行緒)一個EntityManager

     一級快取命中:同一個EntityManagerFactory,同一個EntityManager,同一個OID

   OID:物件的全限定名#id的值

4.Transaction:

       EntityManager拿到的事務是同一個:

       3.提交事務

        entityManager.getTransaction().commit();

     4.關閉事務

        entityManager.close();

        entityManagerFactory.close();