一顆簡單的hibernate慄子

来源:http://www.cnblogs.com/young-z/archive/2017/07/13/7163645.html
-Advertisement-
Play Games

Hibernate是一個開源的ORM框架,顧名思義,它的核心思想即ORM(Object Relational Mapping,對象關係映射),可以通過對象來操作資料庫中的信息,據說開發者一開始是不太熟悉資料庫SQL語句的,這也造就了hibernate的強大之處,它不強求開發者熟悉SQL語句也可以操作 ...


  Hibernate是一個開源的ORM框架,顧名思義,它的核心思想即ORM(Object Relational Mapping,對象關係映射),可以通過對象來操作資料庫中的信息,據說開發者一開始是不太熟悉資料庫SQL語句的,這也造就了hibernate的強大之處,它不強求開發者熟悉SQL語句也可以操作資料庫,hibernate可以自動生成SQL語句,自動執行。

  利用hibernate可以讓開發者完全使用面想對象思維來操作資料庫,所以接下來的演示不會有一句SQL語句,如果有的話,請當我這句話沒說!

  本文使用hibernate實現了簡單的對一個person數據表的基本增刪改查操作。

 

 

準備工作

環境:win7+eclipse

工具包:hibernate包,可前往http://hibernate.org/orm/downloads/下載,本例中使用的是4版本;

資料庫連接驅動包,本例中使用的是mysql的

  

 

程式結構圖示

 

pojo層實體類

package demo.pojo;

public class Person {
	
	private Integer id;
	private String name;
	private String gender;
	private Integer age;
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", gender=" + gender + ", age=" + age + "]";
	}
	
	
}

  

核心配置文件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         <!-- 以下四行分別為:資料庫驅動類、Drivermanager獲取連接的參數URL、用戶名、密碼  -->
 8         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
 9         <property name="connection.url">jdbc:mysql://127.0.0.1/web?characterEcoding=utf-8</property>
10         <property name="connection.username">root</property>
11         <property name="connection.password">123456</property>
12         <!-- 設置方言,hibernate會根據資料庫的類型相應生成SQL語句 -->
13         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
14         
15         <!-- 控制台顯示生成的sql語句,預設為false -->
16         <property name="show_sql">true</property>
17         <!-- 映射配置源文件的位置 -->
18         <mapping resource="demo/pojo/Person.hbm.xml"/>
19     </session-factory>
20     
21 </hibernate-configuration>

 

映射文件Person.hbm.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC 
 3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping>
 6     <!-- name是實體類全名,table為數據表名 -->
 7     <class name="demo.pojo.Person" table="Person">
 8         <id name="id" column="id">
 9             <!-- 主鍵生成方式,native是讓hibernate自動識別 -->
10             <generator class="native"></generator>
11         </id>
12         <!-- 
13         註意點:
14         0.name值為實體類中屬性名,column為數據表中欄位名;
15         1.當實體類中屬性名與對應數據表欄位名相同時,後面的column可以省略,hibernate會自動匹配,例如下麵age ;
16         2.反之當實體類中屬性名與對應數據表欄位名不相同時,兩項都要寫上,例如下麵gender和sex
17         -->
18         <property name="name" column="name"></property>
19         <property name="gender" column="sex"></property>
20         <property name="age"></property>
21     </class>
22 </hibernate-mapping>
View Code

 

Session工廠類

 1 package demo.util;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.cfg.Configuration;
 6 import org.hibernate.service.ServiceRegistry;
 7 import org.hibernate.service.ServiceRegistryBuilder;
 8 
 9 public class HibernateSessionFactory {
10     private static SessionFactory factory;
11     private static ThreadLocal<Session> thread = new ThreadLocal<Session>();
12     private static String path = "hibernate.cfg.xml";
13     private static Configuration config = new Configuration();
14     static {
15         config.configure(path);
16         ServiceRegistry service = new ServiceRegistryBuilder()//定義一個服務註冊機
17             .applySettings(config.getProperties()).buildServiceRegistry();
18         factory = config.buildSessionFactory(service);//創建Session工廠類
19     }
20     
21     public static Session getSession() {
22         Session session = thread.get();
23         if(session == null || !session.isOpen()) {
24             session = factory.openSession();
25             thread.set(session);
26         }
27         return session;
28     }
29     
30     public static void closeSession() {
31         Session session = thread.get();
32         if(session != null && session.isOpen()) {
33             session.close();
34             thread.set(null);
35         }
36     }
37     
38 }
View Code

 

DAO層封裝數據各項操作的方法

 1 package demo.dao;
 2 
 3 import java.io.Serializable;
 4 import org.hibernate.Session;
 5 import org.hibernate.Transaction;
 6 import demo.pojo.Person;
 7 import demo.util.HibernateSessionFactory;
 8 
 9 public class PersonDaoImpl {
10     //增刪改查,此處以增為例
11     public boolean add(Person p) {
12         Session session = HibernateSessionFactory.getSession();//創建Session
13         Transaction trans = session.beginTransaction();//開啟事務
14         try {
15             Serializable id = session.save(p);//添加記錄並獲取主鍵值
16             System.out.println(id+"為獲取的主鍵值");//控制台查看主鍵值
17             trans.commit();//提交事務
18             return true;
19         } catch (Exception e) {
20             trans.rollback();//獲取異常,則事務回滾
21         } finally {
22             HibernateSessionFactory.closeSession();//關閉Session
23         }
24         return false;
25     }
26 }
View Code

 

測試類TestPerson

 1 package demo.test;
 2 
 3 import org.junit.Test;
 4 import demo.dao.PersonDaoImpl;
 5 import demo.pojo.Person;
 6 
 7 public class TestPerson {
 8     @Test
 9     public void testAdd() {
10         //創建一個人類對象
11         Person p = new Person();
12         p.setName("張三");
13         p.setGender("男");
14         p.setAge(18);
15         //創建dao層類對象並調用添加方法
16         PersonDaoImpl dao = new PersonDaoImpl();
17         dao.add(p);
18     }
19 }
View Code

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天給大家帶來一個Visual Studio 2013中非常實用的功能,自動生成XML反序列化的類。以往想要在代碼中將XML反序列化成對象,我們要麼手動創建這些對象(很容易出錯),要麼藉助於第三方的工具來生成Class。而現在,Visual Studio 2013可以自動幫我們完成這個工作。當然,如 ...
  • 一:TCP粘包產生的原理 1,TCP粘包是指發送方發送的若幹包數據到接收方接收時粘成一包,從接收緩衝區看,後一包數據的頭緊接著前一包數據的尾。出現粘包現象的原因是多方面的,它既可能由發送方造成,也可能由接收方造成。 2,發送方引起的粘包是由TCP協議本身造成的,TCP為提高傳輸效率,發送方往往要收集 ...
  • 引言 之前學習了一點關於緩存的東西,有控制器緩存、頁面緩存,又看到一篇文章是關於部分視圖緩存的內容。一下就是我的一些學習總結。 情景 假設有一個頁面A,這是一個靜態頁面除了頭條的輪播圖需要更新。那麼這個時候可以把整個頁面緩存,然後輪播圖那一塊用Html.Partial顯示。 首先頁面緩存設置為一個小 ...
  • 在目前的主流架構中,我們越來越多的看到web Api的存在,小巧,靈活,基於Http協議,使它在越來越多的微服務項目或者移動項目充當很好的service endpoint。問題 以Asp.Net Web Api 為例,隨著業務的擴展,產品的迭代,我們的web api也在隨之變化,很多時候會出現多個版... ...
  • Adding a controller to a ASP.NET Core MVC app with Visual Studio 在asp.net core mvc 中添加一個控制器 2017-2-28 5 分鐘閱讀時長 By Rick Anderson The Model-View-Control ...
  • 原因其實是很簡單的: 使用First代表一定能找到,找不到就拋出異常,必須使用try……catch……進行異常的捕獲。 推薦使用 FirstOrDefault 或Find 取序列中滿足條件的第一個元素,如果沒有元素滿足條件,則返回預設值,如果返回的是可以為null的對象,則返回預設值為null,對於 ...
  • 看到一個大神關於MVC緩存的學習文章,希望大家一起學習。 原文地址:http://www.cnblogs.com/iamlilinfeng/p/4419362.html 緩存介紹: 個人對於緩存的理解就是這樣子的。用戶訪問一個頁面A,後端找到A.cshtml之後還要各種構造~轉換~序列化。。。(我也 ...
  • 說來慚愧,工作大半年了,都沒有好好學習過。半年前曾經想過,如果叫我做一個游戲的聊天模塊,我會怎麼做?雖然有所想法,但是只是想想。現在,就利用業餘時間來實現一下吧。 受工作的影響,也想把所有的define和引用的頭文件都定義在個文件里: 1 /// 2 /// @file define.h 3 /// ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...