Maven環境下搭建SSH框架之Spring整合Hibernate


© 版權聲明:本文為博主原創文章,轉載請注明出處

1.搭建環境

  Spring:4.3.8.RELEASE

  Hibernate:5.1.7.Final

  MySQL:5.7.17

  注意:其他版本在某些特性的使用上可能稍微存在差別

2.准備工作

  本文是在上一篇博文《Maven環境下搭建SSH框架之Spring整合Struts2》的基礎上繼續搭建的。還未進行Spring整合Struts2的可以去搭建后再閱讀本文。

  Maven環境下搭建SSH框架之Spring整合Struts2http://www.cnblogs.com/jinjiyese153/p/6964074.html

3.Spring整合Hibernate

  整合內容:此整合是將Hibernate的配置文件hibernate.cfg.xml整合到Spring的配置文件中,並且利用Spring的面向切面(AOP)功能對Hibernate事務進行統一管理。

  3.1 首先引入Hibernate的核心jar包,MySQL的驅動,還有Spring整合ORM框架所需的spring-orm.jar,以及C3P0連接池所需jar。

<properties>    
    <!-- 統一源碼的編碼方式 -->
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<!-- 統一各個框架版本 -->
	<struts.version>2.5.10</struts.version>
	<spring.version>4.3.8.RELEASE</spring.version>
	<hibernate.version>5.1.7.Final</hibernate.version>
</properties>

<!-- Spring整合ORM框架依賴 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
	<version>${spring.version}</version>
</dependency>
<!-- Hibernate 核心依賴 -->
<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-core</artifactId>
	<version>${hibernate.version}</version>
</dependency>
<!-- MySQL 依賴 -->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.42</version>
</dependency>
<!-- C3P0 依賴 -->
<dependency>
	<groupId>com.mchange</groupId>
	<artifactId>c3p0</artifactId>
	<version>0.9.5</version>
</dependency>

  3.2 給實體類Product.java添加注解,表明與表的映射關系

package org.ssh.product.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.hibernate.annotations.GenericGenerator;

@Entity
public class Product {

	@Id
	@GeneratedValue(generator = "pid")
	@GenericGenerator(name = "pid", strategy = "native")
	private int pid;// 商品ID
	@Column(length = 100)
	private String pname;// 商品名稱
	private double price;// 商品價格
	
	public int getPid() {
		return pid;
	}
	public void setPid(int pid) {
		this.pid = pid;
	}
	public String getPname() {
		return pname;
	}
	public void setPname(String pname) {
		this.pname = pname;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	
}

  3.3 添加jdbc.properties文件,聲明數據庫連接相關信息

jdbc.url=jdbc:mysql:///ssh?useSSL=true&characterEncoding=UTF-8
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=***

  3.4 在applicationContext.xml中配置C3P0連接池,並將Hibernate的配置文件hibernate.cfg.xml中的相關信息整合到Spring的配置文件applicationContext.xml中

<!-- 引入屬性文件 -->
	<context:property-placeholder location="classpath:jdbc.properties"/>
	
	<!-- 配置C3P0連接池 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<!-- 數據庫連接相關信息 -->
		<property name="jdbcUrl" value="${jdbc.url}"/>
		<property name="driverClass" value="${jdbc.driverClass}"/>
		<property name="user" value="${jdbc.username}"/>
		<property name="password" value="${jdbc.password}"/>
	</bean>
	
	<!-- 配置Hibernate的SessionFactory -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
		<!-- 注入連接池 -->
		<property name="dataSource" ref="dataSource"/>
		<!-- 配置Hibernate屬性 -->
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.show_sql">true</prop><!-- 是否展示SQL -->
				<prop key="hibernate.hbm2ddl.auto">update</prop><!-- 是否自動創建表結構 -->
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
			</props>
		</property>
		<!-- 掃描並加載注解過的實體類 -->
		<property name="packagesToScan" value="org.ssh.*.model"/>
	</bean>

  3.5 創建ProductService.java、ProductServiceImpl.java、ProductDao.java、ProductDaoImpl.java文件,並添加相應注解

package org.ssh.product.dao;

import org.ssh.product.model.Product;

/**
 * 商品操作-持久層接口
 *
 */
public interface ProductDao {

	void saveProduct(Product product);
	
}

  

package org.ssh.product.dao.impl;

import org.springframework.stereotype.Repository;
import org.ssh.product.dao.ProductDao;
import org.ssh.product.model.Product;

/**
 * 商品信息-服務層實現
 *
 */
@Repository
public class ProductDaoImpl implements ProductDao {

	@Override
	public void saveProduct(Product product) {
		
	}

}

  

package org.ssh.product.service;

import org.ssh.product.model.Product;

/**
 * 商品操作-服務層接口
 *
 */
public interface ProductService {
	
	void saveProduct(Product product);

}

  

package org.ssh.product.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.ssh.product.dao.ProductDao;
import org.ssh.product.model.Product;
import org.ssh.product.service.ProductService;

@Service
public class ProductServiceImpl implements ProductService {

	@Autowired
	private ProductDao productDao;
	
	@Override
	public void saveProduct(Product product) {

		productDao.saveProduct(product);

	}

}

  3.6 添加事務控制,本處使用基於AspectJ的xml聲明式事務,控制更加靈活。因此需要添加aspectjweaver.jar包

<!-- AspectJ依賴 -->
		<dependency>
		    <groupId>org.aspectj</groupId>
		    <artifactId>aspectjweaver</artifactId>
		    <version>1.8.10</version>
		</dependency>

  

<!-- 配置事務管理器 -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
		<!-- 注入SessionFactory -->
		<property name="sessionFactory" ref="sessionFactory"/>
	</bean>
	
	<!-- 配置事務增強 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<!-- 配置需要進行事務管理的方法,和事務傳播行為 -->
			<tx:method name="save*" propagation="REQUIRED"/>
			<tx:method name="update*" propagation="REQUIRED"/>
			<tx:method name="delete*" propagation="REQUIRED"/>
		</tx:attributes>
	</tx:advice>
	
	<!-- 配置切面 -->
	<aop:config>
		<!-- 配置切入點
			* org.ssh.service.*+.*(..)
	            *:表示方法的作用域,*表示所有
	            org.ssh.service.*:表示org.ssh.service下的任何包
	            org.ssh.service.*+:表示org.ssh.service下的任何包及其子包
	            *(..):*表示任何方法,(..)表示方法的任何參數
		 -->
		<aop:pointcut expression="execution(* org.ssh.*.service.*+.*(..))" id="pointcut"/>
		<!-- 適配切入點和事務增強 -->
		<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
	</aop:config>

  3.7 修改Product.java,添加兩個構造方法

public Product() {
		
}
	
public Product(String pname, double price) {

	this.pname = pname;
	this.price = price;
		
}

  3.8 修改ProductAction.java

package org.ssh.product.action;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.ssh.product.model.Product;
import org.ssh.product.service.ProductService;

import com.opensymphony.xwork2.ActionSupport;

/**
 * 商品操作-控制層
 *
 */
@Controller
@Scope("prototype")
public class ProductAction extends ActionSupport {

	private static final long serialVersionUID = 1L;
	
	@Autowired
	private ProductService productService;
	
	private String pname;
	private double price;
	
	/**
	 * 保存商品操作
	 * 
	 * @return
	 */
	public String saveProduct() {
		
		Product product = new Product(pname, price);
		productService.saveProduct(product);
		
		this.addActionMessage("保存成功...");
		return SUCCESS;
		
	}

	public String getPname() {
		return pname;
	}

	public void setPname(String pname) {
		this.pname = pname;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}
	
	@Override
	public void validate() {
		
		if(pname == null || "".equals(pname.trim())) {
			this.addFieldError("pname", "商品名稱不能為空");
		}
		
	}
	
}

  3.9 修改ProductDaoImpl.java

package org.ssh.product.dao.impl;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.stereotype.Repository;
import org.ssh.product.dao.ProductDao;
import org.ssh.product.model.Product;

/**
 * 商品信息-服務層實現
 *
 */
@Repository
public class ProductDaoImpl implements ProductDao {

	private HibernateTemplate template;
	
	@Autowired
	public ProductDaoImpl(SessionFactory sessionFactory) {
		
		template = new HibernateTemplate(sessionFactory);
		
	}

	@Override
	public void saveProduct(Product product) {
		
		template.save(product);
		
	}

}

  3.10 手動在MySQL數據庫中創建ssh數據庫

create database ssh default character set utf8;

  3.11 啟動項目

    1) 首頁

    2)自動創建的表

    3)新增商品

    4)數據庫信息

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM