從零開始Hibernate實戰篇:(四篇實戰代碼,循序漸進,註意事項和學習內容在代碼註釋裡面,面向有一定基礎的同學使用) 第一篇:基礎篇(搭建) Hibernate開發基本步驟: 1.導入jar包(hibernate-release-5.0.7.Final\lib的文件裡面去找所需要的jar包) 2 ...
從零開始Hibernate實戰篇:(四篇實戰代碼,循序漸進,註意事項和學習內容在代碼註釋裡面,面向有一定基礎的同學使用)
第一篇:基礎篇(搭建)
Hibernate開發基本步驟:
1.導入jar包(hibernate-release-5.0.7.Final\lib的文件裡面去找所需要的jar包)
2.寫實體類+實體類的映射文件
User.java
/** * Project Name:hibernate_demo * File Name:User.java * Package Name:cn.itcast.entity * */ package cn.itcast.entity; /** * @author zhouP * @version * @see */ public class User { // hibernate要求實體類有一個屬性唯一的 private int uid; private String username; private String password; private String address; public void setUid(int uid) { this.uid = uid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public int getUid() { return uid; } }
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <!-- 1.配置類和表對應 class屬性:實體類全路徑(類路徑) table屬性:資料庫表名稱 --> <class name="cn.itcast.entity.User" table="t_user"> <!-- 2.配置實體類id與表id對應 hibernate要求實體類有一個屬性唯一值 hibernate要求表有欄位作為唯一值 --> <!-- id標簽 name屬性:實體類裡面id屬性名稱 column屬性:生成的表欄位名稱 --> <id name="uid" column="uid"> <!-- 配置資料庫表id的增長策略 native:主鍵自動增長 --> <generator class="native"></generator> </id> <!-- 配置其他屬性和表欄位對應 name屬性:實體類屬性名稱 column屬性:生成表欄位名稱 --> <property name="username" column="username"></property> <property name="password" column="password"></property> <property name="address" column="address"></property> </class> </hibernate-mapping>
3.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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate_test</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <!-- 第二部分:配置hibernate信息(可選的) --> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <!-- 兩個重要配置ddl、dialect(分頁時用) --> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 第三部分:把映射文件放到核心配置文件中(必須的)(文件路徑) --> <mapping resource="cn/itcast/entity/User.hbm.xml"/> </session-factory> </hibernate-configuration>
4.編寫Hibernate工具類
package cn.itcast.utils; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils { // 創建sessionFactory的過程,特別浪費資源,建議一個項目一般創建一個sessionFactory對象 // static Configuration cfg = null; static SessionFactory sessionFactory = null; // 靜態代碼塊實現 static { // cfg = new Configuration(); // cfg.configure(); // sessionFactory = cfg.buildSessionFactory(); sessionFactory = new Configuration().configure().buildSessionFactory(); } // 提供方法返回sessionFactory public static SessionFactory getSessionFactory() { return sessionFactory; } }
5.測試代碼
package cn.itcast.hibernatetest; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.junit.Test; import cn.itcast.entity.User; import cn.itcast.utils.HibernateUtils; public class HibernateDemo { @Test public void testAdd() { // 第一步:載入hibernate核心配置文件 // Configuration cfg = new Configuration(); // cfg.configure(); // 第二步:創建SessionFactory對象 // SessionFactory sessionFactory = cfg.buildSessionFactory(); SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 第三步:使用SessionFactory創建session對象 Session session = sessionFactory.openSession(); // 第四步:開啟事務 Transaction tx = session.beginTransaction(); // 第五步:寫具體的邏輯 curd操作 // 添加功能 User user = new User(); user.setUsername("Mr Li"); user.setPassword("1234"); user.setAddress("武漢"); // 調用session的方法實現添加 session.save(user); // 第六步:提交事務 tx.commit(); // 第七步:關閉資源 session.close(); sessionFactory.close(); } }
第二篇:Hibernate API 練習篇
1.創建項目(略)2.導入jar包(略)3.實體類+其映射文件(略)
4.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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate_test2</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 在hibernate核心配置文件中配置 --> <property name="hibernate.current_session_context_class">thread</property> <!-- 把映射文件放到hibernate核心配置文件當中 --> <mapping resource="cn/itcast/entity/User.cfg.xml"/> </session-factory> </hibernate-configuration>
5.Hibernate相關測試代碼:
(1)HibernateDemo.java
package cn.itcast.hibernatetest; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.junit.Test; import cn.itcast.entity.User; import cn.itcast.utils.HibernateUtils; public class HibernateDemo { @Test public void testSaveOrUpdate() { // 1.調用工具類得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2.獲取session Session session = sessionFactory.openSession(); // 3.開啟事務 Transaction tx = session.beginTransaction(); // 4.添加操作 // User user = new User(); // user.setUid(1); // user.setUsername("王第一"); // user.setPassword("12345"); // user.setAddress("杏林二小"); // session.save(user); // 把uid=1的記錄username修改 // User user = new User(); // user.setUid(1); // user.setUsername("韓梅梅梅"); // session.save(user);要用update // session.update(user); // User user = session.get(User.class, 2); // user.setAddress("興隆林業局"); // // 實體類對象是持久態,做修改 // session.saveOrUpdate(user); // User user = new User(); // user.setUsername("rose"); // user.setPassword("1314"); // user.setAddress("阿爾巴尼亞"); // session.save(user); // User user = new User(); // user.setUsername("jack"); // user.setPassword("520"); // user.setAddress("北韓"); // session.save(user); User user = new User(); user.setUsername("jack"); user.setPassword("124"); user.setAddress("china"); session.save(user); // 5.提交事務 try { tx.commit(); } catch (Exception e) { tx.rollback(); } finally { // 6.關閉資源 session.close(); sessionFactory.close(); } } @Test public void testDelete() { // 1.利用工具類創建sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2.得到session Session session = sessionFactory.openSession(); // 3.開啟事務 Transaction tx = session.beginTransaction(); // 4.刪除操作 // 第一種刪除方法 // User user = session.get(User.class, 1); // session.delete(user); // 第二種刪除方法 User user = new User(); user.setUid(3); session.delete(user); // 5.提交事務 try { tx.commit(); } catch (Exception e) { tx.rollback(); } finally { // 6.關閉資源 session.close(); sessionFactory.close(); } } @Test public void testUpdate() { // 1.工具類中得到sessionFactory SessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2.得到session Session session = sessionFactory.openSession(); // 3.開啟事務 Transaction tx = session.beginTransaction(); // 4.更新操作(修改uid=2記錄的username值) // 4.1根據id查詢(如果資料庫中沒有此id,執行的是查詢) User user = session.get(User.class, 2); // 4.2向返回的username對象裡面設置修改之後的值 user.setUsername("修改之後的值"); // 4.3調用session的update方法 // 執行過程:到user對象裡面找到uid值,根據uid進行修改 session.update(user); // 5.提交事務 try { tx.commit(); } catch (Exception e) { tx.rollback(); } finally { // 6.關閉資源 session.close(); sessionFactory.close(); } } }
(2)HibernateQueryData.java
package cn.itcast.hibernatetest; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.junit.Test; import cn.itcast.entity.User; import cn.itcast.utils.HibernateUtils; public class HibernateQueryData { // 使用SQLQuery對象 @Test public void testQuery() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { sessionFactory = HibernateUtils.getSessionFactory(); session = sessionFactory.openSession(); tx = session.beginTransaction(); // 創建SQLQuery對象 SQLQuery sqlQuery = session.createSQLQuery("select * from t_user"); // 返回的list中的每部分是對象的形式 sqlQuery.addEntity(User.class); // 調用SQLQuery裡面的方法...導包是:import java.util.List; @SuppressWarnings("unchecked") List<User> list = sqlQuery.list(); // 驗證:當調用SQLQuery方法:返回的list集合,預設裡面每一部分是數組結構 for (User user : list) { System.out.println(user); } // List<Object[]> list = sqlQuery.list(); // // for (Object[] objects : list) { // System.out.println(Arrays.toString(objects)); // } // 提交事務 tx.commit(); } catch (Exception e) { tx.rollback(); } finally { session.close(); sessionFactory.close(); } } // 使用Criteria對象 @Test public void testCriteria() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { sessionFactory = HibernateUtils.getSessionFactory(); session = sessionFactory.openSession(); tx = session.beginTransaction(); // 創建criteria對象 Criteria criteria = session.createCriteria(User.class); @SuppressWarnings("unchecked") List<User> list = criteria.list(); for (User user : list) { System.out.println(user); } tx.commit(); } catch (Exception e) { tx.rollback(); } finally { session.close(); sessionFactory.close(); } } // 使用query對象 @Test public void demoQuery() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { sessionFactory = HibernateUtils.getSessionFactory(); session = HibernateUtils.getSessionobject(); // 開啟事務 tx = session.beginTransaction(); // 1 創建Query對象 Query query = session.createQuery("from User"); // 2 調用query對象裡面的方法得到結果 @SuppressWarnings("unchecked") List<User> list = query.list(); // 遍歷list集合四種: 普通for、增強for、迭代器、list迭代器 // 遍歷set集合兩種:增強for、迭代器 // 遍歷map集合兩種:得到所有key,根據key得到value; 得到key-value關係 for (User user : list) { System.out.println(user); } // 提交事務 tx.commit(); } catch (Exception e) { e.printStackTrace(); tx.rollback(); } finally { session.close(); sessionFactory.close(); } } }
(3)HibernateSelect.java
package cn.itcast.hibernatetest; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.junit.Test; import cn.itcast.entity.User; import cn.itcast.utils.HibernateUtils; public class HibernateSelect { // 事務規範代碼 @Test public void testTx() { Session session = null; Transaction tx = null; try { // 於本地線程綁定的session session = HibernateUtils.getSessionobject(); // 開啟事務 tx = session.beginTransaction(); // 添加 User user = new User(); user.setAddress("華豐"); user.setPassword("789"); user.setUsername("化華"); session.save(user); // 模擬出事情了:java.lang.ArithmeticException: / by zero // 10/0 此時,不能插入數據 tx.commit(); } catch (Exception e) { e.printStackTrace(); tx.rollback(); } finally { // 下麵session不能關閉,JUnit關閉會報錯。可以插入數據。 // org.hibernate.SessionException: Session was already closed // org.hibernate.SessionException: Session was already closed // session.close(); } } // 一級緩存特性 @Test public void testDemo() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { // 1.調用工具類得到sessionFactory sessionFactory = HibernateUtils.getSessionFactory(); // 2.獲取session session = sessionFactory.openSession(); // 3.開啟事務 tx = session.beginTransaction(); // 4.操作:查詢 User user = session.get(User.class, 5); user.setAddress("之前室china,現在是哈爾濱"); session.update(user); // 5.提交事務 tx.commit(); } catch (Exception e) { e.printStackTrace(); tx.rollback(); } finally { // 6.關閉資源 session.close(); sessionFactory.close(); } } // 驗證一級緩存存在 @Test public void testCasch() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { sessionFactory = HibernateUtils.getSessionFactory(); session = sessionFactory.openSession(); tx = session.beginTransaction(); // 1.根據id=2查詢 // 執行第一個get方法是否查詢資料庫,是否發送語句 User user1 = session.get(User.class, 2); System.out.println(user1); // 2.在 根據id查詢 // 執行第二個get方法是否查詢資料庫,是否發送語句 // 結果是!只有一條查詢語句,兩條查詢結果 User user2 = session.get(User.class, 2); System.out.println(user2); tx.commit(); } catch (Exception e) { e.printStackTrace(); tx.rollback(); } finally { session.close(); sessionFactory.close(); } } }
第三篇:Hibernate 一對多、多對多實戰篇
1.cn.itcast.entity包裡面:
(1)Customer.java
package cn.itcast.entity; import java.util.HashSet; import java.util.Set; public class Customer { // 用戶id private Integer cid; // 用戶名稱 private String custName; // 用戶級別 private String custLevel; // 用戶來源 private String custSource; // 聯繫電話 private String custPhone; // 手機 private String custMobile; // 在客戶實體類裡面表示多個聯繫人,一個客戶有多個聯繫人 // hibernate要求使用集合表示多的數據,使用set集合: // import java.util.HashSet;import java.util.Set; private Set<LinkMan> setLinkMan = new HashSet<LinkMan>(); public Set<LinkMan> getSetLinkMan() { return setLinkMan; } public void setSetLinkMan(Set<LinkMan> setLinkMan) { this.setLinkMan = setLinkMan; } public Integer getCid() { return cid; } public void setCid(Integer cid) { this.cid = cid; } public String getCustName() { return custName; } public void setCustName(String custName) { this.custName = custName; } public String getCustLevel() { return custLevel; } public void setCustLevel(String custLevel) { this.custLevel = custLevel; } public String getCustSource() { return custSource; } public void setCustSource(String custSource) { this.custSource = custSource; } public String getCustPhone() { return custPhone; } public void setCustPhone(String custPhone) { this.custPhone = custPhone; } public String getCustMobile() { return custMobile; } public void setCustMobile(String custMobile) { this.custMobile = custMobile; } }
Customer.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping> <!-- 1.配置類和表對應 class標簽 name屬性:實體類的全路徑 table屬性:資料庫表名稱 --> <class name="cn.itcast.entity.Customer" table="t_customer"> <id name="cid" column="cid"> <generator class="native"></generator> </id> <property name="custName" column="custName"></property> <property name="custLevel" column="custLevel"></property> <property name="custSource" column="custSource"></property> <property name="custPhone" column="custPhone"></property> <property name="custMobile" column="custMobile"></property> <!-- 在客戶映射文件中,表示所有聯繫人 使用set標簽:表示所有聯繫人 set標簽裡面有name屬性:屬性值寫在客戶實體類裡面,表示聯繫人的set集合名稱 reverse屬性預設值:false表示不放棄維護 true表示放棄維護--> <set name="setLinkMan" inverse="true"> <!-- 一對多建表,有外鍵 hibernate機制:雙向維護外鍵,在一和多那一方都配置外鍵 column屬性值:外鍵名稱 --> <key column="clid"></key> <!-- 客戶所有的聯繫人,class裡面寫聯繫人實體類全路徑 --> <one-to-many class="cn.itcast.entity.LinkMan"/> </set> </class> </hibernate-mapping>
(2)LinkMan.java
package cn.itcast.entity; public class LinkMan { // 聯繫人編號(主鍵) private Integer lkm_id; // 聯繫人姓名 private String lkm_name; // 聯繫人性別 <