利用泛型和反射定义一个通用的数据库数据处理方法
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);
}
}