今天忙了一成天,終於搭建好了個人第一個Hibernate程序,中間關於hibernate.cfg.xml的問題搞了半天,不過最後仍是搞明白了,下面來說一講過程。java
首先在你的eclipse中安裝Hibernate Tools插件方便建立cfg.cml與hbm.xml文件。而後建立配置hibernate.cfg.xml文件:mysql
奧添加yi程序員
固然在最前面還要添加hibernate jar包,musql driver等,因爲我使用maven管理項目,所以直接在maven的pom文件中添加就能夠了。sql
在hibernate.cfg.xml中還要添加一些東西:數據庫
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory name="HibernateSessionFactory"> 7 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 8 <property name="hibernate.connection.password">admin</property> 9 <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?characterEncoding=utf-8</property> 10 <property name="hibernate.connection.username">root</property> 11 <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 12 <!-- 在控制檯輸出SQL語句 --> 13 <property name="show_sql">true</property> 14 <!-- Hibernate啓動時自動建立表結構 --> 15 <property name="hbm2ddl.auto">create</property> 16 <!-- 不加 可能出現異常 --> 17 <property name="current_sesson_context_class">thread</property> 18 <!-- 指定Cat類爲Hibernate實體類 --> 19 <mapping resource="config/Cat.hbm.xml"/> 20 </session-factory> 21 </hibernate-configuration>
第九行url後面的 hibernate?characterEncoding=utf-8 是hibernate要操做的數據庫名稱,須要你本身先建立:api
create database hibernate character set 'utf8'
19行Cat類是須要你本身建立的POJO實體類,實體類(Entity)是指與數據庫有映射關係的Java類使用@Entity後Cat就被申明爲了一個實體類。實體類還需配置對應的表名(@Table),主鍵(@Id),普通屬性(@Column)對應列名等。session
1 package com.lxiao.model; 2 3 4 import java.util.Date; 5 6 import javax.persistence.Column; 7 import javax.persistence.Entity; 8 import javax.persistence.GeneratedValue; 9 import javax.persistence.GenerationType; 10 import javax.persistence.Id; 11 import javax.persistence.JoinColumn; 12 import javax.persistence.ManyToOne; 13 import javax.persistence.Table; 14 import javax.persistence.Temporal; 15 import javax.persistence.TemporalType; 16 17 @Entity 18 @Table(name="tb_cat") 19 public class Cat { 20 21 @Id 22 @GeneratedValue(strategy = GenerationType.AUTO) 23 private Integer Id; 24 25 @Column(name = "name") 26 private String name; 27 28 @Column(name = "description") 29 private String description; 30 31 @Column(name = "age") 32 private Integer age; 33 34 @Column(name="sex") 35 private String sex; 36 37 @ManyToOne 38 @JoinColumn(name = "mother_id") 39 private Cat mother; 40 41 @Temporal(TemporalType.TIMESTAMP) 42 @Column(name = "createDate") 43 private Date createDate; 44 45 public Integer getId() { 46 return Id; 47 } 48 49 public void setId(Integer id) { 50 Id = id; 51 } 52 53 public String getName() { 54 return name; 55 } 56 57 public void setName(String name) { 58 this.name = name; 59 } 60 61 public String getDescription() { 62 return description; 63 } 64 65 public void setDescription(String description) { 66 this.description = description; 67 } 68 69 public Integer getAge() { 70 return age; 71 } 72 73 public void setAge(Integer age) { 74 this.age = age; 75 } 76 77 public String getSex() { 78 return sex; 79 } 80 81 public void setSex(String sex) { 82 this.sex = sex; 83 } 84 85 public Cat getMother() { 86 return mother; 87 } 88 89 public void setMother(Cat mother) { 90 this.mother = mother; 91 } 92 93 public Date getCreateDate() { 94 return createDate; 95 } 96 97 public void setCreateDate(Date createDate) { 98 this.createDate = createDate; 99 } 100 101 }
值得一提的是,該POJO類在定義玩le私有變量後,能夠用eclipse自動生成getter,setter方法,免去了手寫的枯燥。app
而後建立Cat.hbm.xml文件,添加你的POJO類,我這裏就是Cat,使用Hibernate tools工具建立時選擇添加類,框架
而後一路next就能夠了,最後就在hibernte.cfg.xml中就能夠配置實體類了,用<mapping resource="config/Cat.hbm.xml">,這是針對xml文件配置,若是是@註解配置,使用<maping class="com.lxiao.model.Cat">eclipse
而後咱們寫一個HibernateUtil類來加載config文件hibernate.cfg.xml:
1 package com.lxiao.hibernate; 2 3 import org.hibernate.SessionFactory; 4 import org.hibernate.cfg.Configuration; 5 6 public class HibernateUtil { 7 private static final SessionFactory factory; 8 9 static{ 10 try{ 11 factory = new Configuration().configure("config/hibernate.cfg.xml").buildSessionFactory(); 12 }catch(Throwable e){ 13 System.out.println("Initial sesionFactory failed..."+e); 14 throw new ExceptionInInitializerError(e); 15 } 16 } 17 18 public static SessionFactory getSessionFactory(){ 19 return factory; 20 } 21 }
加載xml配置的實體類要使用Configuration加載Hibernate配置。
最後咱們要使用一下Cat類,讓Hibernate自動爲咱們建立表,執行相應數據庫操做。這整個流程是:Hibernate保存數據是,先經過sesonFactory開啓一個session會話(做用至關於JDBC中的Connection),而後開啓一個事務(Transaction),而後保存代碼,提交事務,關閉session。其它數據庫操做也是相似的。下面是個人程序:
1 package com.lxiao.hibernate; 2 3 import java.awt.Font; 4 import java.util.Date; 5 import java.util.List; 6 7 import javax.swing.JOptionPane; 8 9 import org.hibernate.Session; 10 import org.hibernate.Transaction; 11 12 import com.lxiao.model.Cat; 13 14 public class CatTest { 15 public static void main(String[] args){ 16 Cat motherCat = new Cat(); 17 motherCat.setName("Mary White"); 18 motherCat.setDescription("The mama cat..."); 19 motherCat.setCreateDate(new Date()); 20 21 Cat kitty = new Cat(); 22 kitty.setMother(motherCat); 23 kitty.setName("Kitty"); 24 kitty.setDescription("Hello Kitty"); 25 kitty.setCreateDate(new Date()); 26 27 Cat mimmy = new Cat(); 28 mimmy.setMother(motherCat); 29 mimmy.setName("Mimmy"); 30 mimmy.setDescription("Kitty's little twn sister"); 31 mimmy.setCreateDate(new Date()); 32 33 Session session = HibernateUtil.getSessionFactory().openSession();//開啓一個Hibernate對話 34 Transaction transaction = session.beginTransaction(); 35 36 session.persist(motherCat);//將mother保存進數據庫 37 session.persist(kitty); 38 session.persist(mimmy); 39 40 List<Cat> catlist = session.createQuery(" from Cat ").list(); 41 42 StringBuffer resultBuffer = new StringBuffer(); 43 resultBuffer.append("All cat in db: \r\n\r\n"); 44 45 for(Cat cat : catlist){ 46 resultBuffer.append("Cat: "+cat.getName()+", "); 47 resultBuffer.append("Mothercat: "+(cat.getMother() == null ? "no record" : cat.getMother().getName())); 48 resultBuffer.append("\r\n"); 49 } 50 transaction.commit();//提交事務 51 session.close();//關閉數據庫 52 53 JOptionPane.getRootFrame().setFont(new Font("Arial",Font.BOLD,14)); 54 JOptionPane.showMessageDialog(null, resultBuffer.toString()); 55 56 57 } 58 }
運行結果:
我在數據庫的查詢結果以下:
在hibernate.cfg.xml配置文件中,咱們有:
1 <!-- Hibernate啓動時自動建立表結構 --> 2 15 <property name="hbm2ddl.auto">create</property>
每次Hibernate會先刪掉表而後再建立表。
最後放上個人項目目錄結構:
總之個人第一個Hibernate程序總算是能夠運行了,也瞭解了很多Hiernate這個ORM框架的東西,它給開發中關於數據庫操做帶來了不少便利,很值得學習,瞭解。
--程序員的道路漫漫,繼續努力。。。
參考書籍:Java Web開發王者歸來,劉京華編著。