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

    xiaoxiao2021-03-25  135

    我们在编写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) { } }

     

     

     

     

     

     

    转载请注明原文地址: https://ju.6miu.com/read-22027.html

    最新回复(0)