zoukankan      html  css  js  c++  java
  • 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 {
        }
    }
    

      

  • 相关阅读:
    【剑指offer】数字在排序数组中出现的次数
    移动互联网的架构设计浅谈一
    Android开发中遇到的adb问题解决方法
    Datagrid分页、排序、删除代码
    新辰:关于个人站点安全问题的分析及对策探讨
    Android开发中,activity页面跳转后是空白
    实战——二、c#窗体(2)
    实战——一、c#窗体(1)
    c#的sealed修饰符
    c#中,类的重写中,new和override的区别
  • 原文地址:https://www.cnblogs.com/firstdream/p/10089425.html
Copyright © 2011-2022 走看看