JPA之如何设计一个优雅的DAO
来源:互联网 发布:acitiviti数据库表名 编辑:程序博客网 时间:2024/05/08 22:00
要想使写的代码具有可复用、可维护、易扩展,我们就要面向接口编程。
添删改查,每增加一个模块都要做添删改查,重复代码之多可想而知,不便于维护,虽然我们使用了持久层框架JPA,但也避免不了重复的代码。
如何才能使重复的代码更少些呢?
采用泛型+反射技术。
首先我们定义一个接口
public interface DAO<T> {
/**
* 保存实体
* @param entity 实体对象
*/
public void save(T entity);
/**
* 更新实体
* @param entity 实体对象
*/
public void update(T entity);
/**
* 删除实体
* @param entityId 实体标识
*/
public void delete(Serializable entityId);//JPA 规定实体的id属性必须实现序列化接口
/**
* 获得实体
* @param entityId 实体标识
* @return 实体对象
*/
public T find(Serializable entityId);
/**
* 获取实体的总记录数
* @return 总记录数
*/
public long getCount();
}
实现类:
public class BaseDao<T> implements DAO<T> {
@PersistenceContext
protected EntityManager em;
/* 实体类*/
@SuppressWarnings("unchecked")
protected Class<T> entityClass = GenericsUtils.getSuperClassGenricType(getClass());
@Override
public void save(T entity) {
em.persist(entity);
}
@Override
public void update(T entity) {
em.merge(entity);
}
@Override
public void delete(Serializable entityId) {
em.remove(em.getReference(entityClass, entityId));
}
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public T find(Serializable entityId) {
return em.find(entityClass, entityId);
}
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public long getCount() {
return (Long) em.createQuery("select count(o) from " + getEntityName(this.entityClass) + " o").getSingleResult();
}
/**
* 获取实体名称
* 在方法上使用泛型
* @param entityClass
* @return
*/
protected static <E>String getEntityName(Class<E> entityClass) {
String entityName = entityClass.getSimpleName();
//获得注解的实体类
Entity entity = entityClass.getAnnotation(Entity.class);
// 注解时是否有name属性,如果有,则使用注解时指定的name属性,否则使用类的简单名称
if(entity.name() != null && !"".equals(entity.name())) {
entityName = entity.name();
}
return entityName;
}
}
如何使用:
只需让你开发的模块的接口继承DAO<T>接口,实现类继承BaseDao
例如:
/**
* 用户业务处理接口
* 一定要继承DAO接口,因为是通过接口操作的
* @author zjq
*
*/
public interface BuyerService extends DAO<Buyer>{
}
/**
* 业务处理类
* 交给spring管理
* 并且支持事务,(spring只会对定义在本类的方法应用事务通知,所以把事务放在父类里面)
* @author zjq
*
*/
@Service("buyerService")//spring只会对定义在本类的方法应用事务通知(Advice)
public class BuyerServiceBean extends BaseDao<Buyer> implements BuyerService {
}
- JPA之如何设计一个优雅的DAO
- 一个简单的dao设计
- JPA通用Dao类设计
- JPA通用dao包设计
- 设计一个优雅的登录注册模块
- 如何设计优雅的移动游戏?
- 如何设计优雅的移动游戏?
- 如何优雅的设计 React 组件
- 如何自定义一个优雅的ContentProvider
- 如何创建一个优雅的登录表单
- 如何优雅的关闭一个线程
- C#如何优雅的结束一个线程
- iOS封装浅谈-一句代码弹出actionSheet,如何优雅的设计一个ActionSheetManager
- DAO设计的一个小例子
- 建立使用JPA的DAO
- DAO接口如何设计?
- Java&Android开源库代码剖析】のandroid-async-http(如何设计一个优雅的Android网络请求框架,同...
- SpringBoot之使用Spring-data-jpa更加简单优雅的访问数据库
- illegal instruction qt
- PCA主成分分析
- C/C++ sort函数的用法
- 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)
- python 学习记录
- JPA之如何设计一个优雅的DAO
- 大数据征信应用与启示 ——以美国互联网金融公司 ZestFinance为例
- 深入学习请求响应(一)---response的应用
- linux 文件系统简介
- iis tomcat整合
- 认识CSS
- illegal instruction
- LoadLibrary GetProcAddress FreeLibrary 近距应用
- 使用istanbul做JavaScript的代码覆盖