Java反射 JavaBean对象自动生成插入,更新,删除,查询sql语句操作
通过反射根据提供的表名、POJO类型、数据对象自动生成sql语句。
如名为User的JavaBean与名为user的数据库表对应,可以提供一个封装有数据的User对象user,根据user中含有的数据自动生成sql语句。
1、生成插入语句(插入user中包含的非空数据的语句):
StringinsertSql=getInsertSql("user",User.class,user);
2、生成更新语句(user中id不能为空):
StringupdateSql=getUpdateSql("user",User.class,user);
3、生成删除语句(根据user中第一个非空属性值作为查找条件删除):
//生成删除id为1的语句 Useruser=newUser(); user.setId(1); StringdeleteSql=getDeleteSql("user",User.class,user);
4、生成查询语句(根据user中第一个非空属性值为查找条件):
//生成查询id为1的语句 Useruser=newUser(); user.setId(1); StringselectSql=getSelectSql("user",User.class,user);
packagecom.hims.util; importcn.hutool.core.util.ReflectUtil; importcn.hutool.core.util.StrUtil; importcom.hims.bean.User; importjava.lang.reflect.Field; publicclassProduceSql{ //StringinsertSql=getInsertSql("user",User.class,user); /** *生成插入语句 *@paramtablename表明 *@paramt有数据的实体 *@param数据实体类型如User */ publicstatic StringgetInsertSql(Stringtablename,Tt)throwsIllegalArgumentException{ //insertintotable_name(column_name1,column_name2,...)values(value1,value2,...) booleanflag=false; Stringsql=""; Field[]fields=ReflectUtil.getFieldsDirectly(t.getClass(),false); StringBuffertopHalf=newStringBuffer("insertinto"+tablename+"("); StringBufferafterAalf=newStringBuffer("values("); for(Fieldfield:fields){ if("ID".equals(field.getName())||"id".equals(field.getName())){ continue;//id自动生成无需手动插入 } topHalf.append(field.getName()+","); if(ReflectUtil.getFieldValue(t,field.getName())instanceofString){ afterAalf.append("'"+ReflectUtil.getFieldValue(t,field.getName())+"',"); flag=true; }else{ afterAalf.append(ReflectUtil.getFieldValue(t,field.getName())+","); flag=true; } } if(!flag){ thrownewIllegalArgumentException(t.getClass()+"NullException.\nThereisnoattributethatisnotempty.Youmustprovideanobjectwithatleastoneattribute."); } topHalf=newStringBuffer(StrUtil.removeSuffix(topHalf.toString(),",")); afterAalf=newStringBuffer(StrUtil.removeSuffix(afterAalf.toString(),",")); topHalf.append(")"); afterAalf.append(")"); sql=topHalf.toString()+afterAalf.toString(); returnsql; } /** *生成更新语句 *必须含有id *数据实体中null与空字段不参与更新 *@paramtablename数据库中的表明 *@paramt有数据的实体 *@param 数据实体类型,如User */ publicstatic StringgetUpdateSql(Stringtablename,Tt)throwsIllegalArgumentException{ //UPDATEtable_nameSETcolumn_name1=value1,column_name2=value2,...whereID=xxx //or //UPDATEtable_nameSETcolumn_name1=value1,column_name2=value2,...whereid=xxx booleanflag=false; Stringsql=""; Stringid="";//保存id列名:IDorid Field[]fields=ReflectUtil.getFieldsDirectly(t.getClass(),false); sql="update"+tablename+"set"; for(Fieldfield:fields){ StringBuffertmp=newStringBuffer(); if("ID".equals(field.getName())||"id".equals(field.getName())){ id=field.getName(); continue;//更新的时候无需setid=xxx } if(ReflectUtil.getFieldValue(t,field.getName())!=null&&(String)ReflectUtil.getFieldValue(t,field.getName())!=""){ tmp.append(field.getName()+"="); if(ReflectUtil.getFieldValue(t,field.getName())instanceofString){ tmp.append("'"+ReflectUtil.getFieldValue(t,field.getName())+"',"); flag=true; }else{ tmp.append(ReflectUtil.getFieldValue(t,field.getName())+","); flag=true; } sql+=tmp; } } if(!flag){ thrownewIllegalArgumentException(t.getClass()+"NullException.\nThereisnoattributethatisnotemptyexceptforID.YoumustprovideanobjectwithatleastoneattributeexcludeID."); } sql=StrUtil.removeSuffix(sql,",")+"where"+id+"='"+ReflectUtil.getFieldValue(t,id)+"'"; returnsql; } /** *生成删除语句 *根据user中第一个不为空的字段删除,应该尽量使用id,提供至少一个非空属性 *@paramtablename表明 *@paramt有数据的实体 *@param 数据实体类型如User */ publicstatic StringgetDeleteSql(Stringtablename,Tt)throwsIllegalArgumentException{ //deletefromtable_namewherecolumn_name=value returngetSelectOrDeleteSql(tablename,t,"delete"); } /** *生成查询语句 *根据user中第一个不为空的字段查询 *@paramtablename表名 *@paramt有数据的实体 *@param 数据实体类型如User */ publicstatic StringgetSelectSql(Stringtablename,Tt)throwsIllegalArgumentException{ //deletefromtable_namewherecolumn_name=value returngetSelectOrDeleteSql(tablename,t,"select*"); } /** *根据operation生成一个如:operationfromtable_namewherecolumn_name=value的sql语句 *@paramtablename *@paramt *@paramoperation"select*"or"delete" *@param *@return *@throwsIllegalArgumentException */ privatestatic StringgetSelectOrDeleteSql(Stringtablename,Tt,Stringoperation)throwsIllegalArgumentException{ //operationfromtable_namewherecolumn_name=value booleanflag=false; Stringsql=""; Field[]fields=ReflectUtil.getFieldsDirectly(t.getClass(),false); StringBuffertopHalf=newStringBuffer(operation+"from"+tablename+"where"); for(Fieldfield:fields){ if("ID".equals(field.getName())||"id".equals(field.getName())){ if(ReflectUtil.getFieldValue(t,field.getName())!=null&&(int)ReflectUtil.getFieldValue(t,field.getName())!=0){ //id不为空 topHalf.append(field.getName()+"="+ReflectUtil.getFieldValue(t,field.getName())); flag=true; break; } } else{ if(ReflectUtil.getFieldValue(t,field.getName())!=null&&(String)ReflectUtil.getFieldValue(t,field.getName())!=""){ topHalf.append(field.getName()+"='"+ReflectUtil.getFieldValue(t,field.getName())+"'"); flag=true; break; } } } if(!flag){ thrownewIllegalArgumentException(t.getClass()+"NullException.\nThereisnoattributethatisnotempty.Youmustprovideanobjectwithatleastoneattribute."); } sql=topHalf.toString(); returnsql; } }
补充知识:通过java反射实现对javabean生成各种sql语句
通过java反射实现对javabean生成各种sql语句,有请大家评论,更改
packagecom.pdt.util; importjava.lang.reflect.Field; importjava.util.ArrayList; importjava.util.List; publicclassBeanUtil{ /** *@paramargs */ publicstaticvoidmain(String[]args){ System.out.println(getBeanFilesList("com.pdt.bean.Dictionary")); System.out.println(genCreateTableSql("com.pdt.bean.Dictionary")); System.out.println(genInsertSql("com.pdt.bean.Dictionary")); } publicstaticStringgetBeanName(Stringbean){ try{ Classclz=Class.forName(bean); StringclzStr=clz.toString(); //得到类名 StringbeanName=clzStr.substring(clzStr.lastIndexOf(".")+1).toLowerCase(); returnbeanName; }catch(ClassNotFoundExceptione){ e.printStackTrace(); return""; } } publicstaticListgetBeanPropertyList(Stringbean){ try{ Classclz=Class.forName(bean); Field[]strs=clz.getDeclaredFields(); List propertyList=newArrayList (); for(inti=0;i beanPropertyList=getBeanPropertyList(bean); StringBuffersb=newStringBuffer("createtablewnk_pdt_"+getBeanName(bean)+"(\n"); for(Stringstring:beanPropertyList){ String[]propertys=string.split("`"); if(!propertys[1].equals("tableName")&&!propertys[1].equals("param")&&!propertys[0].equals("List")){ if(propertys[1].equals("id")){ sb.append("idbigintprimarykeyauto_increment,\n"); }else{ if(propertys[0].equals("int")){ sb.append(""+propertys[1]+"intdefault0comment'',\n"); }elseif(propertys[0].equals("String")){ sb.append(""+propertys[1]+"varchar(2000)default''comment'',\n"); }elseif(propertys[0].equals("double")){ sb.append(""+propertys[1]+"double(10,2)default0.0comment'',\n"); }elseif(propertys[0].equals("Date")){ sb.append(""+propertys[1]+"datetimecomment'',\n"); } } } } sb.append(")"); sb.deleteCharAt(sb.lastIndexOf(",")); returnsb.toString(); } /** *生成查询语句 *@parambean *@return */ publicstaticStringgenSelectAllSql(Stringbean){ StringfilesList=getBeanFilesList(bean); return"select\n"+filesList+"\nfrom\nwnk_pdt_"+getBeanName(bean)+""; } /** *生成插入语句 *@parambean *@return */ publicstaticStringgenInsertSql(Stringbean){ StringfilesList=getBeanFilesList(bean); intfl=DataUtil.getCountSonStr(filesList,",")+1; Stringwenhao=""; for(inti=0;i 以上这篇Java反射JavaBean对象自动生成插入,更新,删除,查询sql语句操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。