最近因为项目需要,需要根据实体的参数去写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')