利用泛型、反射、JPA、Spring技术实现增删改查通用类
2012-06-24 09:45
337 查看
1、定义接口
package cn.joeho.base;
import java.io.Serializable;
public interface DAO<T> {
public String getSubClass();
public Class<T> getEntityClass();
public void save(T entity);
public void update(T entity);
public void delete(Serializable id);
public T find(Serializable id);
public long getCount();
}
2、接口的实现类
package cn.joeho.base;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public abstract class DaoSupport<T> implements DAO<T> {
@PersistenceContext protected EntityManager em;
protected Class<T> entityClass=getEntityClass();
@Override
public String getSubClass(){
return super.getClass().getName();
}
@Override
public Class<T> getEntityClass(){
Type parentType =getClass().getGenericSuperclass();
if(parentType instanceof ParameterizedType){
ParameterizedType type=(ParameterizedType)parentType;
return (Class<T>)type.getActualTypeArguments()[0];
}
return null;
}
public String getEntityName(){
String entityName=this.entityClass.getSimpleName();
Entity entity=this.entityClass.getAnnotation(Entity.class);
String ename=entity.name();
if(ename!=null&&!"".equals(ename)){
entityName=ename;
}
return entityName;
}
@Override
public void save(T entity) {
em.persist(entity);
}
@Override
public void update(T entity) {
em.merge(entity);
}
@Override
public void delete(Serializable id) {
em.remove(em.getReference(entityClass, id));
}
@Override
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public T find(Serializable id) {
return em.find(entityClass, id);
}
@Override
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public long getCount() {
return (Long) em.createQuery("select count(o) from "+getEntityName()+" o").getSingleResult();
}
}
3、业务操作类接口
package cn.joeho.service;
import cn.joeho.base.DAO;
import cn.joeho.entity.Buyer;
public interface BuyerService extends DAO<Buyer>{
}
4、业务操作类实现
package cn.joeho.service.impl;
import org.springframework.stereotype.Service;
import cn.joeho.base.DaoSupport;
import cn.joeho.entity.Buyer;
import cn.joeho.service.BuyerService;
@Service
public class BuyerServiceBean extends DaoSupport<Buyer> implements BuyerService {
}
5、测试类
package junit.test;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.joeho.entity.Buyer;
import cn.joeho.service.BuyerService;
public class BuyerTest {
public static ApplicationContext act =null;
public static BuyerService buyerService = null;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
act = new ClassPathXmlApplicationContext("beans.xml");
buyerService=(BuyerService)act.getBean("buyerServiceBean");
}
@Test
public void aaa(){
System.out.println(buyerService.getSubClass());
}
@Test
public void save(){
Buyer buyer=new Buyer();
buyer.setName("xupeng1");
buyer.setPassword("123344");
buyer.setEmail("xupeng@hotmail.com");
buyerService.save(buyer);
}
@Test
public void update(){
Buyer buyer=new Buyer();
buyer.setName("lisi");
buyer.setPassword("123456");
buyer.setEmail("xupeng@hotmail.com");
buyerService.update(buyer);
}
@Test
public void delete(){
buyerService.delete("xupeng1");
}
@Test
public void find(){
Buyer buyer=buyerService.find("xupeng");
System.out.println(buyer.getName()+"="+buyer.getEmail());
}
@Test
public void count(){
System.out.println(buyerService.getCount());
}
}
package cn.joeho.base;
import java.io.Serializable;
public interface DAO<T> {
public String getSubClass();
public Class<T> getEntityClass();
public void save(T entity);
public void update(T entity);
public void delete(Serializable id);
public T find(Serializable id);
public long getCount();
}
2、接口的实现类
package cn.joeho.base;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public abstract class DaoSupport<T> implements DAO<T> {
@PersistenceContext protected EntityManager em;
protected Class<T> entityClass=getEntityClass();
@Override
public String getSubClass(){
return super.getClass().getName();
}
@Override
public Class<T> getEntityClass(){
Type parentType =getClass().getGenericSuperclass();
if(parentType instanceof ParameterizedType){
ParameterizedType type=(ParameterizedType)parentType;
return (Class<T>)type.getActualTypeArguments()[0];
}
return null;
}
public String getEntityName(){
String entityName=this.entityClass.getSimpleName();
Entity entity=this.entityClass.getAnnotation(Entity.class);
String ename=entity.name();
if(ename!=null&&!"".equals(ename)){
entityName=ename;
}
return entityName;
}
@Override
public void save(T entity) {
em.persist(entity);
}
@Override
public void update(T entity) {
em.merge(entity);
}
@Override
public void delete(Serializable id) {
em.remove(em.getReference(entityClass, id));
}
@Override
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public T find(Serializable id) {
return em.find(entityClass, id);
}
@Override
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public long getCount() {
return (Long) em.createQuery("select count(o) from "+getEntityName()+" o").getSingleResult();
}
}
3、业务操作类接口
package cn.joeho.service;
import cn.joeho.base.DAO;
import cn.joeho.entity.Buyer;
public interface BuyerService extends DAO<Buyer>{
}
4、业务操作类实现
package cn.joeho.service.impl;
import org.springframework.stereotype.Service;
import cn.joeho.base.DaoSupport;
import cn.joeho.entity.Buyer;
import cn.joeho.service.BuyerService;
@Service
public class BuyerServiceBean extends DaoSupport<Buyer> implements BuyerService {
}
5、测试类
package junit.test;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.joeho.entity.Buyer;
import cn.joeho.service.BuyerService;
public class BuyerTest {
public static ApplicationContext act =null;
public static BuyerService buyerService = null;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
act = new ClassPathXmlApplicationContext("beans.xml");
buyerService=(BuyerService)act.getBean("buyerServiceBean");
}
@Test
public void aaa(){
System.out.println(buyerService.getSubClass());
}
@Test
public void save(){
Buyer buyer=new Buyer();
buyer.setName("xupeng1");
buyer.setPassword("123344");
buyer.setEmail("xupeng@hotmail.com");
buyerService.save(buyer);
}
@Test
public void update(){
Buyer buyer=new Buyer();
buyer.setName("lisi");
buyer.setPassword("123456");
buyer.setEmail("xupeng@hotmail.com");
buyerService.update(buyer);
}
@Test
public void delete(){
buyerService.delete("xupeng1");
}
@Test
public void find(){
Buyer buyer=buyerService.find("xupeng");
System.out.println(buyer.getName()+"="+buyer.getEmail());
}
@Test
public void count(){
System.out.println(buyerService.getCount());
}
}
相关文章推荐
- 2、利用反射技术得到泛型类型,实现对实体添删改查操作进行代码重用设计
- SpringBoot第二讲 利用Spring Data JPA实现数据库的访问(一)
- flex4 + spring + blazeds , 使用anonation(注解)机制,利用push技术的实现例子和过程。
- 利用JDK的中Proxy动态代理实现Spring的AOP技术
- 利用反射技术实现POJO的数据库操作
- SpringBoot第二讲 利用Spring Data JPA实现数据库的访问(二)_分页和JpaSpecificationExecutor接口介绍
- winform中利用反射实现泛型数据访问对象基类(3)
- 利用Java的反射、泛型以及动态参数实现JDBC工具类
- flex4 + spring + blazeds , 使用anonation(注解)机制,利用push技术的实现例子和过程。
- java 学习笔记--利用反射实现泛型数组的复制
- 利用反射实现mysql数据库sql查询 返回List<E>泛型(持久化)对象
- 黑马程序员-- TCP协议程序,多线程的并发上传,反射技术,反射由来,反射实现通过配置文件运行程序,反射的泛型擦除。
- SpringBoot第二讲利用Spring Data JPA实现数据库的访问(二)_分页和JpaSpecificationExecutor接口介绍
- 利用泛型、自定义注解和反射实现PO与VO的快捷转换
- 利用Java的反射实现spring的IOC(推荐!!!)
- 利用spring+ibatiS技术,在spring中配置多个数据源,并实现动态切换。
- 用反射技术实现将泛型集合类中的数据导出成EXCEL
- android---利用反射实现的屏幕录制技术
- Android 中利用反射技术实现加减乘除
- 利用Java反射解决Spring Data JPA繁琐更新操作