JPA入門-Hibernate使用

我的網站:歡迎大家訪問

JPA入門–Hibernate使用

概念

什麼是JPA?

JPA是Java Persistence API的簡稱。

JPA作爲 Java EE 5.0 平臺標準的 對象關係映射(ORM) 規範

將得到所有 Java EE 服務器的支持。 Sun 這次吸取了之前 EJB 規範慘痛失敗的經歷,在充分吸收現有 ORM 框架(如Hibernate)的基礎上,得到了一個易於使用、伸縮性強的 ORM 規範。

從目前的開發社區的反應上看
JPA 受到了極大的支持和讚揚, JPA 作爲 ORM 領域標準化整合者的目標已經實現

作用

直白點說,能夠更好的對數據庫進行操作管理,我們只需要操作JPA便可實現對數據庫的CRUD

Hibernate

Hibernate是一個開放源代碼的對象關係映射(ORM)框架,它對JDBC進行了非常輕量級(相對於EJB這一套)的對象封裝,它將POJO(就是咱們的domain)與數據庫表建立映射關係,是一個全自動的orm框架,Hibernate可以自動生成SQL語句,自動執行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫

添加依賴

使用maven管理項目,在pom.xml裏面加入依賴

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>jap</artifactId>
        <groupId>com.ifueen.JPA</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>jap01</artifactId>

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

</project>

idea自動將需要的包下載下來

配置核心文件persistence.xml

idea會自動生成persistence.xml,然後到裏面去配置

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="jap01">

        <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="594395fzk"/>
            <!-- 數據庫方言 -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
            
            <!-- 選配-->
            <!-- 生成組策略 -->
            <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>

生成數據表

新建實體類User

package com.ifueen.employee;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "t_user")
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Id
    public Long getId() {
        return id;
    }

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

    public User() {
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

新建測試類

package com.ifueen.employee;

import org.junit.Test;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;


public class UserTest {
    @Test
    public void test(){
        /*拿到工廠對象*/
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("jap01");
        /*創建EntityManager*/
        factory.createEntityManager();
    }
}

然後運行測試類,就可以生成,注意,前提是先要將相關的數據庫建好

運行結果

CRUD操作

使用Hibernate進行增刪改查操作

package com.ifueen.employee;

import org.junit.Test;

import javax.persistence.*;
import java.util.List;


public class UserTest {
    @Test
    public void test(){
        /*拿到工廠對象*/
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("jap01");
        /*創建EntityManager*/
        factory.createEntityManager();
    }

    /**
     * 增加方法
     * */
    @Test
    public void add(){
        /*拿到工廠對象*/
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("jap01");
        /*創建EntityManager*/
        EntityManager manager = factory.createEntityManager();
        //開啓事務
        EntityTransaction transaction = manager.getTransaction();
        transaction.begin();
        //執行sql操作
        User user = new User();
        user.setName("遠方只有在死亡中凝聚野花一片");
        manager.persist(user);
        //提交事務
        transaction.commit();
        //關閉資源
        manager.close();
        factory.close();
    }

    /**
     * 查詢單個方法
     * */
    @Test
    public void find(){
        /*拿到工廠對象*/
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("jap01");
        /*創建EntityManager*/
        EntityManager manager = factory.createEntityManager();
        //執行sql操作
        User user = manager.find(User.class, 1L);
        System.out.println(user);
        //關閉資源
        manager.close();
        factory.close();
    }

    /**
     * 查詢所有方法
     * */
    @Test
    public void findAll(){
        /*拿到工廠對象*/
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("jap01");
        /*創建EntityManager*/
        EntityManager manager = factory.createEntityManager();
        //寫jpql的語句
        String 寫jpql的語句="select u from User u";
        //拿到查詢的對象
        Query query = manager.createQuery(寫jpql的語句);
        //執行查詢,得到list集合
        List resultList = query.getResultList();
        //java8新新特性lmada表達式
        resultList.forEach(e->{
            System.out.println(e);
        });
        //關閉資源
        manager.close();
        factory.close();
    }


    /**
     * 修改的方法
     * */
    @Test
    public void update(){
        /*拿到工廠對象*/
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("jap01");
        /*創建EntityManager*/
        EntityManager manager = factory.createEntityManager();
        //開啓事務
        EntityTransaction transaction = manager.getTransaction();
        transaction.begin();
        //先查詢出需要更新的字段
        User user = manager.find(User.class, 1L);
        user.setName("九月");
        //更新操作
        manager.merge(user);
        //提交事務
        transaction.commit();
        //關閉資源
        manager.close();
        factory.close();
    }

    /**
     * 刪除的方法
     * */
    @Test
    public void delete(){
        /*拿到工廠對象*/
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("jap01");
        /*創建EntityManager*/
        EntityManager manager = factory.createEntityManager();
        //開啓事務
        EntityTransaction transaction = manager.getTransaction();
        transaction.begin();
        //先查詢出需要更新的字段
        User user = manager.find(User.class, 1L);
        //執行刪除操作
        manager.remove(user);
        //提交事務
        transaction.commit();
        //關閉資源
        manager.close();
        factory.close();
    }


}

我們還可以將拿到EntityManager對象抽取出來成爲一個工具類,在當前模塊中進行使用,當然,抽取工具類完全看自己願不願意,都沒關係

package com.ifueen.util;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import java.lang.management.ManagementFactory;

/**
 * JPA的工具類
 * */
public class JPAUtil {
    private JPAUtil() {}
    private static EntityManagerFactory factory = null;
    static {
        factory = Persistence.createEntityManagerFactory("jpa01");
    }
    public static EntityManager getJpa(){
        return factory.createEntityManager();
    }
}

面試題:關於生成表結構的區別?

四種生成表結構的方式區別如下

<property name="hibernate.hbm2ddl.auto" value="update"/>
這種方式生成表結構會自動創建,然後在hibernate結束的時候將給刪除,一般測試人員使用較多

<property name="hibernate.hbm2ddl.auto" value="create"/>
這種方式在每次運行的時候都會生成新的表,而且會覆蓋之前的表,不太推薦使用

<property name="hibernate.hbm2ddl.auto" value="update"/>
這種方式在每次運行的時候都會去判斷是否存在這張表,如果不存在就新建,如果存在就保留並且更新相關的字段,開發的時候用這種方式較多

<property name="hibernate.hbm2ddl.auto" value="validate"/>
這種方式在加載的時候先驗證創建數據庫表結構,只會和數據庫中的表進行比較,不會創建新表,但是會插入新值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章