Spring DAO设计

IBaseDao.java

package com.cdg.idao;

import java.util.List;

public interface IBaseDao<M extends java.io.Serializable, PK extends java.io.Serializable> {
    
    public PK save(M model);

    public void saveOrUpdate(M model);
    
    public void update(M model);
    
    public void merge(M model);

    public void delete(PK id);

    public void deleteObject(M model);

    public M get(PK id);
    
    public int countAll();

    public List<M> listAll();

    public List<M> listAll(int pn, int pageSize);
}

BaseDao.java

package com.cdg.idao.impl;

import java.lang.reflect.ParameterizedType;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.cdg.idao.IBaseDao;

public abstract class BaseDao<M extends java.io.Serializable, PK extends java.io.Serializable>
		implements IBaseDao<M, PK> {

	private final Class<M> entityClass;

	@SuppressWarnings("unchecked")
	public BaseDao() {
		this.entityClass = (Class<M>) ((ParameterizedType) getClass()
				.getGenericSuperclass()).getActualTypeArguments()[0];
	}

	@Autowired
	@Qualifier("sessionFactory")
	private SessionFactory sessionFactory;

	public Session getSession() {
		// 事务必须是开启的(Required),否则获取不到
		return sessionFactory.getCurrentSession();
	}

	@SuppressWarnings("unchecked")
	@Override
	public PK save(M model) {
		return (PK) getSession().save(model);
	}

	@Override
	public void saveOrUpdate(M model) {
		getSession().saveOrUpdate(model);
	}

	@Override
	public void update(M model) {
		getSession().update(model);

	}

	@Override
	public void merge(M model) {
		getSession().merge(model);
	}

	@Override
	public void delete(PK id) {
		getSession().delete(this.get(id));

	}

	@Override
	public void deleteObject(M model) {
		getSession().delete(model);

	}

	@SuppressWarnings("unchecked")
	@Override
	public M get(PK id) {
		return (M) getSession().get(this.entityClass, id);
	}

	@Override
	public int countAll() {
		return aggregate("");
	}

	@SuppressWarnings("unchecked")
	protected <T> T aggregate(final String hql, final Object... paramlist) {
		Query query = getSession().createQuery(hql);
		setParameters(query, paramlist);
		return (T) query.uniqueResult();
	}

	protected void setParameters(Query query, Object[] paramlist) {
		if (paramlist != null) {
			for (int i = 0; i < paramlist.length; i++) {
				if (paramlist[i] instanceof Date) {
					// TODO 难道这是bug 使用setParameter不行??
					query.setTimestamp(i, (Date) paramlist[i]);
				} else {
					query.setParameter(i, paramlist[i]);
				}
			}
		}
	}

	@Override
	public List<M> listAll() {
		return list("");
	}

	@Override
	public List<M> listAll(int pn, int pageSize) {
		Object[] obj = null;
		return list("", pn, pageSize, obj);
	}
	
	protected <T> List<T> list(final String sql, final Object... paramlist) {
		return list(sql, -1, -1, paramlist);
	}
	@SuppressWarnings("unchecked")
	protected <T> List<T> list(final String hql, final int pn,
			final int pageSize, final Object... paramlist) {
		Query query = getSession().createQuery(hql);
		setParameters(query, paramlist);
		if (pn > -1 && pageSize > -1) {
			query.setMaxResults(pageSize);
			int start = 0;//PageUtil.getPageStart(pn, pageSize);
			if (start != 0) {
				query.setFirstResult(start);
			}
		}
		if (pn < 0) {
			query.setFirstResult(0);
		}
		List<T> results = query.list();
		return results;
	}

}

上面是DAO工具类,目前很多公司都是这么设计的,很通用.

下面是继承使用的类业务类

IUserDao.java  这里也必须继承工具DAO接口

package com.cdg.idao;

import com.cdg.bean.UserModel;

public interface IUserDao extends IBaseDao<UserModel, Integer>{

	UserModel loadUserBy(UserModel user);

}

UserDao.java 这里面可以实现一些特殊定义的方法,公共的简单方法在继承工具DAO类已经全部实现了,直接调用即可.

package com.cdg.idao.impl;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import com.cdg.bean.UserModel;
import com.cdg.idao.IUserDao;
@Repository("UserDao")
public class UserDao extends BaseDao<UserModel, Integer> implements IUserDao {

	/* (non-Javadoc)
	 * @see com.cdg.idao.IUserDao#loadUserBy(com.cdg.bean.UserModel)
	 */
	@SuppressWarnings("unchecked")
	@Override
	public UserModel loadUserBy(UserModel user) {
//		DetachedCriteria criteria = DetachedCriteria.forClass(UserModel.class);
//		if (null != user) {
//			if (null != user.getUsername()) {
//				criteria.add(Restrictions.eq("username", user.getUsername()));
//			}
//			if (null != user.getPassword()) {
//				criteria.add(Restrictions.eq("password", user.getPassword()));
//			}
//			List<UserModel> list = 
//			if (list.iterator().hasNext()) {
//				return list.iterator().next();
//			}
//		}
		return super.get(user.getId());
	}


}
UserModel.java  数据库实体类全部用注解,很方便,里面有个开启二级缓存的注解,这个在上一篇文章有配置. 这个实体类必须实现序列化接口.因为工具DAO已经指定了
package com.cdg.bean;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

@Entity
@Table(name = "tbl_user")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class UserModel implements java.io.Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", nullable = false)
    private int id;
    
    
    private String username;
    
    private String email;
    
    private String password;
    
    private Date registerDate;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

    public Date getRegisterDate() {
        return registerDate;
    }
    
    public void setRegisterDate(Date registerDate) {
        this.registerDate = registerDate;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        UserModel other = (UserModel) obj;
        if (id != other.id)
            return false;
        return true;
    }
    
    
    
}

biz/service方法

IUserService.java

package com.cdg.iservice;

import com.cdg.bean.UserModel;

public interface IUserService {

	public UserModel loadUserBy(UserModel user);
	
	public void saveUser();
}
UserService.java 全都是注解,以后几乎不会去配置xml了
package com.cdg.iservice.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import com.cdg.bean.UserModel;
import com.cdg.idao.IUserDao;
import com.cdg.iservice.IUserService;

@Service("UserService")
public class UserService implements IUserService {
	@Autowired
	@Qualifier("UserDao")
	private IUserDao userDao;

	public void setUserDao(IUserDao userDao) {
		this.userDao = userDao;
	}

	@Override
	public UserModel loadUserBy(UserModel user) {
		// TODO Auto-generated method stub
		return userDao.get(user.getId());
	}

	public void saveUser() {
		UserModel user1 = new UserModel();
		user1.setEmail("1111");
		user1.setUsername("1111");
		userDao.save(user1);
		
		UserModel user2 = new UserModel();
		user2.setEmail("2222");
		user2.setUsername("2222");
		userDao.save(user2);
	}

}

saveXxx方法也做了事物测试过,是有回滚的.
发布了52 篇原创文章 · 获赞 12 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/caodegao/article/details/43566239
今日推荐