`
yun342173024
  • 浏览: 73815 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring+jpa+简单泛型dao

 
阅读更多
spring+jpa的整合

数据库文件


  /*
Navicat MySQL Data Transfer

Source Server         : mysql
Source Server Version : 50165
Source Host           : localhost:3306
Source Database       : testdb

Target Server Type    : MYSQL
Target Server Version : 50165
File Encoding         : 65001

Date: 2012-09-11 12:46:12
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `goods`
-- ----------------------------
DROP TABLE IF EXISTS `goods`;
CREATE TABLE `goods` (
  `goodsId` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `price` double(10,2) NOT NULL,
  `goodName` varchar(20) NOT NULL,
  PRIMARY KEY (`goodsId`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of goods
-- ----------------------------
INSERT INTO `goods` VALUES ('1', '1.54', '冰激凌');
INSERT INTO `goods` VALUES ('2', '3.60', '面包');
INSERT INTO `goods` VALUES ('7', '5200.00', 'thinkpad笔记本');
INSERT INTO `goods` VALUES ('8', '5200.00', 'thinkpad笔记本');




实体类

 package com.own.entity;

import java.io.Serializable;

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

@Entity
public class Goods implements Serializable {
    
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	public int getGoodsId() {
		return goodsId;
	}
	public void setGoodsId(int goodsId) {
		this.goodsId = goodsId;
	}
	
	public String getGoodName() {
		return goodName;
	}
	public void setGoodName(String goodName) {
		this.goodName = goodName;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	private int goodsId;
	private String goodName;
	private double price;
	
}




泛型dao


package com.own.dao;

import java.io.Serializable;

public interface GenericDao<T extends Serializable,PK extends Serializable> {
    
	/**
	 * 保存一个对象
	 * @param obj
	 */
	void saveObject(T obj);
	/**
	 * 删除一个对象
	 * @param obj
	 */
	void deleteObject(T obj);
	/**
	 * 更新一个对象
	 * @param ojb
	 */
	void updateObject(T ojb);
	/**
	 * 根据主键id找到一个对象
	 * @param id
	 */
	T findObject(PK id);
	
}




泛型dao的实现

   package com.own.dao.impl;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;



import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;



import com.own.dao.GenericDao;
public abstract  class GenericDaoImpl<T extends Serializable ,PK extends Serializable> implements GenericDao<T,PK>{
    
	@PersistenceContext
	protected EntityManager em;
    
	private Class<T> entityClass;
	
	
	@SuppressWarnings("unchecked")
	public GenericDaoImpl(){
	  /**
	   * 获取泛型的实际类型
	   */
	  ParameterizedType type =	(ParameterizedType) this.getClass().getGenericSuperclass();
	  entityClass = (Class<T>)type.getActualTypeArguments()[0];

	}
	
	@Override
	public void deleteObject(T obj) {
		// TODO Auto-generated method stub
		em.remove(em.merge(obj));
		
		
	}
	
	@Override
	public T findObject(PK id) {
		// TODO Auto-generated method stub
		return (T)em.find(entityClass,id);
	}
	
	@Override
	public void saveObject(T obj) {
		// TODO Auto-generated method stub
		em.persist(obj);
	}
	
	@Override
	public void updateObject(T obj) {
		// TODO Auto-generated method stub
		em.merge(obj);
	}

}

   



定义一个具体的dao继承泛型dao
  package com.own.dao;

import com.own.entity.Goods;

public interface GoodsDao extends GenericDao<Goods,Integer> {
   /**
    * 添加需要的方法
    */
}




GoodsDao的实现,这里继承泛型dao的实现

  package com.own.dao.impl;

import org.springframework.stereotype.Repository;

import com.own.dao.GoodsDao;
import com.own.entity.Goods;
@Repository("goodsDao")
public class GoodsDaoImpl extends GenericDaoImpl<Goods,Integer> implements GoodsDao {
  
}
 


GoodsService 代码

 
   package com.own.service;



import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.own.entity.Goods;


public interface GoodsService  {
   
   @Transactional(propagation=Propagation.REQUIRED,rollbackFor=RuntimeException.class)
   void saveGoods(Goods goods);
   @Transactional(propagation=Propagation.REQUIRED,rollbackFor=RuntimeException.class)
   void removeGoods(Goods goods);
   //查找方法不需要配置事务
   Goods getGoodsById(int id);
   /**
    * 配置事务
    * 
    */
   @Transactional(propagation=Propagation.REQUIRED,rollbackFor=RuntimeException.class)
   void updateGoods(Goods goods);
}



Goodsservice实现

  package com.own.service.impl;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.own.dao.GoodsDao;
import com.own.entity.Goods;
import com.own.service.GoodsService;
@Service("goodsService")
public class GoodsServiceImpl implements GoodsService {
   
	@Resource(name="goodsDao")
	private GoodsDao goodsDao;
	@Override
	public Goods getGoodsById(int id) {
		// TODO Auto-generated method stub
		return goodsDao.findObject(id);
	}

	@Override
	public void removeGoods(Goods goods) {
		// TODO Auto-generated method stub
		goodsDao.deleteObject(goods);
	}

	@Override
	public void saveGoods(Goods goods) {
		// TODO Auto-generated method stub
		goodsDao.saveObject(goods);
	}

	@Override
	public void updateGoods(Goods goods) {
		// TODO Auto-generated method stub
		goodsDao.updateObject(goods);
	}

}



测试代码

   
package com.own.service;

import static org.junit.Assert.*;

import javax.annotation.Resource;


import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


import com.own.entity.Goods;
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class GoodsServiceTest {
    
	@Resource(name="goodsService")
	private GoodsService goodsService;
 
	@Test
	public void testSaveGoods() {
		Goods goods = new Goods();
		goods.setGoodName("电视机");
		goods.setPrice(2300);
		goodsService.saveGoods(goods);
	}

	@Test 
	public void testRemoveGoods() {
	Goods goods = new Goods();
		goods.setGoodsId(2);
		//Goods good = (Goods)goodsService.getGoodsById(1);
		goodsService.removeGoods(goods);
	}

	@Test 
	public void testGetGoodsById() {
		Goods good = (Goods)goodsService.getGoodsById(1);
		String name = good.getGoodName();
		System.out.println(good.getGoodName());
		assertEquals("冰激凌",name);
		
	}

	@Test
	public void testUpdateGoods() {
	    Goods good = new Goods();
	    good.setGoodsId(7);
		good.setGoodName("巧克力");
		goodsService.updateGoods(good);
	}

}




spring的配置文件
<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:tx="http://www.springframework.org/schema/tx" 
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="  
             http://www.springframework.org/schema/beans 
             http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
             http://www.springframework.org/schema/context
        	 http://www.springframework.org/schema/context/spring-context-3.0.xsd
             http://www.springframework.org/schema/aop 
             http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
             http://www.springframework.org/schema/tx 
             http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

  <!-- 配置连接池   -->
  <bean id="dataSource"  class="org.apache.commons.dbcp.BasicDataSource"  destroy-method="close"    >
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
        <property name="url" value="jdbc:mysql://localhost:3306/shopping?useUnicode=true&amp;characterEncoding=UTF-8" />  
        <property name="username"  value="root" ></property>  
        <property name="password"  value="zyp"  ></property>  
        <property name="maxActive" value="20"  ></property>  
        <property name="initialSize" value="3"  >  </property>  
        <property name="maxWait" value="60000"  ></property>  
        <property name="maxIdle"><value>20</value></property>  
        <property name="minIdle"><value>0</value></property>  
   </bean>
   
   <!-- 配置jap实现提供商的特性  -->
   <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"  >
         <property name="database" value="MYSQL" ></property> 
   </bean>
  
  <!-- 持久化提供商   -->
  <bean id="persistenceProvider" class="org.hibernate.ejb.HibernatePersistence"/>
  
  <!--配置spring对jpa的支持 -->
  <bean id="entityManagerFactory"  class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
     <property name="dataSource">
        <ref bean="dataSource" />
     </property>
      <!-- 持久化单原名称 -->
     <property name="persistenceUnitName"  value="zyp"  />
     
     <!-- 持久化提供商  -->
     <property name="persistenceProvider" >
        <ref bean="persistenceProvider" />
     </property>
     <!-- 特性提供商配置 -->
     <property name="jpaVendorAdapter" >
        <ref bean="jpaVendorAdapter" />
     </property>
     <!-- jpa 属性配置 -->
     <property name="jpaProperties">
        <props>
         <prop key="hibernate.show_sql">true</prop>
         <prop key="hibernate.max_fetch_depth">3</prop>
         <prop key="hibernate.hbm2ddl.auto">false</prop>
	     <prop key="hibernate.jdbc.fetch_size"  >18</prop>
	     <prop key="hibernate.jdbc.batch_size" >10</prop>
	     <prop key="hibernate.format_sql"  >true</prop> 
        </props>
    </property>
  </bean>

	<context:component-scan base-package="com.own" />		
   
      
    <!-- 配置事物管理 -->
   <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
   </bean>  
  
   <tx:annotation-driven transaction-manager="transactionManager"/>
  
</beans>

 


分享到:
评论

相关推荐

    spring3.1+hibernate4+Jpa Dao

    综上所述,"spring3.1+hibernate4+jpa Dao"的集成是一个高效、灵活的企业级应用开发架构,它结合了Spring的IoC和AOP能力、Hibernate的ORM功能以及JPA的标准接口,通过泛型DAO实现和事务管理,为开发者提供了强大的...

    SSH2全注解整合(spring2.5+hibernate3.3+struts2.1+泛型DAO+proxool连接池)

    泛型DAO(Data Access Object)是一种设计模式,用于抽象数据访问层的操作,提供通用的CRUD(Create, Read, Update, Delete)方法。通过泛型,DAO可以适用于多种类型的实体,降低了代码重复。例如,一个BaseDAO接口...

    Struts2 Spring3 Hibernate 注解功能 DAO 泛型 通用分页

    总的来说,"SSHWithAnnotationDemo"项目展示了如何利用现代Java技术栈的高级特性,包括Struts2、Spring3和Hibernate的注解功能,DAO层的泛型设计以及通用的分页实现,来构建一个高效、可维护的Web应用。这样的实践...

    springmvc-jpa-springdata:使用Hibernate作为JPA实现和PostgreSQL数据库的Spring Data

    对于JPA,Spring Data通过泛型 Repository 接口提供了一种声明式的方法来执行CRUD(创建、读取、更新、删除)操作,减少了手动编写DAO(数据访问对象)和Repository层的代码。 **PostgreSQL** PostgreSQL是一种开源...

    springDataJpa+mysql+layui前后端分离.zip

    SpringDataJpa通过泛型接口和注解,大大简化了数据库操作,开发者无需编写大量的DAO层代码,即可实现对数据库的CRUD操作。它支持多种ORM框架,如Hibernate和MyBatis,使得开发者可以根据项目需求灵活选择。 Mysql...

    基于javaConfig的springDataJpa+dubbo+springMvc搭建(二)

    通过提供泛型接口Repository,开发者无需编写大量的DAO层代码,就能实现对数据库的基本操作,如增删查改。在JavaConfig中,我们需要定义一个配置类,使用`@EnableJpaRepositories`注解来启用JPA仓库,并通过`@Bean`...

    泛型DAO模式在Java Web开发中的应用.pdf

    本文将详细介绍泛型DAO模式在Java Web开发中的应用,包括泛型机制、JPA框架、Struts框架和Spring框架的使用。 一、泛型机制 Java 5.0版本引入了泛型机制,提供了一种解决方案,使用类型参数来代替Object类型的变量...

    Hibernate泛型Dao

    【标题】"Hibernate泛型Dao"是针对Java开发中的数据持久化框架Hibernate的一个高级应用,主要目的是为了提高代码的复用性和简洁性。在传统的Hibernate使用中,针对每个实体类,我们都需要创建一个对应的Dao(Data ...

    JPA+Spring2.0+EasyJWeb技术构架在企业级系统中的应用.ppt

    目录 企业级应用的特点 JPA及JPA使用技巧 使用泛型DAO来简化DAO层的开发 IOC容器、AOP及Spring2 EasyJWeb如何实现快速开发 小结

    Spring-Data-JPA快速使用

    Spring Data JPA 通过提供一套简单而强大的API,极大地简化了基于JPA的数据访问操作。它不仅减少了大量冗余的代码编写工作,而且提高了开发效率和代码的可维护性。对于已具备一定Java编程基础的开发者来说,掌握...

    Spring数据JPA - 中文参考文档

    Spring 数据 JPA 是一个强大的框架,它为使用 Java 持久化 API (JPA) 与 Spring 框架集成提供了便利。JPA 允许开发者使用注解来定义实体对象及其数据库行为,减少了手动编写 SQL 和 DAO 类的需求。在 Spring 中,JPA...

    Java Web程序运用中泛型DAO的作用.zip

    在实际的Java Web应用中,我们可以结合Spring框架的Hibernate或JPA支持,进一步简化泛型DAO的实现,利用Spring的模板类如JdbcTemplate、HibernateTemplate等,自动处理SQL执行和结果映射。 总的来说,泛型DAO在Java...

    SpringBoot使用Spring-data-jpa简化数据访问层

    对数据库的操作无非就“增删改查”。就最为普遍的单表操作而言,除了表和字段不同外,语句都是类似的,开发人员需要写...Spring-data-jpa的出现正可以让这样一个已经很“薄”的数据访问层变成只是一层接口的编写方式。

    Persistence with Spring

    - 泛型DAO:利用Java的泛型特性,创建可复用的DAO,减少代码冗余。 5. **Spring与JPA的事务管理** - 无XML配置事务:使用`@EnableTransactionManagement`注解,配合`@Transactional`注解在方法级别定义事务。 - ...

    SSH泛型代码实例

    - `DAO(1).rar`可能包含使用泛型的DAO设计模式示例,展示了如何创建泛型DAO以处理不同类型的数据对象。 综上所述,SSH框架结合泛型能够提升Java应用的开发效率和代码质量。通过学习和理解这些示例,开发者可以更好...

    Spring Boot中使用Spring-data-jpa实现数据库增删查改

    通过这种方式,Spring Data JPA会自动为你生成接口的实现,你无需编写任何DAO层的实现类。只需注入Repository接口,就可以直接调用方法进行数据库操作。这种接口式的编程方式极大地提高了代码的可读性和可维护性。 ...

    Spring Data JPA带条件分页查询实现原理

    在Spring Data JPA中,我们通常将自己的DAO接口继承CrudRepository接口和JpaSpecificationExecutor接口。CrudRepository接口主要负责增/删/改的操作,而JpaSpecificationExecutor接口主要负责查询的操作。这两个接口...

    Java_Advanced_17:Spring Data JPA

    Spring Data JPA简化了数据访问层的实现,通过自动化的 Repository 接口实现,使得开发者只需定义接口,而无需编写具体的DAO方法。 3. **Repository接口** Spring Data JPA的关键在于Repository接口,它是数据访问...

    SpringData概述.doc

    1. **代码生成**:Spring Data JPA可以根据接口自动生成实现,减少了手动编写DAO层代码的工作量。 2. **查询自动化**:通过方法命名规则,Spring Data JPA能自动解析方法名并生成相应的JPA查询,如`findAllByTitle...

Global site tag (gtag.js) - Google Analytics