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


    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 {
        }
    }
    

      

  • 相关阅读:
    洛谷—— P3353 在你窗外闪耀的星星
    洛谷—— P1238 走迷宫
    洛谷—— P1262 间谍网络
    9.8——模拟赛
    洛谷—— P1189 SEARCH
    算法
    May 22nd 2017 Week 21st Monday
    May 21st 2017 Week 21st Sunday
    May 20th 2017 Week 20th Saturday
    May 19th 2017 Week 20th Friday
  • 原文地址:https://www.cnblogs.com/firstdream/p/10089425.html
Copyright © 2020-2023  润新知