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方法也做了事物测试过,是有回滚的.