3.1 連接 Hibernate 和數據庫

我們學習瞭如何使用 Maven 將 Hibernate 連接到我們的應用程序,以及如何使用註釋將表映射到類。現在下一個問題出現了——我們如何從數據庫中讀取對像或將它們保存在那裡?

沒那麼快。首先,你還需要處理三件事:

  • 配置數據庫連接
  • 設置休眠
  • 使用 EntityManager

Hibernate 對您的應用程序完全隱藏了對數據庫的操作,但是為了避免任何過度操作,必須正確配置它。您不能跳過這一步——否則 Hibernate 如何知道將對象保存到哪個數據庫?

可以通過三種方式配置 Hibernate 並提供數據庫信息

  • 使用屬性文件
  • 使用 hibernate.cfg.xml 文件
  • 使用配置 bean 方法

而且雖然我最喜歡最後一個,但是你肯定會遇到這三個,所以我們在這裡對這三個進行分析。

3.2 在數據庫中授權

讓我們從最重要的 - 數據庫連接開始。為此,您需要提供數據以便 Hibernate 可以登錄到所需的數據庫。

屬性文件配置
休眠.properties
hibernate.dialect= org.hibernate.dialect.Oracle9Dialect
hibernate.connection.driver_class= oracle.jdbc.driver.OracleDriver
hibernate.connection.url= jdbc:oracle:thin:@localhost:1521:supershop
hibernate.connection.username=root
hibernate.connection.password=secret
hibernate.show_sql=true
hibernate.hbm2ddl=update

可以以xml文件的形式設置相同的設置:

基於 XML 的配置
休眠配置文件
<hibernate-configuration>
	<session-factory>

    	<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
    	<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    	<property name="connection.url">jdbc:oracle:thin:@localhost:1521:supershop</property>
    	<property name="connection.username">root</property>
    	<property name="connection.password">secret</property>
    	<property name="hibernate.show_sql ">true</property>
    	<property name="hbm2ddl.auto">update</property>

	</session-factory>
</hibernate-configuration>

在這兩個示例中,我們看到具有相同值的相同設置。只是第一個示例將它們表示為屬性文件,第二個示例表示為xml 文件

這些設置分為三組:

  1. 指定 DBMS 的類型
    • 指定方言(DBMS 類型),例如 Oracle 9.0
    • 指定用於使用此 DBMS 的 JDBC 驅動程序的名稱
  2. 在數據庫中指定授權數據
    • 數據庫地址
    • 用戶名
    • 密碼
  3. 配置休眠引擎
    • hibernate.show_sql- Hibernate 將在控制台中復制它執行的所有請求
    • hbm2ddl.auto- Hibernate 將在必要時更改數據庫結構

還有第三種設置配置的方法 - 通過 bins。一般是和Spring配合使用,所以我們學習SpringFramework的時候再看。

3.3 獲取會話工廠

下一步是獲取 SessionFactory 對象。做這件事有很多種方法:

第一種方法是使用 hibernate.properties 文件

為此,您只需編寫以下代碼:

SessionFactory sessionFactory = new Configuration().buildSessionFactory();

如果在當前項目目錄下沒有找到hibernate.properties文件,則會拋出異常。

第二種方式是使用 hibernate.cfg.xml 進行配置

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

如果您編寫這樣的代碼,那麼hibernate.cfg.xml. 如果沒有找到這樣的文件,該方法buildSessionFactory()將拋出異常。

第三種方式是手動設置配置文件

有時在開發過程中有必要切換到測試基地或更改一些其他設置以使用基地,為此您可以手動設置配置文件:

SessionFactory sessionFactory = new Configuration().configure("hibernate-dev.cfg.xml").buildSessionFactory();

方法四——我們使用自定義的 hibernate.properties 文件:

ClassLoader classLoader = Thread.currentThread().getClassLoader();

Properties properties = new Properties();
properties.load(classLoader.getResourceAsStream("hibernate-dev.properties"));

SessionFactory sessionFactory = new Configuration()
            .addProperties(properties)
            .buildSessionFactory();

最後,您可以簡單地將所有必要的參數直接縫入代碼中:

Properties properties = new Properties();
properties.put(Environment.DRIVER, "com.mysql.jdbc.Driver");
properties.put(Environment.URL, "jdbc:mysql://localhost:3306/supershop");
properties.put(Environment.USER, "root");
properties.put(Environment.PASS, "password");

SessionFactory sessionFactory = new Configuration()
            .setProperties(properties)
            .buildSessionFactory();

3.4 指定在哪裡尋找實體類

但這還不是全部。當我們在 Hibernate 中配置一個SessionFactory對象時,這個SessionFactory檢查數據庫中是否存在所有具有所需列類型的所需表。

為了讓SessionFactory執行此操作,需要將其傳遞到需要映射到數據庫的實體類列表。

可以通過三種方式傳遞實體類列表:

方法一。添加hibernate.cfg.xml一行:

<mapping class="class-qualified-name" />

例子:

<mapping class="com.codegym.data.User" />
<mapping class="com.codegym.data.Employee" />
<mapping class="com.codegym.data.Task" />

方法二。調用Configuration對像上的方法addAnnotatedClass()。例子:

SessionFactory sessionFactory = new Configuration()
   	.configure()
   	.addAnnotatedClass(com.codegym.data.User.class)
   	.buildSessionFactory();

如果有很多類,那麼你可以將它們添加到整個包中:

SessionFactory sessionFactory = new Configuration()
   	.configure()
   	.addPackage("com.codegym.data")
   	.buildSessionFactory();

3.5 最後的例子

現在我們已經了解瞭如何配置 SessionFactory 對象,讓我們編寫將使用它的代碼。

它將包括三個方法:

  1. 配置休眠
  2. 從數據庫中獲取所有員工的方法
  3. 將新員工保存到數據庫的方法

此代碼模板看起來像這樣:

class EmployeeManager {
    private SessionFactory sessionFactory;

    public void class init() {
    	this.sessionFactory = new Configuration()
        	.configure()
        	.buildSessionFactory();
   }

   public List<Employee> getAllEmployes() {
         try (Session session = sessionFactory.openSession()) {
  	          Query<Employee> query = session.createQuery("from Employee", Employee.class);
    	        return query.list();
         }
   }

   public void addEmployee(Employee employee ) {
     	try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
       	    session.save(employee);
            transaction.commit();
     	}
   }
}

在對數據庫執行查詢之前,您需要創建一個單獨的會話。如果請求是相關的,那麼它們可以在同一個會話中執行。如果請求不相關(並且它們之間可以經過幾分鐘),那麼他們需要進行自己的會話。

如果你想從數據庫中讀取數據或執行複雜的查詢,你必須首先創建一個 Query 對象並用它來執行你的查詢。

此外,對數據庫的每個查詢都在其自己的事務中執行。您需要打開它,執行必要的操作,然後關閉(提交)。

在接下來的課程中,我們將更詳細地分析這一切是如何工作的。