`

SSH整合:使用DAO框架(BaseDao),DAO不写或少写,我们更加专注业务

    博客分类:
  • SSH
阅读更多

这里我们新建一个BaseDao,让普通Dao(如:UserDao)继承它,这样普通Dao什么都不写就可以自动实现基本的增删改查操作,也可以在UserDao中扩建方法...

BaseDao.java:

 

package com.kaishengit.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

import com.kaishengit.util.ReflectUtil;

public class BaseDao<T,PK extends Serializable> {
	
	private SessionFactory sessionFactory;
	//Class<?>:防止报黄线,意思是传入任意类型都行,无所谓,也可以使用Object
	private Class<?> entityClass;
	
	public BaseDao(){
		//new出一个子类对象,父类中的this是子类中的this
		entityClass = ReflectUtil.getGenericParameterType(this.getClass());
	}
	
	public void saveOrUpdate(T t){
		getSession().saveOrUpdate(t);
	}
	
	public void del(PK pk){
		getSession().delete(findById(pk));
	}
	
	public void del(T t){
		getSession().delete(t);
	}
	
	@SuppressWarnings("unchecked")
	public T findById(PK pk){
		return (T) getSession().get(entityClass, pk);
	}
	
	@SuppressWarnings("unchecked")
	public List<T> findAll(){
		Criteria criteria = getSession().createCriteria(entityClass);
		return criteria.list();
	}
	
	@SuppressWarnings("unchecked")
	public List<T> findByPage(int start,int count){
		Criteria criteria = getSession().createCriteria(entityClass);
		criteria.setFirstResult(start);
		criteria.setMaxResults(count);
		return criteria.list();
	}
	
	//get
	public Session getSession(){
		return sessionFactory.getCurrentSession();
	}
	
	//set
	@Autowired
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
	
	
}

 

 这里面我用到自己写的一个工具类,通过反射实现返回的实际参数化类型T

 

package com.kaishengit.util;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class ReflectUtil {
	public static Class<?> getGenericParameterType(Class<?> clazz){
		//返回表示此Class所表示的实体(类、接口、基本类型或 void)的直接超类的Type。如果超类是参数化类型,则返回的Type对象必须准确反映源代码中所使用的实际类型参数。
		Type type = clazz.getGenericSuperclass();
		//强制转化为参数化类型:Collection<String>
		ParameterizedType pt = (ParameterizedType) type;
		//返回表示此类型的实际类型参数的 Type 对象的数组。 
		Type[] types = pt.getActualTypeArguments();
		return (Class<?>) types[0];
	}
}

 

 

这样就ok啦,我们新建一个UserDao继承它,这样UserDao就自动拥有了增删改查功能,是不是很令人兴奋呀,里面又扩建了一个方法

 

package com.kaishengit.dao;

import org.hibernate.Query;
import org.springframework.stereotype.Repository;

import com.kaishengit.pojo.User;

@Repository
public class UserDao extends BaseDao<User,Integer>{
	public User findByNameAndPassword(User user){
		String hql = "from User where username = ? and password = ?";
		Query query = getSession().createQuery(hql);
		query.setParameter(0, user.getUsername());
		query.setParameter(1, user.getPassword());
		return (User) query.uniqueResult();
	}
}

 

 

分享到:
评论
3 楼 meigesir 2015-10-04  
hy110912 写道
不知道你从哪里抄来的 还是怎么样  报错都不知道  还令人兴奋

都是我亲自写的,做开发这一行,编译通不过很正常,要看原因,有可能环境不太对,有可能API更新啦,请自查,谢谢
2 楼 hy110912 2015-08-08  
不知道你从哪里抄来的 还是怎么样  报错都不知道  还令人兴奋
1 楼 goudezong 2013-05-03  
Caused by: java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
at cn.hhit.attend.dao.BaseDAO.<init>(BaseDAO.java:25)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)
... 15 more

相关推荐

    一个简单的ssh整合的实例

    一个简单的ssh整合实例(数据库sqlseriver,工具netbeans)

    ssh+baseDao实现分页

    ssh+baseDao实现分页,分享给新人

    ssh框架整合step by step (springMVC + spring 5.0.4 + hibernate 5.0.12)

    好久不弄web了, 周末心血来潮, 使用较新spirng/hibernate搭建一个ssh框架, 供有需要的同学参考/学习/使用. 使用eclipse开发, 搭建,分三步: ①(在一个dynamic web工程上)整合springMVC; ② 整合spring; ③ 整合...

    NC65通过BaseDAO操作数据库

    NC65通过BaseDAO操作数据库,包含接口类及接口实现类: /** * 获取baseDAO * @return */ public BaseDAO getBaseDAO() { if(baseDAO == null){ baseDAO = new BaseDAO(); } return baseDAO; } public ...

    Spring整合hibernate(4)之BaseDao的编写示例

    说明:因为我们在实际编码中会编写一些重复的数据库操作方法CRUD,每个类都写一次感觉很繁琐,因此可以考虑考虑把所有公共的方法都写在BaseDao中,这个时候,让所有的DAO都继承BaseDao;这样基本上就实现了大量的...

    jsp论坛管理系统+sqlserver

    系统架构是现在主流的SSH架构模式,使用了Spring的Ioc来实现组件之间的依赖关系注入,使用Spring的AOP编程实现权限控制、日志服务等与业务无关的系统服务,以及Struts的action、form、Jsp页面的结构架构的整合如下:...

    SSH集成查询分页处理BaseDao

    一个简单的分页类,用于与Struts2、spring、hibernate集成分页。

    baseDao封装基本的增删查改方法

    使用baseDao封装基本的增删改查的方法,包括分页查询等功能

    basedao_basedao数据库_

    手动实现BaseDao 自动写数据库操作

    SSH框架——图书管理系统

    使用SSH框架实现图书管理系统,通过创建BaseDao的接口和实现类提高效率。其中javascript向java类中传递值解决中文乱码问题是一个难点,该项目成功地解决了该问题。此外,组合查询时如何解决浏览器缓存也让我思考很久...

    SSH的经典整合

    完美的SSH整合,对BaseDao的强大支持,页面经典使用

    Java_BaseDao

    提供CRUD便捷功能、条件查询、数据库访问 自动生成SQL语句、填充实体或pojo,增加修改操作需传入实体对象 SQL语句实现缓冲。 使用需继承BaseDao,数据库连接类需继承AbstractCreateDBConnection

    BaseDao代码

    BaseDao代码通用Dao

    ssh-base-framework----基于全注解方式的SSH基础框架

    基于struts2.23 + spring2.5.6 + hibernate3.6.4 + hibernate-generic-dao1.0(除了spring,整合的都是最新的GA包,hibernate-generic-dao是google code项目库中一个开源的basedao)

    三大框架整合源代码

    3.struts和hibernate全部交由spring来管理,所以不需要使用hibernate.cfg.xml以及entity.hbh.xml文件 4.框架全部使用注解来完成 5.完成功能有:事物配置,日志输出,单元测试,分页组建,baseDao的实现等等 6.所有...

    BaseDao.java

    java中Dao层中的BaseDao,适用于C#连接数据库

    自己做的SSH整合例子

    一个乒乓球计分器,内容不重要关健是SSH框架的整合。 我做了一个通用的BaseDao用这个可以开发出很多自己想要的软件。(有MSSql数据库,MyEclipse5.5开发)

    通用的baseDao,连接数据库的方法之一

    这是一个非常通用的数据库连接的方法,MyEclipse和sql得连接,当我们在做程序的时候有一些代码总是重复的如果你把这些重复的文件打成一个jar包就好像用sun公司提供的那些Java包一样,这样会节省你很多的时间和精力,...

    springboot+mybatis 多数据源 basedao +分页

    springboot+mybatis 多数据源 basedao +分页 basedao做的不好,你们可以改进

    ssh2 框架搭建

    使用struts2,hibernate3.0,spring3.0 搭建的框架,没有任何业务,只有一个干净的框架。工程中包含一个userDao的测试demo,可以拿到数据,所有的基本的增删改查都封装在baseDao中,然后让各个实体dao去继承Basedao。...

Global site tag (gtag.js) - Google Analytics