SQL语句生成器

本文介绍了一个基于Java反射机制的实用工具类,该工具能够根据传入的对象自动生成对应的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;
    }


}

 

打开下面链接,直接免费下载资源: https://renmaiwang.cn/s/vhyry 在当今信息迅速发展的时代,数据库作为存储和管理大量信息的核心系统,其设计和开发工作显得尤为重要。为了提高数据库设计的效率和降低技术门槛,市场上出现了许多数据库设计工具,其中不乏一些完全免费且易于使用的解决方案。这款在线数据库设计工具就是这样一种创新性的工具,它不仅提供免费的服务,还拥有简洁直观的用户界面,让即使是数据库设计初学者也能快速上手。 它的设计考虑到了不同水平的用户需求,通过可视化的操作界面,用户可以轻松地进行表结构的创建、修改和管理。它将复杂的数据库操作简化为简单的图形化操作,让用户可以直观地看到数据结构的变化,无需编写一行代码就可以完成数据库的搭建。 此外,这款工具还配备了自动生成SQL语句的功能。SQL(Structured Query Language)是用于访问和操作数据库的标准编程语言。对于那些需要与数据库交互的高级用户来说,能够快速准确地生成SQL语句显得非常关键。这项功能能够帮助用户自动根据数据库操作生成相应的SQL代码,极大地降低了手动编写SQL语句的错误率,并且提高了开发效率。 在线数据库设计工具的另一个显著特点是它的可访问性。通过互联网,无论用户身在何处,只要有网络连接,就能随时随地进行数据库设计工作。这种便捷性使得团队协作变得更加高效,团队成员可以实时查看设计进度,并提供反馈或进行修改,从而缩短了项目开发周期。 在技术不断发展和更新的今天,这款工具也在不断地进行优化和升级,以适应更多样化的数据库设计需求。它的开源特性允许用户查看源码,并且可以根据自己的实际需求进行定制和扩展,这种开放性使得这款工具在程序员社区中具有很高的认可度和好评度。 这款免费、简单且直观的在线数据库设计工具,不仅降低了数据库设计的技术难度,还提高了开发的效率和质量,是数
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值