DAO层使用泛型的两种方式

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")
@Override
public <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")
@Override
public <T> T findById(Class<T> entityClass, Integer id) {
return (T) this.getHibernateTemplate().get(entityClass, id);
}

@Override
public <T> void remove(T entity) {
this.getHibernateTemplate().delete(entity);
}

@Override
public <T> void sava(T entity) {
this.getHibernateTemplate().save(entity);
}

@Override
public <T> void update(T entity) {
this.getHibernateTemplate().update(entity);
}

}

转载于:https://www.cnblogs.com/sailormoon/archive/2012/12/20/2827017.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/274417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将是惊心动魄的决战~

大家好&#xff0c;我是若川。一个和大家一起学源码的普通小前端。众所周知&#xff0c;我参加了掘金人气创作者评选活动&#xff08;投票&#xff09;&#xff0c;具体操作见此文&#xff1a;一个普通小前端&#xff0c;将如何再战掘金年度创作者人气榜单~。最后再简单拉拉票吧…

图书漂流系统的设计和研究_研究在设计系统中的作用

图书漂流系统的设计和研究Having spent the past 8 months of my academic career working co-ops and internships in marketing & communication roles, my roots actually stem from arts & design. Although I would best describe myself as an early 2000s child…

西里尔字符_如何设计西里尔字母Њ(Nje),Љ(Lje),Ћ(Tshe)和Ђ(Dje)

西里尔字符This article is about how to design Cyrillic characters Њ, Љ, Ђ, and Ћ (upright caps and lowercase; italics are not covered here). They are often problematic since they are Cyrillic, but not found in the Russian alphabet, so there is no much …

学习 vuex 源码整体架构,打造属于自己的状态管理库

前言这是学习源码整体架构第五篇。整体架构这词语好像有点大&#xff0c;姑且就算是源码整体结构吧&#xff0c;主要就是学习是代码整体结构&#xff0c;不深究其他不是主线的具体函数的实现。本篇文章学习的是实际仓库的代码。其余四篇分别是&#xff1a;学习 jQuery 源码整体…

VMware workstation 8.0上安装VMware ESXI5.0

首先&#xff0c;在VMware的官网上注册&#xff0c;下载VMware ESXI的安装包vmware&#xff0d;vmvisor&#xff0d;installer&#xff0d;5.0.0&#xff0d;469512.x86_64.iso&#xff0c;它是iso文件&#xff0c;刻盘进行安装&#xff0c;安装过程中&#xff0c;会将硬盘全部…

最新ui设计趋势_10个最新且有希望的UI设计趋势

最新ui设计趋势重点 (Top highlight)Recently, I’ve spent some time observing the directions in which UI design is heading. I’ve stumbled across a few very creative, promising and inspiring trends that, in my opinion, will shape the UI design in the nearest…

学习 axios 源码整体架构,打造属于自己的请求库

前言这是学习源码整体架构系列第六篇。整体架构这词语好像有点大&#xff0c;姑且就算是源码整体结构吧&#xff0c;主要就是学习是代码整体结构&#xff0c;不深究其他不是主线的具体函数的实现。本篇文章学习的是实际仓库的代码。学习源码整体架构系列文章如下&#xff1a;1.…

404 错误页面_如何设计404错误页面,以使用户留在您的网站上

404 错误页面重点 (Top highlight)网站设计 (Website Design) There is a thin line between engaging and enraging when it comes to a site’s 404 error page. They are the most neglected of any website page. The main reason being, visitors are not supposed to end…

学习 koa 源码的整体架构,浅析koa洋葱模型原理和co原理

前言这是学习源码整体架构系列第七篇。整体架构这词语好像有点大&#xff0c;姑且就算是源码整体结构吧&#xff0c;主要就是学习是代码整体结构&#xff0c;不深究其他不是主线的具体函数的实现。本篇文章学习的是实际仓库的代码。学习源码整体架构系列文章如下&#xff1a;1.…

公网对讲机修改对讲机程序_更少的对讲机,对讲机-更多专心,专心

公网对讲机修改对讲机程序重点 (Top highlight)I often like to put a stick into the bike wheel of the UX industry as it’s strolling along feeling proud of itself. I believe — strongly — that as designers we should primarily be doers not talkers.我经常喜欢在…

若川知乎问答:2年前端经验,做的项目没什么技术含量,怎么办?

知乎问答&#xff1a;做了两年前端开发&#xff0c;平时就是拿 Vue 写写页面和组件&#xff0c;简历的项目经历应该怎么写得好看&#xff1f;以下是我的回答&#xff0c;阅读量5000&#xff0c;所以发布到公众号申明原创。题主说的2年经验做的东西没什么技术含量&#xff0c;应…

ui设计基础_我不知道的UI设计的9个重要基础

ui设计基础重点 (Top highlight)After listening to Craig Federighi’s talk on how to be a better software engineer I was sold on the idea that it is super important for a software engineer to learn the basic principles of software design.听了克雷格费德里希(C…

C# 多线程控制 通讯 和切换

一.多线程的概念   Windows是一个多任务的系统&#xff0c;如果你使用的是windows 2000及其以上版本&#xff0c;你可以通过任务管理器查看当前系统运行的程序和进程。什么是进程呢&#xff1f;当一个程序开始运行时&#xff0c;它就是一个进程&#xff0c;进程所指包括运行中…

vue路由匹配实现包容性_包容性设计:面向老年用户的数字平等

vue路由匹配实现包容性In Covid world, a lot of older users are getting online for the first time or using technology more than they previously had. For some, help may be needed.在Covid世界中&#xff0c;许多年长用户首次上网或使用的技术比以前更多。 对于某些人…

IPhone开发 用子类搞定不同的设备(iphone和ipad)

用子类搞定不同的设备 因为要判断我们的程序正运行在哪个设备上&#xff0c;所以&#xff0c;我们的代码有些混乱了&#xff0c;IF来ELSE去的&#xff0c;记住&#xff0c;将来你花在维护代码上的时间要比花在写代码上的时间多&#xff0c;如果你的项目比较大&#xff0c;且IF语…

见证开户_见证中的发现

见证开户Each time we pick up a new video game, we’re faced with the same dilemma: “How do I play this game?” Most games now feature tutorials, which can range from the innocuous — gently introducing each mechanic at a time through natural gameplay — …

facebook有哪些信息_关于Facebook表情表情符号的所有信息

facebook有哪些信息Ever since worldwide lockdown and restriction on travel have been imposed, platforms like #Facebook, #Instagram, #Zoom, #GoogleDuo, & #Whatsapp have become more important than ever to connect with your loved ones (apart from the sourc…

M2总结报告

团队成员 李嘉良 http://home.cnblogs.com/u/daisuke/ 王熹 http://home.cnblogs.com/u/vvnx/ 王冬 http://home.cnblogs.com/u/darewin/ 王泓洋 http://home.cnblogs.com/u/fiverice/ 刘明 http://home.cnblogs.com/u/liumingbuaa/ 由之望 http://www.cnbl…

react动画库_React 2020动画库

react动画库Animations are important in instances like page transitions, scroll events, entering and exiting components, and events that the user should be alerted to.动画在诸如页面过渡&#xff0c;滚动事件&#xff0c;进入和退出组件以及应提醒用户的事件之类的…

线框模型_进行计划之前:线框和模型

线框模型Before we start developing something, we need a plan about what we’re doing and what is the expected result from the project. Same as developing a website, we need to create a mockup before we start developing (coding) because it will cost so much…