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
*/
publicstaticStringgetInsertSql(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
*/
publicstaticStringgetUpdateSql(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
*/
publicstaticStringgetDeleteSql(Stringtablename,Tt)throwsIllegalArgumentException{
//deletefromtable_namewherecolumn_name=value
returngetSelectOrDeleteSql(tablename,t,"delete");
}
/**
*生成查询语句
*根据user中第一个不为空的字段查询
*@paramtablename表名
*@paramt有数据的实体
*@param数据实体类型如User
*/
publicstaticStringgetSelectSql(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
*/
privatestaticStringgetSelectOrDeleteSql(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();
ListpropertyList=newArrayList();
for(inti=0;ibeanPropertyList=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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。