Hibernate對資料庫結構提供了較為完整的封裝,Hibernate的O/R Mapping實現了POJO 和資料庫表之間的映射,以及SQL 的自動生成和執行。程式員往往只需定義好了POJO 到資料庫表的映射關係,即可通過Hibernate 提供的方法完成持久層操作。程式員甚至不需要對SQL 的熟 ...
Hibernate對資料庫結構提供了較為完整的封裝,Hibernate的O/R Mapping實現了POJO 和資料庫表之間的映射,以及SQL 的自動生成和執行。程式員往往只需定義好了POJO 到資料庫表的映射關係,即可通過Hibernate 提供的方法完成持久層操作。程式員甚至不需要對SQL 的熟練掌握, Hibernate/OJB 會根據制定的存儲邏輯,自動生成對應的SQL 並調用JDBC 介面加以執行。
今天我們就一起對Hibernate的應用初步進行一下學習。
首先公欲善其事必先利其器,為了更方便我們書寫Hibernate的配置文件,我們這裡需要為我們的eclipse安裝一個Hibernate Tools的插件,這樣就可以很方便的讓我們完成Hibernate的配置文件編寫。
這裡我採用的是線上安裝:
1.啟動eclipse
2.選擇Help > Install New Software...>
3.添加如下地址:http://download.jboss.org/jbosstools/updates/stable/helios/
4.選擇性安裝:hibernate tools在All Jboss tools節點下麵
到這裡我們的Hibernate Tools就算安裝好了,接下來我們就可以通過eclipse很方便的生成相應的配置文件
接下來我們創建一個Java工程,然後將我們的下載好的hibernate JAR包文件導入,這裡個人建議大家將這些JAR包添加為一個新的User Liberary,方便以後我們在其他項目中調用,這裡我們現在只是為了初步探究Hibernate的使用,這裡我們只需要將必要的JAR包文件導入即可,
解壓我們下載的Hibernate壓縮包,裡面有一個lib文件夾,顧名思義,這就是我們會用的JAR包文件,文件裡面有很多子目錄,我們現在只需要將required文件夾下的JAR包文件導入即可。
導入過hibernate JAR包後,一定要記得導入我們的資料庫驅動JAR包,還有就是為了方便我們測試,這裡我使用的是Junit單元測試工具,需要一併導入相應的JAR包文件。
導入後所有的JAR包文件後,我們就可以開始我們的代碼編寫了,首先我們需要創建一個Hibernate配置文件:hibernate.cfg.xml
創建好我們的Hibernate的配置文件後,打開,添加資料庫連接驅動地址+資料庫連接用戶名+資料庫連接密碼+資料庫連接地址+資料庫方言等等。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 資料庫驅動地址 --> <property name="connection.driver_class">org.gjt.mm.mysql.Driver</property> <!-- 數據連接用戶名 --> <property name="connection.username">root</property> <!-- 資料庫連接密碼 --> <property name="connection.password">123456</property> <!--設置資料庫的連接url:jdbc:mysql://localhost/hibernate,其中localhost表示mysql伺服器名稱,此處為本機,hibernate是資料庫名--> <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property> <!-- 資料庫方言 --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 控制台列印sql語句 --> <property name="show_sql">true</property> <!-- 控制台格式化輸出sql語句 --> <property name="format_sql">true</property> <!-- 資料庫生產策略 --> <property name="hbm2ddl.auto">update</property> <!-- 如果使用的是本地事務(jdbc事務) --> <!-- <property name="current_session_context_class">thread</property> --> <!-- 如果使用的是本地事務(JTA事務) --> <!-- <property name="current_session_context_class">jta</property> --> </session-factory> </hibernate-configuration>
有了Hibernate的配置文件接下來我們就要創建我們的實例對象和資料庫映射文件xx.hbm.xml
這裡我通過創建學生對象和大家一起熟悉這個過程:
/** * 創建一個實體類 * @author gaoshang */ public class Student { //不帶參數的構造方法 public Student(){} private int id;//學生I private String name;//學生姓名 private int birthday;//學生出生年月 private String home;//學生住宅 private Date joinTime;//學生入學時間 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getBirthday() { return birthday; } public void setBirthday(int birthday) { this.birthday = birthday; } public String getHome() { return home; } public void setHome(String home) { this.home = home; } public Date getJoinTime() { return joinTime; } public void setJoinTime(Date joinTime) { this.joinTime = joinTime; } //學生對象的ToString方法 public String toString() { return "Student [id=" + id + ", name=" + name + ", birthday=" + birthday + ", home=" + home + ", joinTime=" + joinTime + "]"; } //帶參數的構造方法 public Student(int id, String name, int birthday, String home, Date joinTime) { super(); this.id = id; this.name = name; this.birthday = birthday; this.home = home; this.joinTime = joinTime; } }
接下來創建我們的資料庫映射文件xx.hbm.xml:
點擊next,選擇我們的實例對象,點擊finash完成。最後eclispe就可以幫我們的生產一個Student學生類對於的資料庫映射文件:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2017-2-15 14:17:57 by Hibernate Tools 3.5.0.Final --> <hibernate-mapping> <class name="hibernate.Student" table="STUDENT"> <id name="id" type="int"> <column name="ID" /> <generator class="assigned" /> <!-- generator:屬性的生成策略 --> <!-- assigned:通過賦值的形式進行設置 --> <!-- native:自動生成,從0或1開始編號 --> <!-- uuid:使用uuid進行生成 --> </id> <property name="name" type="java.util.String" length="10"> <column name="NAME" /> </property> <property name="birthday" type="int"> <column name="BIRTHDAY" /> </property> <property name="home" type="java.util.String" length="10"> <column name="HOME" /> </property> <property name="joinTime" type="java.util.Date"> <column name="JOINTIME" /> </property> </class> </hibernate-mapping>
到這裡我們的Hibernate配置就算完成了。下麵我們來通過使用Junit單元測試工具進行持久化操作。
package hibernate; import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * Junit做單元測試時,測試方法不能使用private修飾,否則會報method initializationerror not found * 解決方法:http://www.cnblogs.com/sxdcgaq8080/p/5649819.html * @author gaoshang */ public class StudentTest { private SessionFactory sessionFactory; private Session session; private Transaction transaction; @Before public void init(){ System.out.println("Junit測試配置"); /** * hibernate4.x創建SessionFactory */ //創建配置對象 //Configuration configraction = new Configuration().configure(); //創建會話工廠對象回調 //ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configraction.getProperties()).buildServiceRegistry(); //創建會話工廠 //sessionFactory = configraction.buildSessionFactory(serviceRegistry); /** * hibernate5.x創建SessionFactory */ //創建會話工廠對象回調 final StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();// 使用hibernate.cfg.xml進行配置 //創建會話工程 sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory(); //創建session對象 session = sessionFactory.openSession(); //創建事物對象 transaction = session.beginTransaction(); } @After public void close(){ System.out.println("Junit測試完成"); if(transaction!=null) transaction.commit();//提交事物,hibernate是事物驅動的,只有提交事物才能完成持久化操作 if(session!=null) session.close();//關閉session對象 if(sessionFactory!=null) sessionFactory.close();//關閉sessionFactory對象 } @Test public void run(){ System.out.println("Junit測試"); Student s = new Student(1, "hpu", 24, "河南", new Date());//創建學生對象 session.save(s);//提交持久化操作 } }
最後在奉上一個對學生對象進行增刪改查的完整操作測試類:
package hibernate; import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; public class StudentManagerTest { private SessionFactory sessionFactory; private Session session; private Transaction transaction; @After public void close(){ if(transaction!=null) transaction.commit(); if(session!=null) session.close(); if(sessionFactory!=null) sessionFactory.close(); } @Before public void init(){ final StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build(); sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory(); session = sessionFactory.openSession(); transaction = session.beginTransaction(); } @Test public void saveStudent(){ Student s = new Student(1, "123", 45, "中國", new Date()); session.save(s); } @Test public void updateStudent(){ Student s = new Student(1, "123", 20, "china", new Date()); session.update(s); } @Test public void delStudent(){ Student s = new Student(); s.setId(3); session.delete(s); } /** * get方法當對象不存在時返回NULL */ @Test public void getStudent(){ System.out.println(session.get(Student.class, 6)); } /** * load方法當對象不存在是報org.hibernate.ObjectNotFoundException */ @Test public void loadStudent(){ System.out.println(session.load(Student.class, 5)); } }
好了,到這裡對於Hibernate的初探就和大家分享完畢,歡迎留言探討一起學習。