hiernate4入門 【實戰】本文將講述hibernate4的入門,我寫是以實用入門為主,不作過多展開,我寫東西如果開頭標了實戰二字,必然會保證讀者能夠獲取源代碼並且能夠按要求做的話一定能跑起來,否則沒有意義。 【環境說明:】 jdk8,eclipse4.7,hibernate4.3.11,mys ...
hiernate4入門
【實戰】本文將講述hibernate4的入門,我寫是以實用入門為主,不作過多展開,我寫東西如果開頭標了實戰二字,必然會保證讀者能夠獲取源代碼並且能夠按要求做的話一定能跑起來,否則沒有意義。
【環境說明:】 jdk8,eclipse4.7,hibernate4.3.11,mysql。
一、什麼是ORM
orm是object relation mapping的一個縮寫,對象關係映射,常見的ORM框架有mybatis,hibernate,此處介紹hibernate,暫時不作比較,從我個人理解來看,java程式員在後臺編寫代碼的過程當中,只有在持久層進行的工作是非OOP思想的,這個時候如果有辦法讓dao層也能夠保持這樣一種編寫習慣無疑是挺舒服的,hibernate要幫助我們完成的核心事情就是這一件,其次就是事務管理,以及緩存之類的東西。
二、hibernate入門實戰
此處我會使用maven來構建項目,同時會使用父子工程的方式來編寫,下麵的一些步驟我會以圖文說明。
1.新建一個maven父項目
註意:由於我們需要將其用作父工程,所以需要修改pom.xml看圖。
如果你的項目報紅色的×,或者jdk版本為1.5,你需要將maven項目update一下即可,maven項目紅×問題經常會有,後面我會專門為此寫一篇博客說明。
另外我們指定一下項目編譯版本為1.8,編碼為UTF-8,pom.xml作出如下修改。
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 5 <groupId>com.qiudaozhang</groupId> 6 <artifactId>hibernate-parent</artifactId> 7 <version>0.0.1-SNAPSHOT</version> 8 <packaging>pom</packaging> 9 10 <name>hibernate-parent</name> 11 <url>http://maven.apache.org</url> 12 13 <properties> 14 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 15 <maven-compiler-plugin.version>3.0</maven-compiler-plugin.version> 16 <java.version>1.8</java.version> 17 </properties> 18 19 <dependencies> 20 </dependencies> 21 22 <build> 23 24 <plugins> 25 <plugin> 26 <groupId>org.apache.maven.plugins</groupId> 27 <artifactId>maven-compiler-plugin</artifactId> 28 <version>${maven-compiler-plugin.version}</version> 29 <configuration> 30 <source>${java.version}</source> 31 <target>${java.version}</target> 32 <encoding>${project.build.sourceEncoding}</encoding> 33 </configuration> 34 </plugin> 35 </plugins> 36 </build> 37 </project>
2.引入hibernate的依賴,mysql的依賴。
修改pom.xml如下:
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 5 <groupId>com.qiudaozhang</groupId> 6 <artifactId>hibernate-parent</artifactId> 7 <version>0.0.1-SNAPSHOT</version> 8 <packaging>pom</packaging> 9 10 <name>hibernate-parent</name> 11 <url>http://maven.apache.org</url> 12 13 <properties> 14 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 15 <maven-compiler-plugin.version>3.0</maven-compiler-plugin.version> 16 <java.version>1.8</java.version> 17 <hibernate.version>4.3.11.Final</hibernate.version> 18 <mysql.version>5.1.38</mysql.version> 19 </properties> 20 21 <dependencies> 22 <dependency> 23 <groupId>org.hibernate</groupId> 24 <artifactId>hibernate-core</artifactId> 25 <version>${hibernate.version}</version> 26 </dependency> 27 <dependency> 28 <groupId>mysql</groupId> 29 <artifactId>mysql-connector-java</artifactId> 30 <version>${mysql.version}</version> 31 </dependency> 32 33 </dependencies> 34 35 <build> 36 37 <plugins> 38 <plugin> 39 <groupId>org.apache.maven.plugins</groupId> 40 <artifactId>maven-compiler-plugin</artifactId> 41 <version>${maven-compiler-plugin.version}</version> 42 <configuration> 43 <source>${java.version}</source> 44 <target>${java.version}</target> 45 <encoding>${project.build.sourceEncoding}</encoding> 46 </configuration> 47 </plugin> 48 </plugins> 49 </build> 50 </project>
3 新建maven子項目(因為我會以多個工程的方式來描述它的知識點,儘量不讓描述問題混亂,雖然有點啰嗦,但是其實好處很多)
子項目可以直接使用父項目的依賴,後面我建hibernate項目就不需要重覆寫依賴了。
按照maven約定,我們需要有專門放配置文件的地方,如果你的沒有請如下圖操作。
然後填寫
4 編寫hibernate的核心配置文件hibernate.cfg.xml將其放在resources目錄下。
核心需要配置的就是會話工廠,裡面有幾樣核心內容配置:
- 資料庫連接的描述信息
- sql是否列印,是否格式化
- 是否根據實體類生成表。
具體的配置內容如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <!-- 一、資料庫連接相關信息 --> 8 <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property> 9 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 10 <property name="hibernate.connection.username">root</property> 11 <property name="hibernate.connection.password">111111</property> 12 <!-- 二、SQL顯示與格式化 --> 13 <!-- 顯示SQL語句 --> 14 <property name="hibernate.show_sql">true</property> 15 <!-- 格式化SQL --> 16 <property name="hibernate.format_sql">true</property> 17 <!-- 三、 是否根據javabean生成資料庫的實體類,前提你得有這個資料庫 --> 18 <!-- 常用的值是create,update,或者不配置, create每次回刪除重建,update是有修改的話才會重建,第一次我們可以使用create,後期一般就不會再配置 19 了。 --> 20 <property name="hibernate.hbm2ddl.auto">create</property> 21 </session-factory> 22 </hibernate-configuration>
5 編寫javabean,此處就以一個Users為例。
1 package com.qiudaozhang.model; 2 3 import java.io.Serializable; 4 import java.util.Date; 5 6 public class Users implements Serializable{ 7 8 /** 9 * 10 */ 11 private static final long serialVersionUID = -7790992747243804816L; 12 13 private Integer id; 14 15 private String username; 16 17 private String password; 18 19 private Date birthday; 20 21 public Integer getId() { 22 return id; 23 } 24 25 public void setId(Integer id) { 26 this.id = id; 27 } 28 29 public String getUsername() { 30 return username; 31 } 32 33 public void setUsername(String username) { 34 this.username = username; 35 } 36 37 public String getPassword() { 38 return password; 39 } 40 41 public void setPassword(String password) { 42 this.password = password; 43 } 44 45 public Date getBirthday() { 46 return birthday; 47 } 48 49 public void setBirthday(Date birthday) { 50 this.birthday = birthday; 51 } 52 53 54 }
6 在於這個Users同包之下書寫一個hbm文件,取名為Users.hbm.xml,建議遵守約定,不要玩個性隨意改名字。
其註意的細節點直接看下麵的代碼:
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <hibernate-mapping> 5 <!-- 下麵的class元素用來描述java實體類與資料庫表之間的關係 --> 6 <!-- class屬性說明: 7 name:編寫實體類的全限定類名,大家應該能想到是使用反射方式來獲取它的信息。 8 table:資料庫表名。 9 --> 10 <class name="com.qiudaozhang.model.Users" table="users"> 11 <!-- id,必須說明欄位當中哪個欄位與資料庫的主鍵對應 12 屬性說明: 13 name:javabean中要對應資料庫逐漸的欄位 14 type:javabean主鍵欄位對應的數據類型 15 內部元素說明: 16 column:對應資料庫主鍵的列 17 name:資料庫主鍵列名 18 generator:主鍵的策略,這裡使用assgined是手工賦值的意思,有很多種,我們暫時就使用它。 19 --> 20 <id name="id" type="java.lang.Integer"> 21 <column name="ID" /> 22 <generator class="assigned" /> 23 </id> 24 <!-- property元素用來描述其它普通欄位與資料庫列的關係,name,type等於上面描述的內容同樣含義 --> 25 <property name="username" type="java.lang.String"> 26 <column name="USERNAME" /> 27 </property> 28 <property name="password" type="java.lang.String"> 29 <column name="PASSWORD" /> 30 </property> 31 <property name="birthday" type="java.util.Date"> 32 <column name="BIRTHDAY" /> 33 </property> 34 </class> 35 </hibernate-mapping>
7 創建一個資料庫hibernate。
8 將書寫的Users.hbm.xml加入到前面配置的核心hibernate.cfg.xml當中,否則無法生效,修改後的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://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <!-- 一、資料庫連接相關信息 --> 8 <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property> 9 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 10 <property name="hibernate.connection.username">root</property> 11 <property name="hibernate.connection.password">111111</property> 12 <!-- 二、SQL顯示與格式化 --> 13 <!-- 顯示SQL語句 --> 14 <property name="hibernate.show_sql">true</property> 15 <!-- 格式化SQL --> 16 <property name="hibernate.format_sql">true</property> 17 <!-- 三、 是否根據javabean生成資料庫的實體類,前提你得有這個資料庫 --> 18 <!-- 常用的值是create,update,或者不配置, create每次回刪除重建,update是有修改的話才會重建,第一次我們可以使用create,後期一般就不會再配置 19 了。 --> 20 <property name="hibernate.hbm2ddl.auto">create</property> 21 22 <!-- 引入配置的hbm文件 --> 23 <mapping resource="com/qiudaozhang/model/Users.hbm.xml"/> 24 </session-factory> 25 </hibernate-configuration>
9 編寫測試類(為了方便測試,請添加一下junit4),需要註意的是,hibernate4獲取會話工廠有點不一樣,而且官方文檔是錯誤的,所以大家要註意一下。
1 package com.qiudaozhang.test; 2 3 import java.util.Date; 4 5 import org.hibernate.Session; 6 import org.hibernate.SessionFactory; 7 import org.hibernate.Transaction; 8 import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 9 import org.hibernate.cfg.Configuration; 10 import org.junit.Test; 11 12 import com.qiudaozhang.model.Users; 13 14 public class Test1 { 15 16 @Test 17 public void helloHibernate() { 18 // 1 獲取核心的配置對象 19 Configuration cfg = new Configuration(); 20 // 2 調用配置方法讓其讀取我們配置的hibernate.cfg.xml 21 cfg.configure(); 22 // 3 獲取一個服務註冊建造者對象 23 StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder() 24 .applySettings(cfg.getProperties()); 25 // 4 創建會話工廠 26 SessionFactory sessionFactory = null; 27 sessionFactory = cfg.buildSessionFactory(builder.build()); 28 // 5 獲取會話 29 Session session = null; 30 session = sessionFactory.openSession(); 31 // 6 獲取事務對象 32 Transaction tx = session.beginTransaction(); 33 // 7 準備一個javabean 34 Users u = new Users(); 35 u.setId(1008); 36 u.setUsername("王菲"); 37 u.setPassword("123123"); 38 u.setBirthday(new Date()); 39 // 8 通過會話保存這個對象 40 session.save(u); 41 // 9 提交事務 42 tx.commit(); 43 // 10 關閉資源 44 if(session != null && session.isOpen()) { 45 session.close(); 46 } 47 48 if(sessionFactory != null) { 49 sessionFactory.close(); 50 } 51 52 } 53 54 55 }
執行測試方法,在資料庫中如果你看到了“王菲”,那就代表成功了,我沒有對大家每個地方有多個選擇的地方做出說明,在學習之處過多讓你選擇,你的學習將奇慢無比,後面我們會展開細說。
代碼在碼雲上可直接下載,地址: 項目下載