dao持久层通用泛型接口模板

来源:互联网 发布:打印机网络共享器 编辑:程序博客网 时间:2024/05/16 08:11

我们在编写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];}@Overridepublic void save(T entity) {this.getHibernateTemplate().save(entity);}@Overridepublic void delete(T entity) {this.getHibernateTemplate().delete(entity);}@Overridepublic void update(T entity) {this.getHibernateTemplate().update(entity);}@Overridepublic T findById(Serializable id) {return this.getHibernateTemplate().get(domainClass, id);}@Overridepublic 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 {@Overridepublic UserModel findById(Serializable id) {// 获取sessionSession 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;}@Overridepublic void saveOrUpdate(UserModel entity) {}}






0 0
原创粉丝点击