通過Spring整合hibernate併進行單元測試(詳細)

来源:http://www.cnblogs.com/hckblogs/archive/2017/11/21/7876013.html
-Advertisement-
Play Games

一. 沒有基礎hibernate基礎的可以點擊這裡 >ORM hibernate入門Demo(無敵詳細版) 這裡我就不詳細介紹了.. 二. hibernat.cfg.xml文件是Hibernate中重要的配置文件,當Spring和Hibernate整合時,由於hibernate.cfg.xml文件中 ...


一.

沒有基礎hibernate基礎的可以點擊這裡 ---------->ORM----hibernate入門Demo(無敵詳細版)

這裡我就不詳細介紹了..

二.

hibernat.cfg.xml文件是Hibernate中重要的配置文件,當Spring和Hibernate整合時,由於hibernate.cfg.xml文件中的配置信息可以教育Spring來管理,

所以可以選擇是否使用hibernate.cfg.xml文件.

這裡將從使用hibernate.cfg.xml文件來講解Spring和Hibernate的整合

在講解Spring和Hibernate的整合前,首先需要瞭解三個重要的對象,具體如下:

1.HibernateTemplate:相當於Hibernate的session可以直接操作PO類,依賴於SessionFactory.

2.LocalSessionFactoryBean:獲取SessionFactory.

3.HibernateTransactionManager:Hibernate的事物管理器.

三.實現代碼:

整個項目所需jar包:

 

1.使用hibernate.cfg.xml文件整合Spring.

1).首先建立一張user表:

2).建立User類

public class User {
  private Integer id;       //用戶id
  private String  username;     //用戶名稱
  private String password;  //用戶密碼
	public Integer getId() {
		return id;
    }
	public void setId(Integer id) {
		this.id = id;
    }
	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;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
	}  
}

3).編寫對應的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>
      <!-- name代表的是實體類名,table代表的是表名 -->
      <class name="com.hck.entity.User" table="user">
          <!-- name=id代表的是user類中屬性  column=id代表的是table表中的欄位 -->
          <id name="id" column="id">
             <!-- 主鍵生成策略 -->
             <generator class="native"/>
          </id>
          <!-- 其他屬性使用property標簽來映射 -->
          <property name="username" column="username" type="string"/>
          <property name="password" column="password" type="string"/>
      </class>
  </hibernate-mapping>
 

4).編寫UserDao介面

public interface UserDao {
  public void save(User user);      //添加用戶
  public void update(User user);    //更新用戶
  public void delete(User user);    //刪除用戶
  public User findById(Integer id); //根據用戶id查找用戶數據
  public List<User>  findAll();     //返回所有用戶數據
}

5).編寫介面實現類:UserDaoImpl

//開啟註解模式,這句相當於在spring中
//<bean name="userDao" class="com.hck.dao.impl.UserDaoImpl"/>
@Repository("userDao")
public class UserDaoImpl implements UserDao {
	//依賴註入
	@Autowired
	private HibernateTemplate hibernateTemplate;
	//插入操作
	public void save(User user) {
          hibernateTemplate.save(user);
	}
    //更新操作
	public void update(User user) {
	      hibernateTemplate.update(user);
	}
    //刪除操作
	public void delete(User user) {
		   hibernateTemplate.delete(user);
	}
    //根據ID查找用戶
	public User findById(Integer id) {	
		return hibernateTemplate.get(User.class, id);
	}
	//返回所有用戶數據
	@SuppressWarnings("unchecked")
	public List<User> findAll() {
		return (List<User>) hibernateTemplate.find("from User");
	}
}

6).編寫UserService介面

public interface UserService {
      public void save(User user);      //添加用戶
      public void update(User user);    //更新用戶
      public void delete(User user);    //刪除用戶
      public User findById(Integer id); //根據用戶id查找用戶數據
      public List<User>  findAll();     //返回所有用戶數據
}

7).編寫UserServiceImpl類

//開啟註解模式,這句相當於在spring中
//<bean name="userService" class="com.hck.service.impl.UserServiceImpl"/>
@Service("userService")
public class UserServiceImpl implements UserService {
	//依賴註入
	@Autowired
	private UserDao userDao;
	//插入數據
	public void save(User user) {
		userDao.save(user);	
	}
    //更新數據
	public void update(User user) {
	    userDao.update(user);
	}
	//刪除數據
	public void delete(User user) {
		userDao.delete(user);	
	}
    //根據id查找用戶
	public User findById(Integer id) {	
		return userDao.findById(id);
	}
    //返回所有用戶信息
	public List<User> findAll() {
		return userDao.findAll();
	}

}

8).編寫核心配置文件hibernate.cfg.xml

<?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.dialect">
	            org.hibernate.dialect.MySQLDialect
	          </property>
	          <!-- 資料庫驅動 -->
	          <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
	          <!-- 連接資料庫的url -->
	          <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/tb_test</property>
	          <!-- 資料庫用戶名 -->
	          <property name="hibernate.connection.username">root</property>
	          <!-- 資料庫密碼 -->
	          <property name="hibernate.connection.password">123456</property>
	          <!-- 其他配置 -->
	          <!-- 顯示sql語句 -->
	          <property name="show_sql">true</property>
	          <!-- 配置c3p0 -->
	          <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
	          <!-- 用來關聯hbm配置文件 -->        
	          <!-- <mapping resource="com/hck/entity/Customer.hbm.xml"/> -->
	          <mapping resource="com/hck/entity/User.hbm.xml"/>
         </session-factory>
  </hibernate-configuration>

9).編寫Spring的配置文件applicationContext.xml同樣放在src目錄下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.3.xsd">
     <!-- 開啟註解 -->
     <context:annotation-config/>
     <!-- 1.配置sessionFactory -->
     <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
     <!-- 載入Hibernate核心配置文件 -->
     <property name="configLocation" value="classpath:hibernate.cfg.xml"/> 
     </bean>
     <!-- 2.配置Hibernate模版 -->
     <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
          <!-- 通過工廠獲得Session,操作PO類 -->
          <property name="sessionFactory" ref="sessionFactory"/>
     </bean>
     <!-- 事務管理 -->
     <!-- #1事務管理器,就是平臺,Sprring工具產生,依賴於使用持久方案 -->
     <bean id="txManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
           <property name="sessionFactory" ref="sessionFactory"/>
     </bean>
     <!-- #2通知:增強事務 -->
     <tx:advice id="txAdvice" transaction-manager="txManager">
           <tx:attributes>
                <tx:method name="save*"/>
                <tx:method name="update*"/>
                <tx:method name="delete*"/>
                <!-- 只讀 -->
                <tx:method name="find*" read-only="true"/>
           </tx:attributes>
     </tx:advice>
     <!-- #3 切麵:將切入點與通知點關聯 -->
     <aop:config>
            <aop:pointcut expression="execution(* com.hck.service.*.*(..))" id="allDaoMethod" />
            <aop:advisor advice-ref="txAdvice" pointcut-ref="allDaoMethod"/>
     </aop:config>
     <!-- 包掃描 -->
     <context:component-scan base-package="com.hck"/>
</beans>

10).編寫單元測試類:

public class SpringHibernateTest {
	 //定義變數 
     ApplicationContext ac;   //讀取Spring配置文件,返回上下文對象
     UserService userService; //用於接收一個UserServiceImpl實例
     @Before
     public void setUp(){
    	 ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
    	 userService=(UserService) ac.getBean("userService");
     }
     @Test
     public void insert()
     {
    	 User user=new User();
    	 user.setUsername("張三");
    	 user.setPassword("123456");
    	 userService.save(user);
     }
     @Test
     public void findById()
     {
    	 User user=userService.findById(1);
    	 System.out.println(user);
     }
     //修改用戶名
     @Test
     public void update()
     {
    	 User user=new User();
user.setId(1); user.setUsername("李四"); user.setPassword("123456"); userService.update(user); } //先查找再刪除 @Test public void delete() { User user=userService.findById(1); userService.delete(user); } //查找所有 @Test public void findAll() { List<User> list =userService.findAll(); for(User user:list) { System.out.println(user); } } }

11)測試結果:

A.插入操作:

控制台列印的sql語句,然後到mysql查看數據是否插入成功;這裡我再插入兩條信息用戶分開顯示查詢所有用戶信息

B.查詢操作(查詢用戶id為1的信息):

 C.更新操作,(將id=1的用戶名修改為李四)

D.刪除操作,(將id=1的用戶信息刪除)

 

E.查詢所有用戶信息

四.總結

   以上是完整的帶hibernate.cfg.xml文件的Spring跟Hibernate的整合過程,如有疑問可以留言~

 


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

-Advertisement-
Play Games
更多相關文章
  • 1.MD5加密 用戶在資料庫存密碼需要進行再加密,這樣一個過程叫MD5加密只要涉及到存用戶的密碼一定要用MD5加密MD5密碼一般都是16進位的把一個密碼轉換成16進位的過程就叫MD5加密把字元串加密成MD5,這樣一個過程是不可逆的。只能把字元串變成MD5值,不能把MD5值變成字元串但有人模擬過MD5 ...
  • /// /// 加密 /// public static class Encrypting { #region 使用對稱加密、解密 private static string GetEncryptKey() { return ConfigurationManager.AppSettin... ...
  • URL形式: // http://localhost:2692/PDFVIEWER/web/viewer.html?file=http://localhost:2692/TOV/DASystem/GetStreaem?path%3Dftp://ftp賬號:ftp密碼@IP地址/0001/E_File ...
  • 1 public static void CreateConfig(){ 2 //c#可以添加內置的app.config,我們通過ConfigrationManager類可以 3 //可以很輕鬆的操作相關節點,操作的方式,這裡不做多介紹, 4 //引發的問題 當程式編譯的時候會自動生成 程式名.co... ...
  • 什麼是單元測試 寫了個類,要給別人用,會不會有bug?怎麼辦?測試一下。 用main方法測試好不好?不好! 為什麼要進行單元測試 重用測試,應付將來的實現的變化。 提高士氣,明確知道我的東西是沒問題的。 JUnit4 HelloWorld 需要導入JUnit和hamcrest包 放棄舊的斷言,使用h ...
  • jar文件包括java普通類、資源文件和普通文件,在maven中即是打包src/main/java和src/main/resources資源文件夾下的所有文件。在打包的時候會自動生成MATA-INF文件夾,用於存儲maven的pom信息和MANIFEST.MF文件。例如: war文件包含全部的web ...
  • 使用 sinopia 的好處是,node系的工程師,內部協作時,使用自有 npm 包,會非常方便;另外,sinopia,會緩存已經下載過的包,可以在相當程度上,加速 npm install 相關命令的執行。 今天我試著直接在樹莓派上搭建一個 sinopia 服務。最終實現的效果較為完整,基本滿足需... ...
  • 一、安裝環境 Windows10 64、python2.7 二、Numpy下載 1、下載Numpy: 下載地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy cp27表示python2.7,因為我的python是amd64的,所以我下載了nump ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...