利用泛型和反射定义一个通用的数据库数据处理方法

package com.test.dao;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.sun.org.apache.bcel.internal.generic.NEW;
import com.test.pojo.Student;
import com.test.util.DbHelper;

public class BaseDao<T> {	
	
	private String tableName;
	
	protected DbHelper dbHelper=new DbHelper();
	
	public BaseDao(String tableName)
	{
		this.tableName=tableName;
	}
	
	public List<T> select(Class<?> clazz)
	{
		  String sql="select * from "+tableName;
		  
		  List<Map<String, Object>> list= dbHelper.executeQuery(sql, null);		  
		  
		  List<T> modelList=new ArrayList<T>();
		  
		  for(Map<String, Object> map:list)// map(sid=>1,sname=>""...)
		  {
			  try {
				
				  T object=(T) clazz.newInstance();
				  
				  //组装对象的属性
				  Set<String> keys= map.keySet();
				  
				  for(String key:keys)
				  { 	
					  String keyname;
					  
					  if(key.equals("class"))
						  keyname="stu_class";
					  else
						  keyname=key;
					  
					  Field field=   clazz.getDeclaredField(keyname); 
					  
					  field.setAccessible(true);
					  
					  field.set(object, map.get(key));
					  
				  }				  
				  
				  modelList.add(object);
				
			} catch (InstantiationException | IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NoSuchFieldException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (SecurityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			  
		  }
		  return modelList;		
	}
	
	public boolean add(T model)
	{
		// insert into student(sid,sname) values(1,"aa");
		  StringBuilder stringBuilder=new StringBuilder();
		  
		  stringBuilder.append("insert into ");
		  
		  stringBuilder.append(tableName);
		  
		  stringBuilder.append("(");
		  
		  Class clazz=model.getClass();
		  //获得对象中的所有的属性
		  Field[] fields= clazz.getDeclaredFields();
		  
		  for(Field field:fields)
		  {
			  //获得属性名
			   String fieldName= field.getName();
			   if(fieldName.equals("stu_class"))
				   fieldName="class";
			  //根据属性名拼接字段名(书姓名和字段名是一致)
			   stringBuilder.append(fieldName+",");
		  }
		  //将最后多余的,替换成)
		  stringBuilder.replace(stringBuilder.length()-1,stringBuilder.length(), ") ");
		  
		  stringBuilder.append(" values (");		  
		  
		  List<Object> paramList=new ArrayList<Object>();		  
		  
		  //拼接value中的值 (?,?,?...)		  
		  for(Field field:fields)
		  {
		      stringBuilder.append("?,");
		      
		      try {
		    	field.setAccessible(true);//设置字段为可访问
		    	
				paramList.add(field.get(model));//获取model对象中对应属性的值
			} catch (IllegalArgumentException | IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		  }
		  
		  //将最后多余的,替换成)
		  stringBuilder.replace(stringBuilder.length()-1,stringBuilder.length(), ") ");
		  
		  
		 if(dbHelper.executeUpdate(stringBuilder.toString(), paramList)>0)
			 return true;
		 else
			 return false;		  
		   
	}
	
	// update 表  set 字段1=值1,字段2=值2 where ...
	//update 表 set 字段1=?,字段2=? where 字段1=? and  ...
	//
	public int  update(Map<String, Object> dataMap,Map<String,Object> whereMap)
	{
		StringBuilder sql=new StringBuilder();
		sql.append("update ");
		sql.append(tableName);
		sql.append(" set ");
		
		List<Object> paramList=new ArrayList<Object>();
		
		//拼接 set 字段1=?,字段2=?  更新后的字段的值
		Set<String> keys= dataMap.keySet();
		
		for(String key: keys)
		{
			sql.append(key+"=?,");
			paramList.add(dataMap.get(key));
		}
		
		sql.delete(sql.length()-1, sql.length());
		
	    //拼接where后面的条件
		sql.append(" where ");
		
		Set<String> whereKeys=whereMap.keySet();
		
		for(String wherekey:whereKeys)
		{
			sql.append(wherekey+"=? and ");
			paramList.add(whereMap.get(wherekey));
		}
		
		//删除最后多余的and
		sql.delete(sql.length()-4, sql.length());
		
		return dbHelper.executeUpdate(sql.toString(), paramList);	
		
		
	}
	
	// delete from 表 where 条件...
	public int delete(Map<String, Object> whereMap)
	{
		 StringBuilder sql=new StringBuilder();
		 
		 sql.append("delete from  ");
		 
		 sql.append(tableName);
		 
		 List<Object> paramList=null;
		 
		 //拼接where后面的条件
		 if(whereMap!=null && whereMap.size()>0)
		 {
			  paramList=new ArrayList<Object>();
			 
			  sql.append(" where ");
			  
			  Set<String> keys= whereMap.keySet();
			  
			  for(String key:keys)
			  {
				   sql.append( key+"=? and ");
				   //组装参数集合
				   paramList.add(whereMap.get(key));
			  }
			  
			  sql.delete(sql.length()-4, sql.length());
			
		 }
		  
		 return dbHelper.executeUpdate(sql.toString(), paramList);
		 
		 
		 
	}
	
	
	
	
	
	

}