DAO层使用泛型的两种方式
1.DAO层使用泛型类,主要是定义一些通用的增删改查,然后其他DAO的类都来继承该类,通过构造方法将class对象传给该泛型类
定义泛型接口
package sanitation.dao; import java.util.List;/** * * @param <T>*/ public interface GenericDAO <T>{/** * 通过ID获得实体对象 * * @param id实体对象的标识符 * @return 该主键值对应的实体对象*/ T findById(int id); /** * 将实体对象持久化 * * @param entity 需要进行持久化操作的实体对象 * @return 持久化的实体对象*/ T makePersitent(T entity); /** * 将实体变为瞬态 * * @param entity需要转变为瞬态的实体对象*/void makeTransient(T entity); /** * 将一系列的实体变为瞬态,使用本地sql * * @param hql*/void makeTransientByIds(String sql); /** * * 使用hql语句进行分页操作 * * @param hql * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @return 查询的记录*/ List<T> findByPage(final String hql,final int offset,final int pageSize); /** * 使用hql 语句进行分页查询操作 * * @param hql 需要查询的hql语句 * @param value 如果hql有一个参数需要传入,value就是传入的参数 * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录*/ List<T> findByPage(final String hql , final Object value ,final int offset, final int pageSize); /** * 使用hql 语句进行分页查询操作 * * @param hql 需要查询的hql语句 * @param values 如果hql有一个参数需要传入,value就是传入的参数 * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录*/ List<T> findByPage(final String hql, final Object[] values,final int offset, final int pageSize); /** * 使用sql 语句进行分页查询操作 * * @param sql * @param offset * @param pageSize * @return*/ List findByPageSQL(final String sql, final int offset, final int pageSize); /** * 根据语句查找总数 * @param hql hql语句 * @return 对应的数目*/ Integer getCount(String hql); void updateObj(final String hql,final Object[] values);}
定义实现类
package sanitation.dao.impl; import java.sql.SQLException;import java.util.List; import org.hibernate.HibernateException;import org.hibernate.Query;import org.hibernate.Session;import org.springframework.orm.hibernate3.HibernateCallback;import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import sanitation.dao.GenericDAO; public class GenericHibernateDAO<T> extends HibernateDaoSupport implements GenericDAO<T>{ private Class<T> persistentClass; public GenericHibernateDAO(Class<T> persistentClass){this.persistentClass=persistentClass; } public Class<T> getPersistentClass(){return persistentClass; } @SuppressWarnings("unchecked")public T findById(int id) {return (T)getHibernateTemplate().get(getPersistentClass(), id); } @SuppressWarnings("unchecked")public List<T> findByPage(final String hql, final int offset, final int pageSize){ List<T> list= getHibernateTemplate().executeFind(new HibernateCallback(){public Object doInHibernate(final Session session)throws HibernateException, SQLException{ Query query=session.createQuery(hql);if(!(offset==0 && pageSize==0)){ query.setFirstResult(offset).setMaxResults(pageSize); } List<T> result = query.list();return result; } });return list; } @SuppressWarnings("unchecked")public List findByPageSQL(final String sql, final int offset, final int pageSize){ List list= getHibernateTemplate().executeFind(new HibernateCallback(){public Object doInHibernate(final Session session)throws HibernateException, SQLException{ Query query=session.createSQLQuery(sql);if(!(offset==0 && pageSize==0)){ query.setFirstResult(offset).setMaxResults(pageSize); } List result = query.list();return result; } });return list; } @SuppressWarnings("unchecked")public List<T> findByPage(final String hql, final Object value, final int offset, final int pageSize) { List<T> list = getHibernateTemplate().executeFind(new HibernateCallback() {public Object doInHibernate(Session session)throws HibernateException, SQLException { Query query=session.createQuery(hql).setParameter(0, value);if(!(offset==0 && pageSize==0)){ query.setFirstResult(offset).setMaxResults(pageSize); } List<T> result = query.list();return result; } });return list; } @SuppressWarnings("unchecked")public List<T> findByPage(final String hql, final Object[] values, final int offset,final int pageSize) { List<T> list = getHibernateTemplate().executeFind(new HibernateCallback(){public Object doInHibernate(Session session)throws HibernateException, SQLException{ Query query=session.createQuery(hql);for (int i = 0 ; i < values.length ; i++){ query.setParameter( i, values[i]); }if(!(offset==0 && pageSize==0)){ query.setFirstResult(offset).setMaxResults(pageSize); } List<T> result = query.list();return result; } });return list; } public void updateObj(final String hql, final Object[] values) { getHibernateTemplate().execute(new HibernateCallback(){public Object doInHibernate(Session session)throws HibernateException, SQLException{ Query query=session.createQuery(hql);for(int i=0;i<values.length;i++){ query.setParameter( i, values[i]); } query.executeUpdate();return null; } }); } public Integer getCount(String hql) { Integer count;//iterate方法与list方法的区别是list取出全部,iterator取出主键,迭代的时候才取出数据 count = ((Long)getHibernateTemplate().iterate(hql).next()).intValue();return count; } public T makePersitent(T entity) { getHibernateTemplate().saveOrUpdate(entity);return entity; } public void makeTransient(T entity) { getHibernateTemplate().delete(entity); } public void makeTransientByIds(final String sql) { getHibernateTemplate().execute(new HibernateCallback(){public Object doInHibernate(Session session)throws HibernateException, SQLException{ Query query=session.createQuery(sql); query.executeUpdate();return null; } }); } }
2.而有时我们为了方便起见,对于一些简单的项目,DAO的操作很单一,不会有很复杂的操作,那么我们直接用泛型方法类代替泛型类,主要就不需要写其他的DAO来继承,
整个DAO层就一个DAO类。
接口:
package com.xidian.dao; import java.util.List; import com.xidian.bean.Admin;import com.xidian.bean.HostIntroduce;import com.xidian.bean.Reply; public interface CommonDAO {public <T> void sava(T entity); //保存用户,无返回值; public <T> void remove(T entity); //删除用户 public <T> void update(T entity); //更新用户 public <T> T findById(Class<T> entityClass, Integer id); //通过id来查找某一个用户; public <T> List<T> findAll(Class<T> entityclass); //使用范型List<>,查询所有的用户信息 }
实现类:
package com.xidian.dao.impl; import java.util.List; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.xidian.bean.Admin;import com.xidian.bean.HostIntroduce;import com.xidian.bean.Reply;import com.xidian.dao.CommonDAO; public class CommonDAOImpl extends HibernateDaoSupport implements CommonDAO { @SuppressWarnings("unchecked") @Overridepublic <T> List<T> findAll(Class<T> entityclass) {//String name = entity.getClass().getName(); String hql = "from "+entityclass.getName()+" as aaa order by aaa.id desc";return this.getHibernateTemplate().find(hql); } @SuppressWarnings("unchecked") @Overridepublic <T> T findById(Class<T> entityClass, Integer id) {return (T) this.getHibernateTemplate().get(entityClass, id); } @Overridepublic <T> void remove(T entity) {this.getHibernateTemplate().delete(entity); } @Overridepublic <T> void sava(T entity) {this.getHibernateTemplate().save(entity); } @Overridepublic <T> void update(T entity) {this.getHibernateTemplate().update(entity); } }
使用泛型可以使代码大大的精简
转载于:https://www.cnblogs.com/shenliang123/archive/2012/04/05/2433134.html
DAO层使用泛型的两种方式相关推荐
- VUE实现点击头像出现遮罩层的功能的两种方式
本文是为了解决点击头像,出现一个遮罩层,显示上传头像.先说一下思路,第一种是用动画的方式来移动位置,但是ie9不支持动画,ie8一下直接不支持位置移动.所以某就研究了第二种方式,就是利用相对位置的固定 ...
- java native函数库_Java 层调用 Native 层函数的两种方式
概述 Java 层如何调用Native层函数,大家都应该知道使用JNI(Java 本地接口). 通过在java层声明native方法,然后遵守JNI规范命名Native函数,即可建立Java层nati ...
- ue4输出id层的两种方式
这里记录下id层输出的方式 id层通常是影视动画中方便后期调节 第一种方式就是普通方式 首先ue4内部custom render passes并没有直接的id层选择,id层输出需要靠Custom s ...
- Spring系列教程八: Spring实现事务的两种方式
2019独角兽企业重金招聘Python工程师标准>>> 一. Spring事务概念: 事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的 ...
- easyui treegrid实现的两种方式
感觉easyui官方的treegrid文档不是很清晰,当时使用的时候查了许多资料才做出来,现在总结一下两种实现方式的思路: 两种方式前台都一样: $('#tree').treegrid({url:&q ...
- Spring中进行事务管理的两种方式
1.Spring中事务管理的API 事务是指逻辑上要么全部成功.要么全部失败的一组操作.例如用户A给用户B转账,则用户A账户余额减少.用户B账户增加这两个操作就是一组事务,必须全部成功或失败撤回操作, ...
- mybatis一对多关联查询两种方式
mybatis一对多关联查询两种方式 前提: 方式一: 方式二: 前提: 现在有两张表,学生表跟教师表,一个教师对应多个学生 教师表: CREATE TABLE `teacher` (`id` int ...
- java提交数据到另一个页面_JS实现把一个页面层数据传递到另一个页面的两种方式...
由于之前面试,被问到过此问题,所以今天特意整理了一下.由于自己技术水平有限,若存在错误,欢迎提出批评. 本博客整理了两种方式从一个页面层向另一个页面层传递参数. 一. 通过cookie方式 1. 传递 ...
- [原][osg][gdal]两种方式修改tiff高程
因为对于globalmap不熟悉,不怎么怎么修改高程,好像也没有这功能. 干脆自己手动修改了高程图tiff了 由于自身一直使用osg的 自己使用了osgDB直接读取tiff,修改后保存的. 同事小周一 ...
最新文章
- 通用解题法——回溯算法(理解+练习)
- 哈夫曼树(最优二叉树)(c/c++)
- cent 8.0 安装tomcat 9.0_JDK-TOMCAT-MYSQL安装
- 【Echarts 3.x】填坑记
- 智慧城市这份试卷 国外城市怎么答题?
- solr mysql 自动同步_MongoDB和Solr的整合以及实现数据同步功能
- 基于深度学习和支持向量机的4种苜蓿叶部病害图像识别
- android zxing 自动对焦,Zxing中的camera
- matlab r2014a 序列号,Matlab R2014a 免费版
- linux下Js加载so,JavaScript文件加载器LABjs API详解
- speedoffice(Word)文档中如何插入图片
- ORACLE表空间和表碎片分析及整理方法
- 秒云获得阿里云首批产品生态集成认证,携手阿里云共建云原生智能运维生态服务
- mysql pdo 端口_链接Mysql的api mysqli和pdo
- Kiner算法刷题记(二十一):字典树与双数组字典树(数据结构基础篇)
- 北邮邮箱与Win10自带邮箱相连接
- RAC 中GES/GCS原理
- 2023年房企数字化预算该往哪些场景投?(附爱分析报告下载)
- python天天向上续。尽管每天坚持,但人的能力发展并不是无限的,它符合特定模型。实例1的修改。改造实例代码1.1。回文数。
- concat、concatenate、add
热门文章
- 足够应付面试的Spring事务源码阅读梳理
- 漫画科普 | 5G到底是个什么玩意儿?
- 如何使用 Redis 实现大规模的帖子浏览计数
- 埋在 MySQL 数据库应用中的17个关键问题!
- 分布式领域架构师要掌握的技术
- Spring Cloud Gateway(限流)
- 一个简单案例,5 分钟看懂 Java Lamdba 表达式
- SpringBoot非官方教程 | 第二篇:Spring Boot配置文件详解
- 模拟二:STEMA 考试选择题模拟练习试卷(中级组) 及答案 + 解题后期更新
- Spring Boot—SpringMVC自动配置原理以及扩展和全面接管SpringMVC