1、 这是我们团队小项目中设计的通用BaseDao:
package com.wondertek.mobilevideo.core.interaction.dao;
import java.io.Serializable;
import java.util.List;
import org.springframework.data.repository.NoRepositoryBean;
@NoRepositoryBean
public interface BaseDao<T> {
/**
* 添加实体类
*
* @param t
* @return
*/
public T add(T t);
/**
* 更新实体类
*
* @param t
* @return
*/
public T update(T t);
/**
* 根据主键ID删除实体类
*
* @param id
*/
public void delete(Serializable id);
/**
* 根据JPQL语句更新或删除操作
*
* @param jpql
* @param obj
*/
public int executeUpdate(String jpql, Object... obj);
/**
* 根据主键ID查找单个实体类
*
* @param id
* @return
*/
public T load(Serializable id);
/**
* 根据JPQL语句查询单个实体类
*
* @param jpql
* @param obj(参数可有可无)
* @return
*/
public T load(String jpql, Object... obj);
/**
* 查找所有的实体类
*
* @return
*/
public List<T> findAll();
/**
* 根据JPQL语句查询集合实体类
*
* @param jpql
* @param obj(参数可有可无)
* @return
*/
public List<T> find(String jpql, Object... obj);
/**
* 聚合查询
*
* @param jpql
* @param obj
* @return
*/
public Object findByAggregate(String jpql, Object... obj);
// public int count() ;
/**
* 根据JPQL语句查询记录数
*
* @param jpql
* @param obj
* @return
*/
public int count(String jpql, Object... obj);
/**
* 分页查询集合实体类
*
* @param firstIndex
* @param maxResults
* @return
*/
public List<T> findPage(Integer firstIndex, Integer maxResults);
/**
* 根据JPQL语句查询集合实体类
*
* @param firstIndex
* @param maxResults
* @param jpql
* @param obj
* @return
*/
public List<T> findPage(Integer firstIndex, Integer maxResults, String jpql, Object... obj);
// public Page findPage(Page page,String jpql,Object... obj);
/**
* 执行原生的sql
*
* @param nativeSql
* @param obj
* @return
*/
public List nativeQuery(String nativeSql, Object... obj);
}
2、 BaseDao的基础实现类AbstractBaseDao:
package com.wondertek.mobilevideo.core.interaction.dao.impl;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.repository.NoRepositoryBean;
import com.wondertek.mobilevideo.core.interaction.dao.BaseDao;
@NoRepositoryBean
public class AbstractBaseDao<T> implements BaseDao<T> {
private Logger log = LoggerFactory.getLogger(this.getClass());
// private EntityManager entityManager;
@PersistenceContext
private EntityManager em;
private Class<T> clazz = null;
public AbstractBaseDao() {
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
this.clazz = (Class<T>) pt.getActualTypeArguments()[0];
}
@Override
public T add(T t) {
em.persist(t);
return t;
}
@Override
public T update(T t) {
return em.merge(t);
}
@Override
public void delete(Serializable id) {
T t = em.getReference(clazz, id);
em.remove(t);
}
@Override
public int executeUpdate(String jpql, Object... obj) {
Query query = em.createQuery(jpql);
if (obj.length > 0) {
for (int i = 0; i < obj.length; i++) {
// query.setParameter((i + 1), obj[i]);
query.setParameter(i, obj[i]);
}
}
return query.executeUpdate();
}
@Override
public T load(Serializable id) {
return em.find(clazz, id);
}
@Override
public T load(String jpql, Object... obj) {
try {
Query query = em.createQuery(jpql);
if (obj.length > 0) {
for (int i = 0; i < obj.length; i++) {
// query.setParameter((i + 1), obj[i]);
query.setParameter(i, obj[i]);
}
}
return (T) query.getSingleResult();
} catch (Exception e) {
return null;
}
}
@Override
public List<T> findAll() {
return em.createQuery("from " + clazz.getSimpleName()).getResultList();
}
@Override
public List<T> find(String jpql, Object... obj) {
try {
Query query = em.createQuery(jpql);
if (obj.length > 0) {
for (int i = 0; i < obj.length; i++) {
// query.setParameter((i + 1), obj[i]);
query.setParameter(i, obj[i]);
}
}
return query.getResultList();
} catch (Exception e) {
return null;
}
}
@Override
public Object findByAggregate(String jpql, Object... obj) {
Query query = em.createQuery(jpql);
if (obj.length > 0) {
for (int i = 0; i < obj.length; i++) {
// query.setParameter((i + 1), obj[i]);
query.setParameter(i, obj[i]);
}
}
Object result = query.getSingleResult();
return result;
}
/*
* @Override public int count() { Long num = (Long) em.createQuery(
* "select count(*) from "+clazz.getSimpleName()).getSingleResult(); return
* num.intValue(); }
*/
@Override
public int count(String jpql, Object... obj) {
try {
Query query = em.createQuery(jpql);
if (obj.length > 0) {
for (int i = 0; i < obj.length; i++) {
// query.setParameter((i + 1), obj[i]);
query.setParameter(i, obj[i]);
}
}
Long num = (Long) query.getSingleResult();
return num.intValue();
} catch (Exception e) {
return 0;
}
}
@SuppressWarnings("unchecked")
@Override
public List<T> findPage(Integer firstIndex, Integer maxResults) {
return em.createQuery("from " + clazz.getSimpleName()).setFirstResult(firstIndex).setMaxResults(maxResults)
.getResultList();
}
@SuppressWarnings("unchecked")
@Override
public List<T> findPage(Integer firstIndex, Integer maxResults, String jpql, Object... obj) {
try {
Query query = em.createQuery(jpql);
if (obj.length > 0) {
for (int i = 0; i < obj.length; i++) {
// query.setParameter((i + 1), obj[i]);
query.setParameter(i, obj[i]);
}
}
query.setFirstResult(firstIndex).setMaxResults(maxResults);
return query.getResultList();
} catch (Exception e) {
return new ArrayList();
}
}
@Override
public List nativeQuery(String nativeSql, Object... obj) {
try {
Query query = em.createNativeQuery(nativeSql);
if (obj.length > 0) {
for (int i = 0; i < obj.length; i++) {
// 原生sql i+1
query.setParameter((i + 1), obj[i]);
}
}
return query.getResultList();
} catch (Exception e) {
return null;
}
}
// @Override
// public Page<T> findPage(Page page, String jpql, Object... obj) {
// Query query = em.createQuery(jpql);
// if (obj.length > 0) {
// for (int i = 0; i < obj.length; i++) {
// query.setParameter((i + 1), obj[i]);
// }
// }
// int total = ((Long) query.getSingleResult()).intValue();
// page.setItemTotal(total);
// query.setFirstResult(page.getFirstIndex()).setMaxResults(page.getPageCount());
// List<T> list = query.getResultList();
// page.setItems(list);
// return page;
// }
}
这里我们AbstractBaseDao设计为abstract ,因为我们不想让他被实例化。IOC作为Spring中的核心技术之一使用它可以实现完全的面向接口编程,所以我们需要设计接口。这样我们就可以在service层中使用接口注入。
3、现在我们来设计接口,如果我现在想要做一个订单的持久层OrderDao要怎么做。
public interface OrderDao extends BaseDao<Order> {
List<Order> findOrderByStoreId(String storeId);
List<Order> findOrderByStatus(String storeId,Integer status);
int getActiveOrderCount(String storeId);
int getNewOrderCount(String storeId);
int getOrderCount(String storeId);
List<Order> findOrderByStoreId(String storeId,Integer page, Integer pageSize);
List<Order> findOrderByStatus(String storeId, Integer status, Integer page, Integer pageSize);
int getOrderByStatusCount(String storeId, Integer status);
}
4、然后写一个实现OrderDao的OrderDaoImpl:这样就可以完全实现面向接口编程。
@Repository
public class OrderDaoImpl extends AbstractBaseDao<Order> implements OrderDao {
public List<Order> findOrderByStoreId(String storeId){
List<Order> orders = this.find("SELECT o FROM Order o WHERE o.storeId = ? order by o.createTime desc", storeId);
return orders;
}
@Override
public List<Order> findOrderByStatus(String storeId,Integer status) {
List<Order> orders = this.find("SELECT o FROM Order o WHERE o.storeId = ? and o.status = ? order by o.createTime desc", storeId, status);
return orders;
}
@Override
public int getActiveOrderCount(String storeId) {
return this.count("SELECT count(o) FROM Order o WHERE o.storeId = ? and o.status in (1,2)", storeId);
}
@Override
public int getNewOrderCount(String storeId) {
return this.count("SELECT count(o) FROM Order o WHERE o.storeId = ? and o.status = 0", storeId);
}
@Override
public int getOrderCount(String storeId) {
return this.count("SELECT count(o) FROM Order o WHERE o.storeId = ?", storeId);
}
@Override
public List<Order> findOrderByStoreId(String storeId, Integer page, Integer pageSize) {
return this.findPage((page -1) * pageSize, pageSize, "SELECT o FROM Order o WHERE o.storeId = ? order by o.createTime desc, o.id", storeId);
}
@Override
public List<Order> findOrderByStatus(String storeId, Integer status, Integer page, Integer pageSize) {
return this.findPage((page -1) * pageSize, pageSize, "SELECT o FROM Order o WHERE o.storeId = ? and o.status = ? order by o.createTime desc, o.id", storeId, status);
}
@Override
public int getOrderByStatusCount(String storeId, Integer status) {
return this.count("SELECT count(o) FROM Order o WHERE o.storeId = ? and o.status = ?", storeId, status);
}
}
然后我们在service层中就可以直接注入。
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderDao orderDao;
//.....
}
这样就可以完全实现面向接口编程。
原文地址:https://blog.csdn.net/cckevincyh/article/details/81417446