基于JDBC封装的BaseDao(实例代码)
最近闲暇时萌发写一写dao的封装的例子,就将以前写的整理一下。
publicclassBaseDao<T>{ Connectionconn; PreparedStatementst; ResultSetrs; JdbcUtiljdbcUtil=newJdbcUtil(); intresult=0; privateClass<T>persistentClass; @SuppressWarnings("unchecked") publicBaseDaoUtil(){ conn=jdbcUtil.getConnection(); ParameterizedTypetype=(ParameterizedType)getClass().getGenericSuperclass(); persistentClass=(Class<T>)type.getActualTypeArguments()[0]; } /** *保存 *@paramentity *@return */ publicintsave(Tentity)throwsException{ Stringsql="INSERTINTO"+entity.getClass().getSimpleName().toLowerCase()+"("; List<Method>list=this.matchPojoMethods(entity,"get"); Iterator<Method>iter=list.iterator(); Objectobj[]=newObject[list.size()]; inti=0; //拼接字段顺序insertintotablename(id,name,email, while(iter.hasNext()){ Methodmethod=iter.next(); sql+=method.getName().substring(3).toLowerCase()+","; if(method.getReturnType().getSimpleName().indexOf("Date")!=-1){ SimpleDateFormatsbf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); obj[i]=sbf.format(method.invoke(entity,newObject[]{})); }else{ obj[i]=method.invoke(entity,newObject[]{}); } i++; } //去掉最后一个,符号insertinsertintotablename(id,name,email)values( sql=sql.substring(0,sql.lastIndexOf(","))+")values("; //拼装预编译SQL语句insertinsertintotablename(id,name,email)values(?,?,?, for(intj=0;j<list.size();j++){ sql+="?,"; } //去掉SQL语句最后一个,符号insertinsertintotablename(id,name,email)values(?,?,?); sql=sql.substring(0,sql.lastIndexOf(","))+")"; //到此SQL语句拼接完成,打印SQL语句 System.out.println(sql); try{ st=conn.prepareStatement(sql); for(intj=0;j<obj.length;j++){ st.setObject(j+1,obj[j]); } result=st.executeUpdate(); }catch(SQLExceptione){ e.printStackTrace(); } jdbcUtil.getClose(rs,st,conn); returnresult; } /** *删除 *@paramobject *@return *@throwsSQLException */ publicintdeleteId(Objectobject)throwsException{ Stringsql="deletefrom"+persistentClass.getSimpleName().toLowerCase()+"where"; //通过子类的构造函数,获得参数化类型的具体类型.比如BaseDAO<T>也就是获得T的具体类型 Tentity=persistentClass.newInstance(); //存放Pojo(或被操作表)主键的方法对象 MethodidMethod=null; List<Method>list=this.matchPojoMethods(entity,"set"); Iterator<Method>iter=list.iterator(); //过滤取得Method对象 while(iter.hasNext()){ MethodtempMethod=iter.next(); if(tempMethod.getName().indexOf("Id")!=-1&&tempMethod.getName().substring(3).length()==2){ idMethod=tempMethod; }elseif((entity.getClass().getSimpleName()+"Id").equalsIgnoreCase(tempMethod.getName().substring(3))){ idMethod=tempMethod; } } //第一个字母转为小写 sql+=idMethod.getName().substring(3,4).toLowerCase()+idMethod.getName().substring(4)+"=?"; System.out.println(sql); st=conn.prepareStatement(sql); //判断id的类型 if(objectinstanceofInteger){ st.setInt(1,(Integer)object); }elseif(objectinstanceofString){ st.setString(1,(String)object); } result=st.executeUpdate(); jdbcUtil.getClose(rs,st,conn); returnresult; } /** *修改 *@paramentity *@return *@throwsException */ publicintupdate(Tentity)throwsException{ Stringsql="update"+entity.getClass().getSimpleName().toLowerCase()+"set"; List<Method>list=this.matchPojoMethods(entity,"get"); //装载参数 Objectobj[]=newObject[list.size()]; inti=0; //临时Method对象,负责迭代时装method对象. MethodtempMethod=null; //由于修改时不需要修改ID,所以按顺序加参数则应该把Id移到最后. MethodidMethod=null; Iterator<Method>iter=list.iterator(); while(iter.hasNext()){ tempMethod=iter.next(); //如果方法名中带有ID字符串并且长度为2,则视为ID. if(tempMethod.getName().lastIndexOf("Id")!=-1&&tempMethod.getName().substring(3).length()==2){ obj[list.size()-1]=tempMethod.invoke(entity,newObject[]{}); //把ID字段的对象存放到一个变量中,然后在集合中删掉. idMethod=tempMethod; iter.remove(); //如果方法名去掉set/get字符串以后与pojo+"id"想符合(大小写不敏感),则视为ID }elseif((entity.getClass().getSimpleName()+"Id").equalsIgnoreCase(tempMethod.getName().substring(3))){ obj[list.size()-1]=tempMethod.invoke(entity,newObject[]{}); idMethod=tempMethod; iter.remove(); } } //把迭代指针移到第一位 iter=list.iterator(); while(iter.hasNext()){ tempMethod=iter.next(); sql+=tempMethod.getName().substring(3).toLowerCase()+"=?,"; obj[i]=tempMethod.invoke(entity,newObject[]{}); i++; } //去掉最后一个,符号 sql=sql.substring(0,sql.lastIndexOf(",")); //添加条件 sql+="where"+idMethod.getName().substring(3).toLowerCase()+"=?"; //SQL拼接完成,打印SQL语句 System.out.println(sql); st=conn.prepareStatement(sql); for(intj=0;j<obj.length;j++){ st.setObject(j+1,obj[j]); } result=st.executeUpdate(); jdbcUtil.getClose(rs,st,conn); returnresult; } publicTfindById(Objectobject)throwsException{ Stringsql="select*from"+persistentClass.getSimpleName().toLowerCase()+"where"; //通过子类的构造函数,获得参数化类型的具体类型.比如BaseDAO<T>也就是获得T的具体类型 Tentity=persistentClass.newInstance(); //存放Pojo(或被操作表)主键的方法对象 MethodidMethod=null; List<Method>list=this.matchPojoMethods(entity,"set"); Iterator<Method>iter=list.iterator(); //过滤取得Method对象 while(iter.hasNext()){ MethodtempMethod=iter.next(); if(tempMethod.getName().indexOf("Id")!=-1&&tempMethod.getName().substring(3).length()==2){ idMethod=tempMethod; }elseif((entity.getClass().getSimpleName()+"Id").equalsIgnoreCase(tempMethod.getName().substring(3))){ idMethod=tempMethod; } } //第一个字母转为小写 sql+=idMethod.getName().substring(3,4).toLowerCase()+idMethod.getName().substring(4)+"=?"; System.out.println(sql); st=conn.prepareStatement(sql); //判断id的类型 if(objectinstanceofInteger){ st.setInt(1,(Integer)object); }elseif(objectinstanceofString){ st.setString(1,(String)object); } rs=st.executeQuery(); //把指针指向迭代器第一行 iter=list.iterator(); //封装 while(rs.next()){ while(iter.hasNext()){ Methodmethod=iter.next(); if(method.getParameterTypes()[0].getSimpleName().indexOf("String")!=-1){ //由于list集合中,method对象取出的方法顺序与数据库字段顺序不一致(比如:list的第一个方法是setDate,而数据库按顺序取的是"123"值) //所以数据库字段采用名字对应的方式取. this.setString(method,entity,rs.getString(method.getName().substring(3).toLowerCase())); }elseif(method.getParameterTypes()[0].getSimpleName().indexOf("Date")!=-1){ this.setDate(method,entity,rs.getDate(method.getName().substring(3).toLowerCase())); }else{ this.setInt(method,entity,rs.getInt(method.getName().substring(3).toLowerCase())); } } } jdbcUtil.getClose(rs,st,conn); returnentity; } /** *过滤当前Pojo类所有带传入字符串的Method对象,返回List集合. */ privateList<Method>matchPojoMethods(Tentity,StringmethodName){ //获得当前Pojo所有方法对象 Method[]methods=entity.getClass().getDeclaredMethods(); //List容器存放所有带get字符串的Method对象 List<Method>list=newArrayList<Method>(); //过滤当前Pojo类所有带get字符串的Method对象,存入List容器 for(intindex=0;index<methods.length;index++){ if(methods[index].getName().indexOf(methodName)!=-1){ list.add(methods[index]); } } returnlist; } /** *参数类型为String时,为entity字段设置参数,对应set */ publicStringsetString(Methodmethod,Tentity,Stringarg)throwsException{ return(String)method.invoke(entity,newObject[]{arg}); } /** *参数类型为Date时,为entity字段设置参数,对应set */ publicDatesetDate(Methodmethod,Tentity,Datearg)throwsException{ return(Date)method.invoke(entity,newObject[]{arg}); } /** *参数类型为Integer或int时,为entity字段设置参数,对应set */ publicIntegersetInt(Methodmethod,Tentity,Integerarg)throwsException{ return(Integer)method.invoke(entity,newObject[]{arg}); } }
以上这篇基于JDBC封装的BaseDao(实例代码)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。