Java反射机制根据实体生成SQL

1 篇文章 0 订阅
1 篇文章 0 订阅

   最近因为项目需要,需要根据实体的参数去写SQL,以前没有用过Java的反射机制,不是很熟;自己在网上参考了他们对反射机制的运用和理解自己写了一个Demo,分别生成insert 语句,update语句,delete语句,select语句。例子很简单可以参考,由于自己不会说理论所以就自己看代码吧偷笑

1:创建实体Student

import java.util.Date;


public class Student {
	private Integer id;
	private String  name;
	private String  sex;
	private Date    age;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public Date getAge() {
		return age;
	}
	public void setAge(Date age) {
		this.age = age;
	}
	

}

2:创建反射方法ReflexEntity

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;

import com.demo.entity.Student;

/**
 * 此类分别针对insert,update,delete,select 语句的反射生成
 * 分别为
 * getSelects  查询SQL
 * getUpdates  修改SQL
 * getDeletes  删除SQL
 * getInserts  增加SQL
 * 此方法应还要对异常的处理进行完善,这个根据项目需求自己添加
 * @author ShuaiShuai
 *
 */
public class ReflexEntity {
	/**
	 * 查询SQL拼接
	 * @param obj
	 * @return
	 */
	public String getSelects(Object obj){
		String sql="select * from ";
		if (null!=obj){
			//获取实体的名称并小写实体名
			sql=sql+obj.getClass().getName().substring(obj.getClass().getName().lastIndexOf(".")+1).toLowerCase();
		}
	    Field[] fe=obj.getClass().getDeclaredFields();//通过数组获取该类型下所有的属性
	    try{
	     if(fe.length>=0){
	       sql=sql+" where 1=1 ";
	       for(int j=0;j<fe.length;j++){
	    	   String name=fe[j].getName();//获取属性名称
	    	   name=name.substring(0, 1).toUpperCase()+name.substring(1);//将属性的首字母大写,调用的get方法属性名大写
	    	   String type=fe[j].getGenericType().toString();//获取属性值的类型
	    	   //判断属性值属于什么,然后根据类型获取其中的值    根据项目需求自行增加类型判断
	    	   //String 类型
	    	   if(type.equals("class java.lang.String")){
	    		   Method m = obj.getClass().getMethod("get" + name);
	    		   String value=(String) m.invoke(obj);//获取属性值
	    		   if(null!=value && !"".equals(value)){
	    			   sql=sql+" and "+fe[j].getName()+"='"+value+"'";
	    		   }
	    		   
	    	   }
	    	   //Date类型
	    	   if(type.equals("class java.util.Date")){
	    		   Method m = obj.getClass().getMethod("get" + name);
	    		   Date value=(Date) m.invoke(obj);
	    		   if(null!=value && !"".equals(value)){
	    			   sql=sql+" and "+fe[j].getName()+"='"+value+"'";
	    		   }
	    	   }
	    	   //Integer类型
	    	   if(type.equals("class java.lang.Integer")){
	    		   Method m = obj.getClass().getMethod("get" + name);
	    		   Integer value=(Integer) m.invoke(obj);
	    		   if(null!=value && !"".equals(value)){
	    			   sql=sql+" and "+fe[j].getName()+"='"+value+"'";
	    		   }
	    	   }
	    	   //Boolean类型
	    	   if(type.equals("class java.lang.Boolean")){
	    		   Method m = obj.getClass().getMethod("get" + name);
	    		   Boolean value=(Boolean) m.invoke(obj);
	    		   if(null!=value && !"".equals(value)){
	    			   sql=sql+" and "+fe[j].getName()+"="+value ;
	    		   }
	    	   }
	    	   
	       }	
	     }
	    }catch(Exception e){
	    	e.printStackTrace();
	    }
		return sql;
	}
	/**
	 * 修改SQL拼接
	 * @param obj
	 * @return
	 */
	public String getUpdates(Object obj){
		String sql="update ";
		try{
			if(null!=obj){
	           sql=sql+obj.getClass().getName().substring(obj.getClass().getName().lastIndexOf(".")+1).toLowerCase();
	           String parameter=" set ";
	           Field[] fields=obj.getClass().getDeclaredFields();//获取实体的所有属性
	           String trems=" where 1=1 ";
	           for(int j=0;j<fields.length;j++){
	        	   String name=fields[j].getName();//获取属性名
	        	   name=name.substring(0, 1).toUpperCase()+name.substring(1);//首字母大写   通过get获取值方法名大写
	        	   String type=fields[j].getGenericType().toString();//获取属性值的类型
	        	   //修改语句必须有条件,此处默认为主键ID值    一般ID是唯一的
	        	   
	        		   //判断属性值,然后根据属性值拼接sql
		        	   if(type.equals("class java.lang.String")){
		        		   Method m=obj.getClass().getMethod("get" + name);
		        		   String value=(String)m.invoke(obj);
		        		   if(null!=value && !"".equals(value)){
		        			   //判断参数是否为遍历的第一个
		        			   if(" set ".equals(parameter) || " set "==parameter){
		        				    parameter=parameter+ fields[j].getName()+"='"+value+"'";
		        			   }else{
		        			        parameter=parameter+","+fields[j].getName()+"='"+value+"'";
		        			   }
		        		   }
		        	   }
		        	   if(type.equals("class java.lang.Integer")){
		        		   Method m=obj.getClass().getMethod("get" + name);
		        		   Integer value=(Integer)m.invoke(obj);
		        		   if(fields[j].getName().toUpperCase().equals("ID") || "ID"==fields[j].getName().toUpperCase()){
		        			  //如果参数为ID 此处应该拼接条件语句
		        			  trems=trems+" and id='"+value+"'";
		        			  continue;
		        		   }else{
			        		   if(null!=value && !"".equals(value)){
			        			   //判断参数是否为遍历的第一个
			        			   if(" set ".equals(parameter) || " set "==parameter){
			        				    parameter=parameter+ fields[j].getName()+"='"+value+"'";
			        			   }else{
			        			        parameter=parameter+","+fields[j].getName()+"='"+value+"'";
			        			   }
			        		   }
		        		   }
		        	   }
		        	   if(type.equals("class java.util.Date")){
		        		   Method m=obj.getClass().getMethod("get" + name);
		        		   Date value=(Date)m.invoke(obj);
		        		   if(null!=value && !"".equals(value)){
		        			   //判断参数是否为遍历的第一个
		        			   if(" set ".equals(parameter) || " set "==parameter){
		        				    parameter=parameter+ fields[j].getName()+"='"+value+"'";
		        			   }else{
		        			        parameter=parameter+","+fields[j].getName()+"='"+value+"'";
		        			   }
		        		   }
		        	   }
		        	   if(type.equals("class java.lang.Boolean")){
		        		   Method m=obj.getClass().getMethod("get" + name);
		        		   Boolean value=(Boolean)m.invoke(obj);
		        		   if(null!=value && !"".equals(value)){
		        			   //判断参数是否为遍历的第一个
		        			   if(" set ".equals(parameter) || " set "==parameter){
		        				    parameter=parameter+ fields[j].getName()+"='"+value;
		        			   }else{
		        			        parameter=parameter+","+fields[j].getName()+"='"+value;
		        			   }
		        		   }
	        	      }
	           }//循环结束,拼接SQL
	           if(" set "==parameter || " set ".equals(parameter)){  //参数为空,不执行
	        	   return null;
	           }else if(" where 1=1 "==trems || " where 1=1 ".equals(trems)){  //如果条件为空,不执行,如果需要修改所有请调整(项目中应拒绝这种修改所有的情况)
	        	   return null;
	           }else{
	        	   sql=sql+parameter+trems;
	           }
			}else{
				System.out.println("---------------错误信息----------------");
				System.out.println("传的实体"+obj.getClass().getName()+"为空");
				System.out.println("---------------错误信息结束----------------");
				return null;
			}
		}catch(Exception e){
			System.out.println("----------异常信息--------------");
			e.printStackTrace();
			System.out.println("----------异常信息结束--------------");
			return null;
		}
		return sql;
	}
	/**
	 * 删除SQL拼接
	 * @param obj
	 * @return
	 */
	public String getDeletes(Object obj){
		String sql="delete ";
		try{
			if(null!=obj){
				//获取实体名称,并实体名称小写
			    sql=sql+obj.getClass().getName().substring(obj.getClass().getName().lastIndexOf(".")+1).toLowerCase();
				Field[] fields=obj.getClass().getDeclaredFields();//获取所有的属性
				String trems=" where 1=1 "; //条件语句
				for(int j=0;j<fields.length;j++){
					String name =fields[j].getName();
					name=name.substring(0,1).toUpperCase()+name.substring(1);//首字母大写,调用get方法获取属性值
					String type=fields[j].getGenericType().toString();//获取属性的参数的类型
					if(type.equals("class java.lang.String")){
						Method m=obj.getClass().getDeclaredMethod("get"+name);//获取get方法,取值
						String value=(String)m.invoke(obj);
						if(null!=value && !"".equals(value)){
							trems=trems+" and "+fields[j].getName().toLowerCase()+"='"+value+"'";
						}
					}
					if(type.equals("class java.lang.Integer")){
						Method m=obj.getClass().getDeclaredMethod("get"+name);//获取get方法,取值
						Integer value=(Integer)m.invoke(obj);
						if(null!=value && !"".equals(value)){
							trems=trems+" and "+fields[j].getName().toLowerCase()+"='"+value+"'";
						}
					}
					if(type.equals("class java.util.Date")){
						Method m=obj.getClass().getDeclaredMethod("get"+name);//获取get方法,取值
						Date value=(Date)m.invoke(obj);
						if(null!=value && !"".equals(value)){
							trems=trems+" and "+fields[j].getName().toLowerCase()+"='"+value+"'";
						}
					}
					if(type.equals("class java.lang.Boolean")){
						Method m=obj.getClass().getDeclaredMethod("get"+name);//获取get方法,取值
						Boolean value=(Boolean)m.invoke(obj);
						if(null!=value && !"".equals(value)){
							trems=trems+" and "+fields[j].getName().toLowerCase()+"="+value;
						}
					}
				}//循环结束 拼接SQL
				if(" where 1=1 "==trems || " where 1=1 ".equals(trems)){  //如果删除语句条件为空不执行删除语句 (正式生产环境是不会删除整张表数据)
				    sql=null;
				    return sql;
				}else{
					sql=sql+trems;
				}
			}else{
				System.out.println("-----------------实体为空-----------------");
				return null;
			}
		}catch(Exception e){
			System.out.println("-----------------异常信息-----------------");
			e.printStackTrace();
			System.out.println("-----------------异常信息结束-----------------");
			return null;
		}
		return sql;
	}
	/**
	 * 新增SQL拼接
	 * @param obj
	 * @return
	 */
	public String getInserts(Object obj){
		String sql="insert into ";
		try{
			if(null!=obj){
				//获取实体名称,名称小写
				sql=sql+obj.getClass().getName().substring(obj.getClass().getName().lastIndexOf(".")+1).toLowerCase();
				Field[] fields=obj.getClass().getDeclaredFields();//获取所有的属性
				String argumentName="("; //属性拼接
				String priceValue="(";//属性值
				for(int j=0;j<fields.length;j++){
					String name=fields[j].getName();
					name=name.substring(0,1).toUpperCase()+name.substring(1); //获取get方法,取值
					String type=fields[j].getGenericType().toString();
					if(type.equals("class java.lang.String")){
						Method m=obj.getClass().getDeclaredMethod("get"+name);
						String value=(String)m.invoke(obj);
						if(null!=value && !"".equals(value)){
							if("(".equals(argumentName) || "("==argumentName){
								argumentName=argumentName+fields[j].getName().toUpperCase();
							}else{
								argumentName=argumentName+","+fields[j].getName().toUpperCase();
							}
							if("(".equals(priceValue) || "("==priceValue){
								priceValue=priceValue+"'"+value+"'";
							}else{
								priceValue=priceValue+",'"+value+"'";
							}
						}
						
					}
					if(type.equals("class java.lang.Integer")){
						Method m=obj.getClass().getDeclaredMethod("get"+name);
						Integer value=(Integer)m.invoke(obj);
						if(null!=value && !"".equals(value)){
							if("(".equals(argumentName) || "("==argumentName){
								argumentName=argumentName+fields[j].getName().toUpperCase();
							}else{
								argumentName=argumentName+","+fields[j].getName().toUpperCase();
							}
							if("(".equals(priceValue) || "("==priceValue){
								priceValue=priceValue+value;
							}else{
								priceValue=priceValue+","+value;
							}
						}
						
					}
					if(type.equals("class java.lang.Boolean")){
						Method m=obj.getClass().getDeclaredMethod("get"+name);
						Boolean value=(Boolean)m.invoke(obj);
						if(null!=value && !"".equals(value)){
							if("(".equals(argumentName) || "("==argumentName){
								argumentName=argumentName+fields[j].getName().toUpperCase();
							}else{
								argumentName=argumentName+","+fields[j].getName().toUpperCase();
							}
							if("(".equals(priceValue) || "("==priceValue){
								priceValue=priceValue+value;
							}else{
								priceValue=priceValue+","+value;
							}
						}
						
					}
					if(type.equals("class java.util.Date")){
						Method m=obj.getClass().getDeclaredMethod("get"+name);
						Date value=(Date)m.invoke(obj);
						if(null!=value && !"".equals(value)){
							if("(".equals(argumentName) || "("==argumentName){
								argumentName=argumentName+fields[j].getName().toUpperCase();
							}else{
								argumentName=argumentName+","+fields[j].getName().toUpperCase();
							}
							if("(".equals(priceValue) || "("==priceValue){
								priceValue=priceValue+"'"+value+"'";
							}else{
								priceValue=priceValue+",'"+value+"'";
							}
						}
						
					}
					
				}//循环结束 ,拼接SQL 
				if("(".equals(argumentName) || "("==argumentName){
					sql=null;
					return sql;
				}else if("(".equals(priceValue) || "("==priceValue){
					sql=null;
					return sql;
				}else{
					sql=sql+argumentName+") values "+priceValue+")";
				}
			}else{
				System.out.println("-----------------实体为空-----------------");
				return null;
			}
			
		}catch(Exception e){
			System.out.println("-----------------异常信息-----------------");
			e.printStackTrace();
			System.out.println("-----------------异常信息结束-----------------");
			return null;
		}
		return sql;
	}
}
3:测试SQL生成

	public static void main(String[] args) {
		Student st=new Student();
		st.setId(1);
		st.setName("张三");
		st.setSex(null);
		st.setAge(new Date());
		ReflexEntity t=new ReflexEntity();
		String sql=t.getSelects(st);
		String sql1=t.getUpdates(st);
		String sql2=t.getDeletes(st);
		String sql3=t.getInserts(st);
		System.out.println("------------查询语句--------------");
		if(null!=sql){
			System.out.println(sql);
		}else{
			System.out.println("查询sql没有生成,有异常");
		}
		System.out.println("------------修改语句--------------");
		if(null!=sql1){
			System.out.println(sql1);
		}else{
			System.out.println("修改sql没有生成,有异常");
		}
		System.out.println("------------删除语句--------------");
		if(null!=sql2){
			System.out.println(sql2);
		}else{
			System.out.println("删除sql没有生成,有异常");
		}
		System.out.println("------------insert语句--------------");
		if(null!=sql2){
			System.out.println(sql3);
		}else{
			System.out.println("insert sql没有生成,有异常");
		}
		
	}
	
结果如下

------------查询语句--------------
select * from student where 1=1  and id='1' and name='张三' and age='Mon Jan 16 15:05:43 CST 2017'
------------修改语句--------------
update student set name='张三',age='Mon Jan 16 15:05:43 CST 2017' where 1=1  and id='1'
------------删除语句--------------
delete student where 1=1  and id='1' and name='张三' and age='Mon Jan 16 15:05:43 CST 2017'
------------insert语句--------------
insert into student(ID,NAME,AGE) values (1,'张三','Mon Jan 16 15:05:43 CST 2017')




  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值