java 根据实体对象生成 增删改的SQL语句 ModelToSQL

摘要:
“);param.add;{}}System.err.println;this.sqlBuffer=sqlBuffer.toString();}protectedObjectreadField{try{returnFieldUtils.readField;}catch{thrownewRuntimeException;}}/***为{if(!”);param.add;System.err.println;this.sqlBuffer=sqlBuffer.toString();}/***创建更新语句*/privatevoidcreateUpdate(){StringtableName=getTableName();getFields;StringBuffersqlBuffer=newStringBuffer()获取表名*/privateStringgetTableName(){StringtableName=null;Class˂?根据注释?
package com.xxx.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.List;
import java.util.Vector;

import org.apache.commons.lang3.reflect.FieldUtils;

public class ModelToSQL {
    private Object target;

    private String idName;

    private Object idValue;

    private SqlType currentType;

    public enum SqlType {
        INSERT, UPDATE, DELETE
    }

    public ModelToSQL(SqlType sqlType, Object target) {
        this.target = target;
        switch (sqlType) {
        case INSERT:
            currentType = SqlType.INSERT;
            createInsert();
            break;
        case UPDATE:
            currentType = SqlType.UPDATE;
            createUpdate();
            break;
        case DELETE:
            currentType = SqlType.DELETE;
            createDelete();
            break;
        }
    }

    public ModelToSQL(Class<?> target) {
        String tableName = getTableNameForClass(target);
        getFields(target);

        StringBuffer sqlBuffer = new StringBuffer();
        sqlBuffer.append("DELETE FROM ").append(tableName).append(" WHERE ");
        for (Field field : fields) {
            if (!Modifier.isStatic(field.getModifiers())) {
                ID id = field.getAnnotation(ID.class);
                if (null != id) {
                    sqlBuffer.append(field.getName()).append("=?");
                }
            }
        }
        this.sqlBuffer = sqlBuffer.toString();
    }

    /**
     * 创建跟删除
     */
    private void createDelete() {
        String tableName = getTableName();
        getFields(target.getClass());
        StringBuffer sqlBuffer = new StringBuffer();
        sqlBuffer.append("DELETE FROM ").append(tableName).append(" WHERE ");
        for (Field field : fields) {
            if (!Modifier.isStatic(field.getModifiers())) {
                ID id = field.getAnnotation(ID.class);
                if (null != id) {
                    sqlBuffer.append(field.getName()).append(" = ? ");
                    param.add(readField(field));
                }
            }
        }
        System.err.println("delete:	"+sqlBuffer.toString());
        this.sqlBuffer = sqlBuffer.toString();
    }

    protected Object readField(Field field) {
        try {
            return FieldUtils.readField(field, target, true);
        } catch (Exception e) {
            throw new RuntimeException(currentType.name(), e);
        }
    }

    /**
     * 创建更新语句
     */
    private void createUpdate() {
        String tableName = getTableName();
        getFields(target.getClass());
        StringBuffer sqlBuffer = new StringBuffer();
        sqlBuffer.append("UPDATE ").append(tableName).append(" SET ");

        for (Field field : fields) {
            if (!Modifier.isStatic(field.getModifiers())) {
                ID id = field.getAnnotation(ID.class);
                if (id == null) {
                    sqlBuffer.append(field.getName()).append("=? , ");
                    param.add(readField(field));
                } else {
                    idName = field.getName();
                    idValue = readField(field);
                }
            }
        }
        sqlBuffer.replace(sqlBuffer.length()-2, sqlBuffer.length()-1, " ");
        if (idName == null) {
            throw new RuntimeException("not found of " + target.getClass() + "'s ID");
        }
        sqlBuffer.append(" WHERE ").append(idName).append("=?");
        param.add(idValue);
System.err.println("update:	"+sqlBuffer.toString());
        this.sqlBuffer = sqlBuffer.toString();
    }

    /**
     * 根据注解获取表名
     */
    private String getTableName() {
        String tableName = null;
        Class<?> clazz = target.getClass();
        tableName = getTableNameForClass(clazz);
        return tableName;
    }

    private String getTableNameForClass(Class<?> clazz) {
        String tableName;
        Table table = clazz.getAnnotation(Table.class);
        if (null != table) {
            tableName = table.name();
            if ("".equalsIgnoreCase(tableName)) {
                tableName = clazz.getSimpleName();
            }
        } else {
            tableName = clazz.getSimpleName();
        }
        return tableName;
    }

    /**
     * 创建插入语句
     */
    private void createInsert() {
        String tableName = getTableName();
        getFields(target.getClass());
        StringBuffer sqlBuffer = new StringBuffer();
        sqlBuffer.append("INSERT INTO ").append(tableName).append("(");

        for (Field field : fields) {
            if (!Modifier.isStatic(field.getModifiers())) {
                ID id = field.getAnnotation(ID.class);
                if (id == null) {
                    sqlBuffer.append(field.getName()).append(",");
                    param.add(readField(field));
                }
            }
        }
        int length = sqlBuffer.length();
        sqlBuffer.delete(length - 1, length).append(")values(");
        int size = param.size();
        for (int x = 0; x < size; x++) {
            if (x != 0) {
                sqlBuffer.append(",");
            }
            sqlBuffer.append("?");
        }
        sqlBuffer.append(")");
System.err.println("insert:	"+sqlBuffer.toString());
        this.sqlBuffer = sqlBuffer.toString();
    }

    private List<Object> param = new Vector<Object>();

    private String sqlBuffer;

    public List<Object> getParam() {
        return param;
    }

    public String getSqlBuffer() {
        return sqlBuffer;
    }

    public String getIdName() {
        return idName;
    }

    public Object getIdValue() {
        return idValue;
    }

    List<Field> fields = new Vector<Field>();

    protected void getFields(Class<?> clazz) {
        if (Object.class.equals(clazz)) {
            return;
        }
        Field[] fieldArray = clazz.getDeclaredFields();
        for (Field file : fieldArray) {
            fields.add(file);
        }
        getFields(clazz.getSuperclass());
    }

    //创建注解,标识该model的table名
    @java.lang.annotation.Target(value = { java.lang.annotation.ElementType.TYPE })
    @java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
    public @interface Table {
        String name() default "";
    }

    //创建注解,标识该model的id字段
    @java.lang.annotation.Target(value = { java.lang.annotation.ElementType.FIELD })
    @java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
    public @interface ID {
    }
}

  

免责声明:文章转载自《java 根据实体对象生成 增删改的SQL语句 ModelToSQL》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇分布式监控系统vite尝鲜-最新代码原理分析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Luci实现框架

1.总述 上一篇总结了uhttpd的工作方式,openwrt中利用它作为web服务器,实现客户端web页面配置功能。对于request处理方式,采用的是cgi,而所用的cgi程序就是luci,工作框架如下图所示: Client端和serv端采用cgi方式交互,uhttpd服务器的cgi方式中,fork出一个子进程,子进程利用execl替换为luci进...

python网编_进程之开启一个进程

直接上代码: importtime,os from multiprocessing importProcess # 导入模块 deffunc(): time.sleep(1) print('hello',os.getpid()) #os.getpid()的作用是打印进程id if __name__ == '__main__':...

CentOS8安装图形界面

1、安装图形化桌面的软件包: yum groupinstall "Server with GUI" -y 安装过程比较长,出现以下界面安装完成:  2、输入systemctl get-default查看系统启动模式。multi-user.target(命令行终端),graphical.target(图形化界面)    3、通过命令更改系统启动模式: sy...

VS 项目(c#)引用了 DLL文件,也写了Using,但是编译时提示:未能找到类型或命名空间名称

1. 在项目上点右键-->属性-->应用程序-->目标框架-->修改为.NET Framework 4。 而我原来的设置是.NET Framework 4 Client Profile。问题就出在这里。 以下是MSDN给出的提示: If you are targeting the .NET Framework 4 Client Pr...

iOS开发基础知识--碎片26

  iOS开发基础知识--碎片26  1:UICollectionView如果在数据不够一屏时上下滚动 当数据不多,collectionView.contentSize小于collectionView.frame.size的时候,UICollectionView是不会滚动的,可以增加下面代码就可以: self.myCollectionView.alwa...

CentOS7安装mysql后无法启动服务,提示Unit not found

1、最近在centos7上面进行mysql安装完成后,无法启动,报如下错误: Failed to start mysql.server.service: Unit not found. 2、这个是知乎上面找到的无法启动的答案:https://www.zhihu.com/question/41832866 3、解决办法一:使用MariaDB代替mysql数...