在Hibernate中,存在單行提取的概念。為了從相應的資料庫表中獲取單一行,我們會選擇使用get()或load()。
get()
get()總是直接訪問資料庫。
如果找到序列化ID,則我們將獲得相應的詳細信息。
示例
SwingBowlers swingBowlers = (SwingBowlers) openSession.get(SwingBowlers.class,1);
序列化ID為1(jerSeyNo)–>主鍵
若可序列化ID 未找到,則返回結果為null。load()
load() 始終創建一個代理對象。 若可序列化ID存在,則返回相應詳情。
示例
SwingBowlers swingBowlers = (SwingBowlers) openSession.get(SwingBowlers.class,1);
System.out.println(swingBowlers);
可序列化ID為1(jerSeyNo)–>主鍵
若找不到可序列化的ID,則會得到一個結果:org.hibernate的ObjectNotFoundException異常。
檢查是否仍會生成查詢,即使我們使用的是load方法,因為我們正嘗試打印對象詳情[如System.out.println(swingBowlers);]。但這僅源自代理對象[虛擬對象]。
讓我們實際看看這個情況。
HibernateTutorialRun.java
package com.blogspot.javacodebypj;
import com.blogspot.javacodebypj.dao.SwingBowlersDaoImpl;
public class HibernateTutorialRun {
public static void main(String[] args) {
SwingBowlersDaoImpl sbdi = new SwingBowlersDaoImpl();
sbdi.getSwingBowlers();
}
}
說明:HibernateTutorialRun是一個用於運行HibernateTutorial應用程序的類,我們在無需服務器的情況下使用它。Hibernate可以配合服務器運行,也可以獨立運行。我們創建了主方法,在其中僅為相應的類SwingBowlersDaoImpl創建了一個對象。接著,我們僅使用該對象引用調用了相應的方法。
SwingBowlersDao.java
package com.blogspot.javacodebypj.dao;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.blogspot.javacodebypj.domain.SwingBowlers;
import com.blogspot.javacodebypj.util.HibernateUtil;
public class SwingBowlersDaoImpl implements SwingBowlersDao {
@Override
public void getSwingBowlers() {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session openSession = sessionFactory.openSession();
// 使用load方法
SwingBowlers swingBowlers = (SwingBowlers) openSession.load(SwingBowlers.class, 1);
System.out.println(swingBowlers);
}
}
解釋:我們剛創建了SwingBowlersDaoImpl類並將其實現為SwingBowlersDao,並將覆蓋相應的方法。我們正嘗試調用HibernateUtil類的方法,即getSessionFactory方法,我們將獲得SessionFactory對象,並通過SessionFactory對象引用,調用openSession方法。接著,我們將獲得Session對象。
一旦我們透過此會話獲取了Session對象,我們可以選擇使用load方法或是get方法,並且我們只需將其轉型為對應的類別,這是因為load方法或get方法返回的是Object。希望您了解Java中的向上轉型與向下轉型的概念。
SwingBowlers.java
package com.blogspot.javacodebypj.domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class SwingBowlers {
@Id
@Column(length = 3)
private int jerseyNo;
@Column(length = 15)
private String bowlerName;
@Column(length = 10)
private String country;
public int getJerseyNo() {
return jerseyNo;
}
public void setJerseyNo(int jerseyNo) {
this.jerseyNo = jerseyNo;
}
public String getBowlerName() {
return bowlerName;
}
public void setBowlerName(String bowlerName) {
this.bowlerName = bowlerName;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
@Override
public String toString() {
return "SwingBowlers [jerseyNo=" + jerseyNo + ", bowlerName=" + bowlerName + ", country=" + country + "]";
}
}
說明:由於我們正在將字段映射到數據庫列。如果字段名與數據庫表中的列名相同,則無需在註解層次寫入列名值。同樣,表名也與類名相同SwingBowlers因此,這就是我們沒有使用@Table註解的原因。為了使其成為領域類,我們在相應類的頂部使用@Entity註解。
HibernateUtil.java
package com.blogspot.javacodebypj.util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory sessionFactory;
private HibernateUtil() {
}
public static SessionFactory getSessionFactory() {
if (sessionFactory == null) {
Configuration conf = new Configuration().configure();
sessionFactory = conf.buildSessionFactory();
}
return sessionFactory;
}
}
說明:我們只是創建了SessionFactory作為單例類。
hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver
</property>
<property name="connection.url">jdbc:mysql://localhost:3306/cricketer</property>
<property name="connection.username">root</property>
<property name="connection.password">myRoot4*</property>
<property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<mapping class="com.blogspot.javacodebypj.domain.SwingBowlers" />
</session-factory>
</hibernate-configuration>
說明:在此文件中,我們有三個部分:
- 資料庫相關屬性
- Hibernate相關屬性
- 映射類別
如您所知,我們並未使用Hibernate映射XML文件,因此僅提及映射類別。
方言:用於根據資料庫生成查詢。本應用中,我們使用MySQL資料庫。
show_sql:生成查詢後,我們需要查看這些查詢,因此需將其設為true。
pom.xml
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.blogspot.javacodebypj</groupId>
<artifactId>HibernateTutorial</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>HibernateTutorial</name>
<description>HibernateTutorial by Ponnam Jay</description>
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.14.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
</dependencies>
</project>
解釋:我們剛透過Eclipse IDE生成了這個Maven專案結構,作為一個簡單的Maven專案。我們添加了如hibernate-core、mysql-connector-java等依賴,並使用Java 1.8,這些都可以在pom.xml的屬性部分中看到目標和來源。
資料庫詳情
結論
如果你想提取(檢索)單一行(單一記錄),那麼你可以使用get方法[或]load方法。