学习尝试封装简单的dao-数据库代码

qq_37298674 2017-03-14 09:14:47

package com.heima.dao;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import com.heima.utils.JDBCUtils;

public class BaseDao<T> {
/**
* 1.1使用时只需要新建一个dao,继承该dao即可
* 1.2继承时,泛型<T>是用到的javabean
* 2.1javabean里只能有普通字段,不能有集合/对象等包装字段
* 2.2javabean和数据库里的id名字必须为userId获得personId这种,其他字段也要一一对应
* 2.3数据库表里的表头需要用自然顺序排列(增删改),查询时是无所谓的.(如果查询比较,那么倒不需要自然顺序了)
*
*/
/*
*获取泛型内的class类型
*/
private Class clazz;
private QueryRunner qr = new QueryRunner(JDBCUtils.getDs());
public BaseDao(){
Class c = this.getClass();
Type type=c.getGenericSuperclass();
ParameterizedType pt = (ParameterizedType) type;
Type[] types = pt.getActualTypeArguments();
this.clazz=(Class) types[0];
}
/**
* 增删改
* @param t 封装到javabean对象里面
* @throws Exception
*/
public void update(T t) throws Exception{
/*
* 获取javabean的类名以及id名字,并判断是否有该id名字,如果没有,抛出异常
* */
String tname=clazz.getSimpleName().toLowerCase();
String tid=tname+"Id";
Field tField = clazz.getDeclaredField(tid);
tField.setAccessible(true);
if(tField==null){
//没有该xxId参数
throw new RuntimeException("没有id字段");
}else{
//如果有xxId字段,那么内省
BeanInfo beaninfo=Introspector.getBeanInfo(clazz, Object.class);
PropertyDescriptor[] descriptors = beaninfo.getPropertyDescriptors();

StringBuffer sb =null;
List<Object> olist=new ArrayList<Object>();
if(tField.get(t)==null){
//add方法 是需要里面的id没有值的
sb=new StringBuffer("insert into "+tname+" values(");
for (PropertyDescriptor pd : descriptors) {
sb.append("?,");
Method readMethod = pd.getReadMethod();
Object obj = readMethod.invoke(t,null);
olist.add(obj);
}
String sql=sb.substring(0, sb.length()-1)+")";
Object[] params=olist.toArray();
qr.update(sql, params);

}else{
//修改或删除方法,看最后的集合长度分辨吧,如果集合里只有一个也就是id值,那么就删除,否则就是修改
Object tidobj=null;
String tidname="";
sb=new StringBuffer("update "+tname+" set ");
for (PropertyDescriptor pd : descriptors) {
String pdname=pd.getName();
Method readMethod = pd.getReadMethod();
Object obj = readMethod.invoke(t, null);
if(pd.getName().equals(tid)){
tidobj=obj;
tidname=" where "+tid+"=?";
}else{
sb.append(pdname+"=?,");
olist.add(obj);
}
}
sb.deleteCharAt(sb.length()-1).append(tidname);
olist.add(tidobj);
String sql=sb.toString();
Object[]params=olist.toArray();
ArrayList<Object> al = new ArrayList<Object>();
al.add(null);
olist.removeAll(al);
if(olist.size()==1){
//是删除操作
sb=new StringBuffer("delete from "+tname+" where "+tid+"=?");
sql=sb.toString();
Object param= olist.get(0);
qr.update(sql, param);
}else{
//是修改操作
qr.update(sql, params);
}
}
}
}
/**
* 查询操作,需要在javabean里封装需要查询的条件,直接内省
* @param t
* @return 一个List集合
* @throws Exception
*/
public List<T> find(T t) throws Exception{
String tname=clazz.getSimpleName().toLowerCase();
BeanInfo beaninfo=Introspector.getBeanInfo(clazz,Object.class);
PropertyDescriptor[] descriptors = beaninfo.getPropertyDescriptors();
StringBuffer sb = new StringBuffer("select * from "+tname+" where 1=1");
List<Object> olist=new ArrayList<Object>();
for (PropertyDescriptor pd : descriptors) {
String name=pd.getName();
Method method=pd.getReadMethod();
Object obj=method.invoke(t,null);
if(obj!=null){
sb.append(" and "+name+"=?");
olist.add(obj);
}
}
String sql=sb.toString();
Object[]params=olist.toArray();
List<T> list=qr.query(sql, new BeanListHandler<T>(clazz), params);
return list;
}
}


...全文
91 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧