java中继承+接口+泛型的无解组合

来源:互联网 发布:北京搜索引擎优化 编辑:程序博客网 时间:2024/05/16 09:32

不废话直接上代码:

 

工程结构图:

 

实体User:

package com.smonk.user.entity;public class User {//....}


IBaseDao:

package com.smonk.common.base;import java.io.Serializable;import java.util.List;public interface IBaseDao<T, ID extends Serializable> { public abstract List<T> findAll(); /**  * 查找所有,并分页  * @param page 要返回的页数  * @param pageSize 没有记录数  * @return  */ public abstract List<T> findAll(int page, int pageSize); public abstract void save(T entity); public abstract void delete(T entity); /**  * 与findByProperty相似,当properyName == value 时把相应的记录删除  */ public abstract void deleteByProperty(String propertyName, Object value); public abstract List<T> findByExample(T example); /**  * 通过属性查找  * @param propertyName 属性名称  * @param value 属性的值  * @return  */ public abstract List<T> findByProperty(String propertyName, Object value); /**  * 通过多个属性查找  * @param propertyNames 属性名称数组  * @param values 属性值数组  * @return  */ public abstract List<T> findByPropertys(String[] propertyNames,   Object[] values); /**  * 通过多个属性查找,并分页, 属性名称数组和属性值数组的序列要对应  *   * @param propertyNames 属性名称数组  * @param values 属性值数组  * @param page 页码  * @param pageSize 每页内容条数  * @return  */ public List<T> findByPropertys(String[] propertyNames, Object[] values,   int page, int pageSize); /**  * 通过属性查找,并分页, 属性名称数组和属性值数组的序列要对应  * @param propertyNames 属性名称  * @param values 属性值  * @param page 页码  * @param pageSize 每页内容条数  * @return  */ public List<T> findByProperty(String propertyName, Object value, int page,   int pageSize); /**  * 统计所有记录的总数  * @return 总数  */ public int countAll(); /**  * 统计数据库中当propertyName=value时的记录总数  * @param propertyName  * @param value  * @return  */ public int countByProperty(String propertyName, Object value); /**  * 统计数据库中当多个propertyName=value时的记录总数  * @param propertyNames  * @param values  * @return  */ public int countByPropertys(String[] propertyNames, Object[] values); public abstract void saveOrUpdate(T entity); public abstract T findById(ID id); public abstract void update(T entity); /**  * 获得持久化对象的类型  * @return  */ public abstract Class<T> getPersistentClass(); /**  * 查找并通过某一属性排序  * @param property 排序依据的顺序  * @param isSequence 是否顺序排序  */ public List<T> findAndOrderByProperty(int firstResult, int fetchSize,   String propertyName, boolean isSequence); /**  * 查找并通过某一属性排序  * @param property 排序依据的顺序  * @param isSequence 是否顺序排序  */ public List<T> findAllAndOrderByProperty(String propertyName,   boolean isSequence);}


 

BaseHibernateDao:

package com.smonk.common.base;import java.io.Serializable;import java.lang.reflect.ParameterizedType;import java.util.List;import org.hibernate.Query;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public abstract class BaseHibernateDao<T, ID extends Serializable> extendsHibernateDaoSupport implements IBaseDao<T, ID> {private Class<T> persistentClass;@SuppressWarnings("unchecked")public BaseHibernateDao() {// 获取持久化对象的类型this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];}public Class<T> getPersistentClass() {return persistentClass;}/** * 通过id查找 * @param id * @return */@SuppressWarnings("unchecked")public T findById(ID id) {return (T) this.getHibernateTemplate().get(getPersistentClass(), id);}public void save(T entity) {this.getHibernateTemplate().save(entity);}/** * 删除 */public void delete(T entity) {this.getHibernateTemplate().delete(entity);}/** * 通过属性删除 */public void deleteByProperty(String propertyName, Object value) {String queryString = "delete from " + getPersistentClass().getName()+ " as model where model." + propertyName + "= ?";Query query = this.getSession().createQuery(queryString);query.setParameter(0, value);query.executeUpdate();}/** * saveOrUpdate */public void saveOrUpdate(T entity) {this.getHibernateTemplate().saveOrUpdate(entity);}/** * 更新 */public void update(T entity) {this.getHibernateTemplate().update(entity);}/** * 分页查找所有的记录 * @param page 要返回的页数 * @param pageSize 没有记录数 * @return */public List<T> findAll(int page, int pageSize) {String queryString = "from " + getPersistentClass().getName();Query query = this.getSession().createQuery(queryString);int firstResult = (page - 1) * pageSize;query.setFirstResult(firstResult);query.setMaxResults(pageSize);return query.list();}/** * 统计所有记录的总数 * @return 总数 */public int countAll() {String queryString = "select count(*) from "+ getPersistentClass().getName();Query query = this.getSession().createQuery(queryString);List list = query.list();Long result = (Long) list.get(0);return result.intValue();}/** * find By Example * @param entity * @return */@SuppressWarnings("unchecked")public List<T> findByExample(T entity) {return this.getHibernateTemplate().findByExample(entity);}@SuppressWarnings("unchecked")public List<T> findAll() {return this.getHibernateTemplate().find("from " + getPersistentClass().getName());}/** * 通过属性查找 * @param propertyName 属性名称 * @param value 属性的值 * @return */@SuppressWarnings("unchecked")public List<T> findByProperty(String propertyName, Object value) {String queryString = "from " + getPersistentClass().getName()+ " as model where model." + propertyName + "= ?";return this.getHibernateTemplate().find(queryString, value);}/** * 通过多个属性组合查询 * @param propertyNames 属性名称数组 * @param values 对应于propertyNames的值 return 匹配的结果 */public List<T> findByPropertys(String[] propertyNames, Object[] values) {StringBuffer strBuffer = new StringBuffer();strBuffer.append("from " + getPersistentClass().getName());strBuffer.append(" as model where ");for (int i = 0; i < propertyNames.length; i++) {if (i != 0)strBuffer.append(" and");strBuffer.append(" model.");strBuffer.append(propertyNames[i]);strBuffer.append("=");strBuffer.append("? ");}String queryString = strBuffer.toString();return this.getHibernateTemplate().find(queryString, values);}/** * 通过属性查找并分页 * @param propertyName 属性名称 * @param value 属性值 * @param page 页数 * @param pageSize 每页显示条数 */public List<T> findByProperty(String propertyName, Object value, int page,int pageSize) {return this.findByPropertys(new String[] { propertyName },new Object[] { value }, page, pageSize);}/** * 通过多个属性组合查询 * @param propertyNames 属性名称数组 * @param values 对应于propertyNames的值 * @param page 页数 * @param pageSize 每页显示数 return 匹配的结果 return 匹配的结果 */public List<T> findByPropertys(String[] propertyNames, Object[] values,int page, int pageSize) {StringBuffer strBuffer = new StringBuffer();strBuffer.append("from " + getPersistentClass().getName());strBuffer.append(" as model where ");for (int i = 0; i < propertyNames.length; i++) {if (i != 0)strBuffer.append(" and");strBuffer.append(" model.");strBuffer.append(propertyNames[i]);strBuffer.append("=");strBuffer.append("? ");}String queryString = strBuffer.toString();int firstResult = (page - 1) * pageSize;Query query = this.getSession().createQuery(queryString);query.setFirstResult(firstResult);query.setMaxResults(pageSize);for (int i = 0; i < values.length; i++) {query.setParameter(i, values[i]);}return query.list();}/** * 通过属性统计数量 * @param propertyName 属性名称 * @param value 属性值 */public int countByProperty(String propertyName, Object value) {String[] propertyNames = new String[] { propertyName };Object[] values = new Object[] { value };return this.countByPropertys(propertyNames, values);}/** * 通过多个属性统计数量 * @param propertyNames 属性名称数组 * @param values 对应的属性值数组 return */public int countByPropertys(String[] propertyNames, Object[] values) {StringBuffer strBuffer = new StringBuffer();strBuffer.append("select count(*) from "+ getPersistentClass().getName());strBuffer.append(" as model where ");for (int i = 0; i < propertyNames.length; i++) {if (i != 0)strBuffer.append(" and");strBuffer.append(" model.");strBuffer.append(propertyNames[i]);strBuffer.append("=");strBuffer.append("? ");}String queryString = strBuffer.toString();Query query = this.getSession().createQuery(queryString);for (int i = 0; i < values.length; i++) {query.setParameter(i, values[i]);}List list = query.list();Long result = (Long) list.get(0);return result.intValue();}/** * 查找T并通过某一属性排序 * @param property 排序依据的顺序 * @param isSequence 是否顺序排序,false为倒序 */public List<T> findAndOrderByProperty(int firstResult, int fetchSize,String propertyName, boolean isSequence) {String queryString = "from " + getPersistentClass().getName()+ " as model order by model." + propertyName;if (isSequence == false) {queryString = queryString + " DESC";}Query queryObject = getSession().createQuery(queryString);queryObject.setFirstResult(firstResult);queryObject.setMaxResults(fetchSize);return queryObject.list();}/** * 查找所有并通过某个属性排序 * @param propertyName 排序依据的属性名称 * @param isSequence 是否顺序排列 */public List<T> findAllAndOrderByProperty(String propertyName,boolean isSequence) {String queryString = "from " + getPersistentClass().getName()+ " as model order by model." + propertyName;if (isSequence == false) {queryString = queryString + " DESC";}Query queryObject = getSession().createQuery(queryString);return queryObject.list();}}


IUserDao:

package com.smonk.user.dao;import com.smonk.common.base.IBaseDao;import com.smonk.user.entity.User;public interface IUserDao extends IBaseDao<User, Integer> {/** * 通过用户名查找用户 * @param userName 用户名 * @return TUser 用户对象,如果用户名不存在返回null */public User findByUserName(String userName);}


UserHibernateDao:

package com.smonk.user.dao;import java.util.List;import com.smonk.common.base.BaseHibernateDao;import com.smonk.user.entity.User;public class UserHibernateDao extends BaseHibernateDao<User, Integer> implementsIUserDao {// property constantspublic static final String USER_NAME = "userName";/** * 通过名称查找用户 * @return User */public User findByUserName(String userName) {List<User> userList = super.findByProperty(USER_NAME, userName);if (userList.size() != 0) {return userList.get(0);} else {return null;}}public static void main(String[] args) {Integer id = 10;IUserDao dao = new UserHibernateDao();dao.findById(id);}}


请看只有寥寥几句的UserDao拥有多少功能!!!:

 

亲,请问这样的架构省了多少代码?省了多少人天?省了多少枯燥与烦扰?。。。