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)数据库信息

 

posted @ 2017-06-09 15:33  禁忌夜色153  阅读(3406)  评论(5编辑  收藏  举报