利用泛型、反射、JPA、Spring技术实现增删改查通用类

本文介绍了如何通过定义DAO接口及其实现类,利用泛型、反射和Spring的JPA,创建一个可以进行增删改查操作的通用类。通过抽象基类`DaoSupport`,实现了`save`, `update`, `delete`, `find`和`getCount`方法,简化了业务操作类的编写。示例中展示了具体的接口、实现类、业务操作接口及其实现,以及测试类的代码结构。" 104336115,9323492,帆软报表自动填充用户姓名教程,"['数据库', '大数据', '程序人生', '经验分享', '数据填报']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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());
 }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值