DAO层使用泛型的两种方式
生活随笔
收集整理的這篇文章主要介紹了
DAO层使用泛型的两种方式
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.DAO層使用泛型類(lèi),主要是定義一些通用的增刪改查,然后其他DAO的類(lèi)都來(lái)繼承該類(lèi),通過(guò)構(gòu)造方法將class對(duì)象傳給該泛型類(lèi)
定義泛型接口
package sanitation.dao;import java.util.List;
/**
*
* @param <T>
*/
public interface GenericDAO <T>{
/**
* 通過(guò)ID獲得實(shí)體對(duì)象
*
* @param id實(shí)體對(duì)象的標(biāo)識(shí)符
* @return 該主鍵值對(duì)應(yīng)的實(shí)體對(duì)象
*/
T findById(int id);
/**
* 將實(shí)體對(duì)象持久化
*
* @param entity 需要進(jìn)行持久化操作的實(shí)體對(duì)象
* @return 持久化的實(shí)體對(duì)象
*/
T makePersitent(T entity);
/**
* 將實(shí)體變?yōu)樗矐B(tài)
*
* @param entity需要轉(zhuǎn)變?yōu)樗矐B(tài)的實(shí)體對(duì)象
*/
void makeTransient(T entity);
/**
* 將一系列的實(shí)體變?yōu)樗矐B(tài),使用本地sql
*
* @param hql
*/
void makeTransientByIds(String sql);
/**
*
* 使用hql語(yǔ)句進(jìn)行分頁(yè)操作
*
* @param hql
* @param offset 第一條記錄索引
* @param pageSize 每頁(yè)需要顯示的記錄數(shù)
* @return 查詢(xún)的記錄
*/
List<T> findByPage(final String hql,final int offset,final int pageSize);
/**
* 使用hql 語(yǔ)句進(jìn)行分頁(yè)查詢(xún)操作
*
* @param hql 需要查詢(xún)的hql語(yǔ)句
* @param value 如果hql有一個(gè)參數(shù)需要傳入,value就是傳入的參數(shù)
* @param offset 第一條記錄索引
* @param pageSize 每頁(yè)需要顯示的記錄數(shù)
* @return 當(dāng)前頁(yè)的所有記錄
*/
List<T> findByPage(final String hql , final Object value ,
final int offset, final int pageSize);
/**
* 使用hql 語(yǔ)句進(jìn)行分頁(yè)查詢(xún)操作
*
* @param hql 需要查詢(xún)的hql語(yǔ)句
* @param values 如果hql有一個(gè)參數(shù)需要傳入,value就是傳入的參數(shù)
* @param offset 第一條記錄索引
* @param pageSize 每頁(yè)需要顯示的記錄數(shù)
* @return 當(dāng)前頁(yè)的所有記錄
*/
List<T> findByPage(final String hql, final Object[] values,
final int offset, final int pageSize);
/**
* 使用sql 語(yǔ)句進(jìn)行分頁(yè)查詢(xún)操作
*
* @param sql
* @param offset
* @param pageSize
* @return
*/
List findByPageSQL(final String sql,
final int offset, final int pageSize);
/**
* 根據(jù)語(yǔ)句查找總數(shù)
* @param hql hql語(yǔ)句
* @return 對(duì)應(yīng)的數(shù)目
*/
Integer getCount(String hql);
void updateObj(final String hql,final Object[] values);
}
定義實(shí)現(xiàn)類(lèi)
package sanitation.dao.impl;import java.sql.SQLException;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import sanitation.dao.GenericDAO;
public class GenericHibernateDAO<T> extends HibernateDaoSupport
implements GenericDAO<T>{
private Class<T> persistentClass;
public GenericHibernateDAO(Class<T> persistentClass){
this.persistentClass=persistentClass;
}
public Class<T> getPersistentClass(){
return persistentClass;
}
@SuppressWarnings("unchecked")
public T findById(int id) {
return (T)getHibernateTemplate().get(getPersistentClass(), id);
}
@SuppressWarnings("unchecked")
public List<T> findByPage(final String hql,
final int offset, final int pageSize){
List<T> list= getHibernateTemplate().executeFind(new HibernateCallback(){
public Object doInHibernate(final Session session)
throws HibernateException, SQLException{
Query query=session.createQuery(hql);
if(!(offset==0 && pageSize==0)){
query.setFirstResult(offset).setMaxResults(pageSize);
}
List<T> result = query.list();
return result;
}
});
return list;
}
@SuppressWarnings("unchecked")
public List findByPageSQL(final String sql,
final int offset, final int pageSize){
List list= getHibernateTemplate().executeFind(new HibernateCallback(){
public Object doInHibernate(final Session session)
throws HibernateException, SQLException{
Query query=session.createSQLQuery(sql);
if(!(offset==0 && pageSize==0)){
query.setFirstResult(offset).setMaxResults(pageSize);
}
List result = query.list();
return result;
}
});
return list;
}
@SuppressWarnings("unchecked")
public List<T> findByPage(final String hql, final Object value,
final int offset, final int pageSize) {
List<T> list = getHibernateTemplate().executeFind(new HibernateCallback()
{
public Object doInHibernate(Session session)
throws HibernateException, SQLException
{
Query query=session.createQuery(hql).setParameter(0, value);
if(!(offset==0 && pageSize==0)){
query.setFirstResult(offset).setMaxResults(pageSize);
}
List<T> result = query.list();
return result;
}
});
return list;
}
@SuppressWarnings("unchecked")
public List<T> findByPage(final String hql, final Object[] values, final int offset,
final int pageSize) {
List<T> list = getHibernateTemplate().executeFind(new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException{
Query query=session.createQuery(hql);
for (int i = 0 ; i < values.length ; i++){
query.setParameter( i, values[i]);
}
if(!(offset==0 && pageSize==0)){
query.setFirstResult(offset).setMaxResults(pageSize);
}
List<T> result = query.list();
return result;
}
});
return list;
}
public void updateObj(final String hql, final Object[] values) {
getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException{
Query query=session.createQuery(hql);
for(int i=0;i<values.length;i++){
query.setParameter( i, values[i]);
}
query.executeUpdate();
return null;
}
});
}
public Integer getCount(String hql) {
Integer count;
//iterate方法與list方法的區(qū)別是list取出全部,iterator取出主鍵,迭代的時(shí)候才取出數(shù)據(jù)
count = ((Long)getHibernateTemplate().iterate(hql).next()).intValue();
return count;
}
public T makePersitent(T entity) {
getHibernateTemplate().saveOrUpdate(entity);
return entity;
}
public void makeTransient(T entity) {
getHibernateTemplate().delete(entity);
}
public void makeTransientByIds(final String sql) {
getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException{
Query query=session.createQuery(sql);
query.executeUpdate();
return null;
}
});
}
}
2.而有時(shí)我們?yōu)榱朔奖闫鹨?jiàn),對(duì)于一些簡(jiǎn)單的項(xiàng)目,DAO的操作很單一,不會(huì)有很復(fù)雜的操作,那么我們直接用泛型方法類(lèi)代替泛型類(lèi),主要就不需要寫(xiě)其他的DAO來(lái)繼承,
整個(gè)DAO層就一個(gè)DAO類(lèi)。
接口:
package com.xidian.dao;import java.util.List;
import com.xidian.bean.Admin;
import com.xidian.bean.HostIntroduce;
import com.xidian.bean.Reply;
public interface CommonDAO {
public <T> void sava(T entity); //保存用戶,無(wú)返回值;
public <T> void remove(T entity); //刪除用戶
public <T> void update(T entity); //更新用戶
public <T> T findById(Class<T> entityClass, Integer id); //通過(guò)id來(lái)查找某一個(gè)用戶;
public <T> List<T> findAll(Class<T> entityclass); //使用范型List<>,查詢(xún)所有的用戶信息
}
實(shí)現(xiàn)類(lèi):
package com.xidian.dao.impl;import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.xidian.bean.Admin;
import com.xidian.bean.HostIntroduce;
import com.xidian.bean.Reply;
import com.xidian.dao.CommonDAO;
public class CommonDAOImpl extends HibernateDaoSupport implements CommonDAO {
@SuppressWarnings("unchecked")
@Override
public <T> List<T> findAll(Class<T> entityclass) {
//String name = entity.getClass().getName();
String hql = "from "+entityclass.getName()+" as aaa order by aaa.id desc";
return this.getHibernateTemplate().find(hql);
}
@SuppressWarnings("unchecked")
@Override
public <T> T findById(Class<T> entityClass, Integer id) {
return (T) this.getHibernateTemplate().get(entityClass, id);
}
@Override
public <T> void remove(T entity) {
this.getHibernateTemplate().delete(entity);
}
@Override
public <T> void sava(T entity) {
this.getHibernateTemplate().save(entity);
}
@Override
public <T> void update(T entity) {
this.getHibernateTemplate().update(entity);
}
}
使用泛型可以使代碼大大的精簡(jiǎn)
?
轉(zhuǎn)載于:https://www.cnblogs.com/shenliang123/archive/2012/04/05/2433134.html
總結(jié)
以上是生活随笔為你收集整理的DAO层使用泛型的两种方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jQuery Mobile 笔记(1)-
- 下一篇: Silverlight中服务通信方式的选