我们在编写Dao层时,免不了会出现大量的重复性代码(增删改查)。这时如果有一个通用的模板来使用,我们就可以达到事半功倍的效果
一、原理说明
1. 编写持久层通用模板BaseDao<T>,编写增删改查方法
2. 编写模板实现类BaseDaoImpl<T>,实现接口方法
3. 编写用户持久层接口与实现类
4. 分别继承通用模板,实现方法
这样做的好处是:
1. 因为所有的pojo模型与数据库交互无非就是增删改查,可以单独进行编码,但这样会出现大量重复性代码
2. 所以抽取通用持久层模板接口,编写通用方法,继承模板接口实现类
3. 难点:如何根据不同的pojo获取不同的泛型呢?
4. 需要动态获取pojo的类型(具体如代码所示)
二、代码
package com.wanghang.T.domain;
import java.io.Serializable;
/**
* 用户模型类
*
* @author Hang.W
* @version 1.0, 2017-03-10 15:06:50
*/
public class UserModel implements Serializable {
private String uid;
private String username;
private String password;
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package com.wanghang.T.basedao;
import java.io.Serializable;
/**
* 带泛型持久层通用模板类接口
*
* @author Hang.W
* @version 1.0, 2017-02-27 00:58:38
*/
public interface BaseDao<T> {
/**
* 添加
*
* @param entity
*/
public void save(T entity);
/**
* 删除
*
* @param entity
*/
public void delete(T entity);
/**
* 修改
*
* @param entity
*/
public void update(T entity);
/**
* 根据id查询对象
*
* @param id 对象id属性
*/
public T findById(Serializable id);
/**
* 保存或修改用户
*
* @param entity 用户对象
*/
public void saveOrUpdate(T entity);
}
package com.wanghang.T.basedao;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* 带泛型持久层通用模板接口实现类
*
* @author Hang.W
* @version 1.0, 2017-02-27 01:01:51
*/
public class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
/** 声明泛型类的类型 */
private Class<T> domainClass;
/**
* 在构造器内获取泛型类型
*/
public BaseDaoImpl() {
// 通过子类获取父类带泛型的字节码文件
ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGenericSuperclass();
// 获取泛型
Type[] actualTypeArguments = genericSuperclass.getActualTypeArguments();
// 获取具体泛型类型
domainClass = (Class<T>) actualTypeArguments[0];
}
@Override
public void save(T entity) {
this.getHibernateTemplate().save(entity);
}
@Override
public void delete(T entity) {
this.getHibernateTemplate().delete(entity);
}
@Override
public void update(T entity) {
this.getHibernateTemplate().update(entity);
}
@Override
public T findById(Serializable id) {
return this.getHibernateTemplate().get(domainClass, id);
}
@Override
public void saveOrUpdate(T entity) {
}
}
package com.wanghang.T.dao;
import com.wanghang.T.basedao.BaseDao;
import com.wanghang.T.domain.UserModel;
/**
* 用户模型持久层接口
*
* @author Hang.W
* @version 1.0, 2017-03-10 15:08:43
*/
public interface UserDao extends BaseDao<UserModel> {
}
package com.wanghang.T.dao;
import java.io.Serializable;
import org.hibernate.Query;
import org.hibernate.Session;
import com.wanghang.T.basedao.BaseDaoImpl;
import com.wanghang.T.domain.UserModel;
/**
* 用户模型持久层接口实现类
*
* @author Hang.W
* @version 1.0, 2017-03-10 15:10:25
*/
public class UserDaoImpl extends BaseDaoImpl<UserModel> implements UserDao {
@Override
public UserModel findById(Serializable id) {
// 获取session
Session session = this.getSession();
// 编写hql语句
String hql = "SELECT u.uid, u.username, u.password FROM UserModel u WHERE id = ?";
// 获取query对象
Query query = session.createQuery(hql);
// 设置参数
query.setParameter(0, id);
// 执行
UserModel user = (UserModel) query.uniqueResult();
return user;
}
@Override
public void saveOrUpdate(UserModel entity) {
}
}