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

  • 相关阅读:
    WebSocket
    Jedis工具类
    电脑突然没有声音了 右下角红叉叉,由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件设备。 (代码19)
    java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.
    WCF中的数据契约(Continued)
    WCF中的服务契约
    搭建基于MOSS的团队解决方案01——Microsoft Office SharePoint 2007 Server快速入门(Continued)
    Silverlight 的发展之路
    Windows Workflow Foundation实验01——Windows Workflow Foundation快速入门(练习四)
    使用.NET平台工具操作Live Framework
  • 原文地址:https://www.cnblogs.com/jinjiyese153/p/6971212.html
Copyright © 2020-2023  润新知