包层结构如下
稍详细:
首先从dao层就可以看到只有简单的一个basedao和basedaoimpl类。不再为每一个实体类各自创建一个一dao层的操作了。不仅用起来简便也减少了许多代码量。
从代码中,你现在可能已经注意到另一个知识点了,注解!因为在service层我会用到basedao,所以在basedao进行注解,在service层需要注册basedao
在basedao的代码如下:
package com.dao;
import java.io.Serializable;
import java.util.List;
/**
* 基础数据库操作类
* @author Pan
*
*/
public interface BaseDao<T> {
/**
* 原生sql
* @param sql
* @return
*/
public List queryBySql(String sql) ;
/**
* 保存一个对象
* @param o
* @return
*/
public Serializable save(T o);
/**
* 删除一个对象
* @param o
*/
public void delete(T o);
/**
* 更新一个对象
* @param o
*/
public void update(T o);
/**
* 保存或更新一个对象
* @param o
*/
public void saveOrUpdate(T o);
/**
* 查询
* @param hql
* @return
*/
public List<T> find(String hql);
public List<T> find(String hql,Object[] param);
public List<T> find(String hql,List<Object> param);
/**
* 带分页的查找
* @param hql
* @param param
* @param page
* @param row
* @return
*/
public List<T> find(String hql,Object[] param ,Integer page,Integer row);
public List<T> find(String hql, List<Object> param, Integer page, Integer rows);
/**
* 获得一个对象
* @param c
* @param id
* @return
*/
public T get(Class<T> c,Serializable id);
public T get(String hql,Object[] param);
public T get(String hql,List<Object>param);
/**
* select count(*) from 类
* @param hql
* @return
*/
public Long count(String hql);
public Long count(String hql,Object[] param);
public Long count(String hql,List<Object> param);
/**
* 执行HQL语句
* @param hql
* @return 返回响应数目
*/
public Integer executeHql(String hql);
public Integer executeHql(String hql,Object[] param);
public Integer executeHql(String hql,List<Object> param);
}
basedaoimpl的代码如下:
package com.dao;
import java.io.Serializable;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Transactional
@Repository("baseDao")
public class BaseDaOImpl<T> implements BaseDao<T> {
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
private Session getCurrentSession() {
return sessionFactory.getCurrentSession();
}
/**
* 原生sql
*/
public List queryBySql(String sql) {
List<Object[]> list = getCurrentSession().createSQLQuery(sql).list();
return list;
}
public Serializable save(T o) {
return this.getCurrentSession().save(o);
}
public void delete(T o) {
this.getCurrentSession().delete(o);
}
public void update(T o) {
this.getCurrentSession().update(o);
}
public void saveOrUpdate(T o) {
this.getCurrentSession().saveOrUpdate(o);
}
public List<T> find(String hql) {
return this.getCurrentSession().createQuery(hql).list();
}
public List<T> find(String hql, Object[] param) {
Query q = this.getCurrentSession().createQuery(hql);
if (param != null && param.length > 0) {
for (int i = 0; i < param.length; i++) {
q.setParameter(i, param[i]);
}
}
return q.list();
}
public List<T> find(String hql, List<Object> param) {
Query q = this.getCurrentSession().createQuery(hql);
if (param != null && param.size() > 0) {
for (int i = 0; i < param.size(); i++) {
q.setParameter(i, param.get(i));
}
}
return q.list();
}
public List<T> find(String hql, Object[] param, Integer page, Integer rows) {
if (page == null || page < 1) {
page = 1;
}
if (rows == null || rows < 1) {
rows = 10;
}
Query q = this.getCurrentSession().createQuery(hql);
if (param != null && param.length > 0) {
for (int i = 0; i < param.length; i++) {
q.setParameter(i, param[i]);
}
}
return q.setFirstResult((page - 1) * rows).setMaxResults(rows).list();
}
public List<T> find(String hql, List<Object> param, Integer page, Integer rows) {
if (page == null || page < 1) {
page = 1;
}
if (rows == null || rows < 1) {
rows = 10;
}
Query q = this.getCurrentSession().createQuery(hql);
if (param != null && param.size() > 0) {
for (int i = 0; i < param.size(); i++) {
q.setParameter(i, param.get(i));
}
}
return q.setFirstResult((page - 1) * rows).setMaxResults(rows).list();
}
public T get(Class<T> c, Serializable id) {
return (T) this.getCurrentSession().get(c, id);
}
public T get(String hql, Object[] param) {
List<T> l = this.find(hql, param);
if (l != null && l.size() > 0) {
return l.get(0);
} else {
return null;
}
}
public T get(String hql, List<Object> param) {
List<T> l = this.find(hql, param);
if (l != null && l.size() > 0) {
return l.get(0);
} else {
return null;
}
}
public Long count(String hql) {
return (Long) this.getCurrentSession().createQuery(hql).uniqueResult();
}
public Long count(String hql, Object[] param) {
Query q = this.getCurrentSession().createQuery(hql);
if (param != null && param.length > 0) {
for (int i = 0; i < param.length; i++) {
q.setParameter(i, param[i]);
}
}
return (Long) q.uniqueResult();
}
public Long count(String hql, List<Object> param) {
Query q = this.getCurrentSession().createQuery(hql);
if (param != null && param.size() > 0) {
for (int i = 0; i < param.size(); i++) {
q.setParameter(i, param.get(i));
}
}
return (Long) q.uniqueResult();
}
public Integer executeHql(String hql) {
return this.getCurrentSession().createQuery(hql).executeUpdate();
}
public Integer executeHql(String hql, Object[] param) {
Query q = this.getCurrentSession().createQuery(hql);
if (param != null && param.length > 0) {
for (int i = 0; i < param.length; i++) {
q.setParameter(i, param[i]);
}
}
return q.executeUpdate();
}
public Integer executeHql(String hql, List<Object> param) {
Query q = this.getCurrentSession().createQuery(hql);
if (param != null && param.size() > 0) {
for (int i = 0; i < param.size(); i++) {
q.setParameter(i, param.get(i));
}
}
return q.executeUpdate();
}
}