SQL语句生成器

这天闲来无事,利用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;
    }


}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值