模块代码重用之BaseDao

原创 2015年11月18日 22:09:24

      假如说有两张表,一张是student表,一张是teacher表,当我们写登录模块时,而相对应的从数据库读取的表数据,student有与之相对应的StudenDaoimp,teacher有teacerDaoimp,对于student表有固定的查询语句:"select  * from student  where s_name=' "+name+" ‘  and s_password= ' "+password;    //查询语句1对于teacher同理可得,  select  * from teacher   where t_name='"+name+" ‘  and t_password= ' "+password,// 查询语句2,
那么有没有一个方法可以把查询语句1和查询语句2写成一个语句呢?答案告诉你,当然可以!用到的知识是反射,反射发射!重要的事强调3次  so  ,  请看下面student表对应的实体类: package com.ssh.entities;

public class Student {
	@Override
	public String toString() {
		return "Student [s_id=" + s_id + ", s_name=" + s_name + ", s_password="
				+ s_password + "]";
	}
	private Integer s_id;
	private String s_name;
	private String s_password;
	public Integer getS_id() {
		return s_id;
	}
	public void setS_id(Integer s_id) {
		this.s_id = s_id;
	}
	public String getS_name() {
		return s_name;
	}
	public void setS_name(String s_name) {
		this.s_name = s_name;
	}
	public String getS_password() {
		return s_password;
	}
	public void setS_password(String s_password) {
		this.s_password = s_password;
	}
	

}
teacher对应的实体类
 
package com.ssh.entities;

public class Teacher {
	
	@Override
	public String toString() {
		return "Teacher [t_id=" + t_id + ", t_name=" + t_name + ", t_password="
				+ t_password + "]";
	}
	private Integer t_id;
	private String t_name;
	private String t_password;
	public Integer getT_id() {
		return t_id;
	}
	public void setT_id(Integer t_id) {
		this.t_id = t_id;
	}
	public String getT_name() {
		return t_name;
	}
	public void setT_name(String t_name) {
		this.t_name = t_name;
	}
	public String getT_password() {
		return t_password;
	}
	public void setT_password(String t_password) {
		this.t_password = t_password;
	}
	

}

   下面就来好好的讲解BasoDao和BaseDaoImp类:

package com.ssh.daoImp;

import java.lang.reflect.*;

import org.springframework.beans.factory.annotation.Autowired;




import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.lang.StringEscapeUtils;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.ssh.dao.BaseDao;
import com.ssh.entities.Student;

public  class BaseDaoImp<T>  implements BaseDao<T>{

	private Class<T> classbean;//反射类
	public BaseDaoImp(){
		ParameterizedType ptype=(ParameterizedType)getClass().getGenericSuperclass();
		Type[] type=ptype.getActualTypeArguments();
		classbean =(Class<T>) type[0];//得到反射类的对象
	}
     @Resource(name="sessionFactory")
	protected SessionFactory sessionFactory;//Hibernate的SessionFactory用于连接管理数据库操作

	@Override
	public T login(String name,String password) {//用于查询Sutdent,Teacher表的操作
		// TODO Auto-generated method stub
		StringBuffer  hql=new StringBuffer();
		hql.append("from "+classbean.getSimpleName()+" where 1=1");
		String[] buffer=new String[2];
        if(classbean.getSimpleName().endsWith("Student")){
        	buffer[0]="s_name";
        	buffer[1]="s_password";
        }else if(classbean.getSimpleName().endsWith("Teacher")){
        	buffer[0]="t_name";
        	buffer[1]="t_password";
        }
		if((name!=null&&name!="")&&(password!=null&&password!="")){
			hql.append(" and "+buffer[0]+"='"+name+"'"+"and "+buffer[1]+"='"+StringEscapeUtils.escapeSql(password.toString())+"'");
		}
       
         Session session =sessionFactory.openSession();
		Query query = session.createQuery(hql.toString()); 
		List<T> result = query.list();   


		if (result !=null && result.size()>0) {
			return result.get(0);
		}
		return null;
	}

}

 对于Student这方面,自然是要有想对应的接口IStudentDao和接口实现类StudentDaoImp;

package com.ssh.dao;

import com.ssh.entities.Student;

public interface IStudentDao extends BaseDao<Student>{

}

StudentDaoImp:

package com.ssh.daoImp;

import com.ssh.dao.IStudentDao;
import com.ssh.entities.Student;

public class StudentDaoImp extends BaseDaoImp<Student> implements IStudentDao{

}

Teacher对应的ITeacherDao接口和接口实现类TeacherDaoImp;
ITeacherDao:

package com.ssh.dao;

import com.ssh.entities.Teacher;

public interface ITeacherDao extends BaseDao<Teacher> {//继承BaseDao

}


TeacherDaoImp:

package com.ssh.daoImp;

import com.ssh.dao.ITeacherDao;
import com.ssh.entities.Teacher;

public class TeacherDaoImp extends BaseDaoImp<Teacher> implements ITeacherDao {

}

总结:其实这个模板类BaseDao主要运用到的技术是反射,泛型,继承,接口。TeacherDaoImp和StudentDaoImp要继承BaseDao类,并且注明泛型的类型











万能的BaseDao设计

BaseDao设计的初衷是为了方便我们的使用,不用写很多的重复的代码,今天就说说它的设计思路。我们就是要用反射加泛型加面向接口编程来实现,从网上找了一个UML图,我们就用下图大体简单设计一下。  ...
  • kdc18333608478
  • kdc18333608478
  • 2016年10月23日 22:08
  • 10797

数据库连接工具类BaseDao

在北大青鸟学习的第二学期学到了JDBC技术,那时候就只知道对书上的代码照猫画虎,也是对OO不太熟练,所以对数据库工具类没有很在意,觉得能够正常的完成项目就行了,但现在发现应该多注意自己的代码风格,把代...
  • LinYi_JCY
  • LinYi_JCY
  • 2016年03月21日 20:31
  • 929

万能的BaseDAO和注解的应用

首先科普一下BaseDAO: BaseDAO一般是提供从数据库 增加、删除、修改记录、查询所有记录、查询符合某个条件记录、取得某条记录等方法的底层数据操作自定义类。 由于我们可能操作多个数据库表,...
  • a997208868
  • a997208868
  • 2015年09月05日 00:38
  • 1418

GoodZhang在学Python(七)--代码重用之模块

很多的编程思想都是想尽可能的做到代码重用,在Python我们可以tong
  • zhdl11
  • zhdl11
  • 2014年08月20日 19:09
  • 619

dao层的实现类中的配置BaseDao,所有的DaoImpl可以继承此类

[java] view plaincopyprint? package com.hfxt.dao.impl;      import java.io.Serializable; ...
  • AD921012
  • AD921012
  • 2015年10月15日 10:32
  • 532

BaseDao基于JPA的实现

一,说明 基本DAO的实现也是基于上一篇文章,Spring3+Hibernate4+JPA2.0整合之后,DAO层的实现 二,DAO层的功能       这里要简单提一下MVC模式了,MVC本身不是一...
  • wei763328075qq
  • wei763328075qq
  • 2015年12月14日 10:33
  • 351

BaseDao工具类

利用元数据对Dao操作进行抽取 Dao操作通用的步骤: 1.写SQL语句 2.获取连接 3.创建stmt 4.执行sql a)更新executeUpdate b...
  • QQ1012421396
  • QQ1012421396
  • 2017年04月08日 10:56
  • 792

利用泛型封装BaseDao(项目中直接调用即可)

利用泛型封装BaseDao(项目中直接调用即可) package com.cdsxt.base; import java.lang.reflect.Field; import java.l...
  • miachen520
  • miachen520
  • 2016年07月21日 19:03
  • 673

BaseDao终极版

package net.houder.dao; import java.lang.reflect.ParameterizedType; import java.sql.SQLException...
  • yuanhenglizhen110
  • yuanhenglizhen110
  • 2014年10月14日 09:01
  • 742

BaseDAO(反射泛型)

利用baseDAO实现增删查改public class BaseDao{ // 保存当前运行类的参数化类型中的实际的类型 private Class clazz; // 表名 ...
  • zxiang248
  • zxiang248
  • 2016年07月17日 08:17
  • 493
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:模块代码重用之BaseDao
举报原因:
原因补充:

(最多只允许输入30个字)