zoukankan      html  css  js  c++  java
  • 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)数据库信息

  • 相关阅读:
    博客园
    未释放的已删除文件
    ssh连接缓慢
    剑指 Offer 38. 字符串的排列
    剑指 Offer 37. 序列化二叉树
    剑指 Offer 50. 第一个只出现一次的字符
    剑指 Offer 36. 二叉搜索树与双向链表
    剑指 Offer 35. 复杂链表的复制
    剑指 Offer 34. 二叉树中和为某一值的路径
    剑指 Offer 33. 二叉搜索树的后序遍历序列
  • 原文地址:https://www.cnblogs.com/jinjiyese153/p/6971212.html
Copyright © 2011-2022 走看看