这天闲来无事,利用java的映射机制及字符串连接操作做了个小东西,感觉挺有意思。

/**//**
* 基本操作增、删、改、查的SQL语句生成工具类
* 传入一个数据对象,返回其相应操作的SQL语句
* 目前对象内部属性只支持String,short,int,long,float,double,java.sql.Date
* 要求:
* 1.数据对象的类名要与数据库表名对应,数据对象内部属性要与数据库表列名对应
* 2.数据对象的构造时需要将内部属性初始化为下列DEFAULT_XXX常量
*
* @author pl_leaf
*/
package com.leaf.common;
import java.lang.reflect.Field;
import java.sql.Date;

public class SQLCreater ...{
public final static String DEFAULT_STRING = null;
public final static short DEFAULT_SHORT = Short.MIN_VALUE;
public final static int DEFAULT_INT = Integer.MIN_VALUE;
public final static long DEFAULT_LONG = Long.MIN_VALUE;
public final static float DEFAULT_FLOAT = Float.MIN_VALUE;
public final static double DEFAULT_DOUBLE = Double.MIN_VALUE;
public final static Date DEFAULT_DATE = null;
public static String createSQLInsert(Object value)
throws IllegalArgumentException, IllegalAccessException ...{
return createSQLInsert(value, null);
}
public static String createSQLDelete(Object value)
throws IllegalArgumentException, IllegalAccessException ...{
return createSQLDelete(value, null);
}
public static String createSQLUpdate(Object value, String condition)
throws IllegalArgumentException, IllegalAccessException ...{
return createSQLUpdate(value, null, condition);
}
public static String createSQLSelect(Object value)
throws IllegalArgumentException, IllegalAccessException ...{
return createSQLSelect(value, null);
}

/**//**
* 生成插入语句 将[数据对象]中有数据的属性存入数据库 如[数据对象]中存在不需要存入数据库的属性,将属性名写入[过滤] 格式:
* |field1|field2|field3|..
*
* @param value
* @param filter
* @return
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public static String createSQLInsert(Object value, String filter)
throws IllegalArgumentException, IllegalAccessException ...{
if (value==null)
return "Error: Object is null";
boolean isChangeAccessible;
Class clazz = value.getClass();
Field fields[] = clazz.getDeclaredFields();
StringBuffer sb = new StringBuffer("insert into "
+ clazz.getSimpleName() + "(");
StringBuffer sbvalue = new StringBuffer(") values (");
for (int i = 0; i < fields.length; i++) ...{
if (isInFilter(filter, fields[i].getName()))
continue;
isChangeAccessible = !fields[i].isAccessible();
fields[i].setAccessible(true);
if (fields[i].getType().equals(String.class)
&& fields[i].get(value) != DEFAULT_STRING) ...{
sb.append(fields[i].getName() + ",");
sbvalue.append("'" + fields[i].get(value) + "',");
} else if (fields[i].getType().equals(int.class)
&& fields[i].getInt(value) != DEFAULT_INT) ...{
sb.append(fields[i].getName() + ",");
sbvalue.append(fields[i].getInt(value) + ",");
} else if (fields[i].getType().equals(double.class)
&& fields[i].getDouble(value) != DEFAULT_DOUBLE) ...{
sb.append(fields[i].getName() + ",");
sbvalue.append(fields[i].getDouble(value) + ",");
} else if (fields[i].getType().equals(long.class)
&& fields[i].getLong(value) != DEFAULT_LONG) ...{
sb.append(fields[i].getName() + ",");
sbvalue.append(fields[i].getLong(value) + ",");
} else if (fields[i].getType().equals(float.class)
&& fields[i].getFloat(value) != DEFAULT_FLOAT) ...{
sb.append(fields[i].getName() + ",");
sbvalue.append(fields[i].getFloat(value) + ",");
} else if (fields[i].getType().equals(Date.class)
&& fields[i].get(value) != DEFAULT_DATE) ...{
sb.append(fields[i].getName() + ",");
sbvalue.append("'" + fields[i].get(value) + "',");
} else if (fields[i].getType().equals(short.class)
&& fields[i].getShort(value) != DEFAULT_SHORT) ...{
sb.append(fields[i].getName() + ",");
sbvalue.append(fields[i].getShort(value) + ",");
}
if (isChangeAccessible)
fields[i].setAccessible(false);
}
sb.deleteCharAt(sb.length() - 1);
sbvalue.deleteCharAt(sbvalue.length() - 1);
return sb.toString() + sbvalue.toString() + ")";
}

/**//**
* 生成删除语句 如属性全不填则不删除 其余参数请参照createSQLInsert
*
* @param value
* @param filter
* @return
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public static String createSQLDelete(Object value, String filter)
throws IllegalArgumentException, IllegalAccessException ...{
if (value==null)
return "Error: Object is null";
boolean isChangeAccessible;
Class clazz = value.getClass();
Field fields[] = clazz.getDeclaredFields();
StringBuffer sb = new StringBuffer("delete from "
+ clazz.getSimpleName() + " where 1=0 or ");

for (int i = 0; i < fields.length; i++) ...{
if (isInFilter(filter, fields[i].getName()))
continue;
isChangeAccessible = !fields[i].isAccessible();
fields[i].setAccessible(true);
if (fields[i].getType().equals(String.class)
&& fields[i].get(value) != DEFAULT_STRING) ...{
sb.append(fields[i].getName() + "='" + fields[i].get(value)
+ "' and ");
} else if (fields[i].getType().equals(int.class)
&& fields[i].getInt(value) != DEFAULT_INT) ...{
sb.append(fields[i].getName() + "=" + fields[i].getInt(value)
+ " and ");
} else if (fields[i].getType().equals(double.class)
&& fields[i].getDouble(value) != DEFAULT_DOUBLE) ...{
sb.append(fields[i].getName() + "="
+ fields[i].getDouble(value) + " and ");
} else if (fields[i].getType().equals(long.class)
&& fields[i].getLong(value) != DEFAULT_LONG) ...{
sb.append(fields[i].getName() + "=" + fields[i].getLong(value)
+ " and ");
} else if (fields[i].getType().equals(float.class)
&& fields[i].getFloat(value) != DEFAULT_FLOAT) ...{
sb.append(fields[i].getName() + "=" + fields[i].getFloat(value)
+ " and ");
} else if (fields[i].getType().equals(Date.class)
&& fields[i].get(value) != DEFAULT_DATE) ...{
sb.append(fields[i].getName() + "='" + fields[i].get(value)
+ "' and ");
} else if (fields[i].getType().equals(short.class)
&& fields[i].getShort(value) != DEFAULT_SHORT) ...{
sb.append(fields[i].getName() + "=" + fields[i].getShort(value)
+ " and ");
}
if (isChangeAccessible)
fields[i].setAccessible(false);
}
return sb.delete(sb.length() - 4, sb.length() - 1).toString();
}

/**//**
* 生成更新语句 condition为条件列表,指定[数据对象]中哪些属性是做为条件使用. 格式:
* |field1|field2|field3|.... 如没有条件则不更新
*
* @param value
* @param filter
* @param condition
* @return
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public static String createSQLUpdate(Object value, String filter,
String condition) throws IllegalArgumentException,
IllegalAccessException ...{
if (value==null)
return "Error: Object is null";
boolean isChangeAccessible;
Class clazz = value.getClass();
Field fields[] = clazz.getDeclaredFields();
StringBuffer sb = new StringBuffer("update " + clazz.getSimpleName()
+ " set ");
StringBuffer sbvalue = new StringBuffer(" where 1=0 or ");
for (int i = 0; i < fields.length; i++) ...{
if (isInFilter(filter, fields[i].getName()))
continue;
isChangeAccessible = !fields[i].isAccessible();
fields[i].setAccessible(true);
if (fields[i].getType().equals(String.class)
&& fields[i].get(value) != DEFAULT_STRING) ...{
if (isInFilter(condition, fields[i].getName()))
sbvalue.append(fields[i].getName() + "='"
+ fields[i].get(value) + "' and ");
else
sb.append(fields[i].getName() + "='" + fields[i].get(value)
+ "',");
} else if (fields[i].getType().equals(int.class)
&& fields[i].getInt(value) != DEFAULT_INT) ...{
if (isInFilter(condition, fields[i].getName()))
sbvalue.append(fields[i].getName() + "="
+ fields[i].getInt(value) + " and ");
else
sb.append(fields[i].getName() + "="
+ fields[i].getInt(value) + ",");
} else if (fields[i].getType().equals(double.class)
&& fields[i].getDouble(value) != DEFAULT_DOUBLE) ...{
if (isInFilter(condition, fields[i].getName()))
sbvalue.append(fields[i].getName() + "="
+ fields[i].getDouble(value) + " and ");
else
sb.append(fields[i].getName() + "="
+ fields[i].getDouble(value) + ",");
} else if (fields[i].getType().equals(long.class)
&& fields[i].getLong(value) != DEFAULT_LONG) ...{
if (isInFilter(condition, fields[i].getName()))
sbvalue.append(fields[i].getName() + "="
+ fields[i].getLong(value) + " and ");
else
sb.append(fields[i].getName() + "="
+ fields[i].getLong(value) + ",");
} else if (fields[i].getType().equals(float.class)
&& fields[i].getFloat(value) != DEFAULT_FLOAT) ...{
if (isInFilter(condition, fields[i].getName()))
sbvalue.append(fields[i].getName() + "="
+ fields[i].getFloat(value) + " and ");
else
sb.append(fields[i].getName() + "="
+ fields[i].getFloat(value) + ",");
} else if (fields[i].getType().equals(Date.class)
&& fields[i].get(value) != DEFAULT_DATE) ...{
if (isInFilter(condition, fields[i].getName()))
sbvalue.append(fields[i].getName() + "='"
+ fields[i].get(value) + "' and ");
else
sb.append(fields[i].getName() + "=" + fields[i].get(value)
+ ",");
} else if (fields[i].getType().equals(short.class)
&& fields[i].getShort(value) != DEFAULT_SHORT) ...{
if (isInFilter(condition, fields[i].getName()))
sbvalue.append(fields[i].getName() + "="
+ fields[i].getShort(value) + " and ");
else
sb.append(fields[i].getName() + "="
+ fields[i].getShort(value) + ",");
}
if (isChangeAccessible)
fields[i].setAccessible(false);
}
sb.deleteCharAt(sb.length() - 1);
return sb.toString() + sbvalue.delete(sbvalue.length()-4, sbvalue.length()-1).toString();
}

/**//**
* 生成查看语句
*
* @param value
* @param filter
* @return
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
public static String createSQLSelect(Object value, String filter)
throws IllegalArgumentException, IllegalAccessException ...{
if (value==null)
return "Error: Object is null";
boolean isChangeAccessible;
Class clazz = value.getClass();
Field fields[] = clazz.getDeclaredFields();
StringBuffer sb = new StringBuffer("select * from "
+ clazz.getSimpleName() + " where 1=1");

for (int i = 0; i < fields.length; i++) ...{
if (isInFilter(filter, fields[i].getName()))
continue;
isChangeAccessible = !fields[i].isAccessible();
fields[i].setAccessible(true);
if (fields[i].getType().equals(String.class)
&& fields[i].get(value) != DEFAULT_STRING) ...{
sb.append(" and " + fields[i].getName() + "='"
+ fields[i].get(value) + "'");
} else if (fields[i].getType().equals(int.class)
&& fields[i].getInt(value) != DEFAULT_INT) ...{
sb.append(" and " + fields[i].getName() + "="
+ fields[i].getInt(value));
} else if (fields[i].getType().equals(double.class)
&& fields[i].getDouble(value) != DEFAULT_DOUBLE) ...{
sb.append(" and " + fields[i].getName() + "="
+ fields[i].getDouble(value));
} else if (fields[i].getType().equals(long.class)
&& fields[i].getLong(value) != DEFAULT_LONG) ...{
sb.append(" and " + fields[i].getName() + "="
+ fields[i].getLong(value));
} else if (fields[i].getType().equals(float.class)
&& fields[i].getFloat(value) != DEFAULT_FLOAT) ...{
sb.append(" and " + fields[i].getName() + "="
+ fields[i].getFloat(value));
} else if (fields[i].getType().equals(Date.class)
&& fields[i].get(value) != DEFAULT_DATE) ...{
sb.append(" and " + fields[i].getName() + "='"
+ fields[i].get(value) + "'");
} else if (fields[i].getType().equals(short.class)
&& fields[i].getShort(value) != DEFAULT_SHORT) ...{
sb.append(" and " + fields[i].getName() + "="
+ fields[i].getShort(value));
}
if (isChangeAccessible)
fields[i].setAccessible(false);
}
return sb.toString();
}

/**//**
* 如果value在filter中返回真,否则返回假
*
* @param filter
* @param value
* @return
*/
private static boolean isInFilter(String filter, String value) ...{
if (filter != null && filter.indexOf("|" + value + "|") != -1)
return true;
return false;
}
}
本文介绍了一个基于Java反射机制的实用工具类,该工具能够根据传入的对象自动生成对应的SQL语句,支持增删改查操作,并允许指定过滤字段和条件字段。
3607





