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&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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值