• 反射生成 INSERT 多个对象的 SQL 语句(批量插入)


    + View code
    private static void insertObject(List<?> objectList) throws IllegalAccessException {
            /**
             * 比如:
             * SQL 语句:insert into person(name, age, info) values ('...', '...', '...');
             * 其中 values 改为占位符:
             * SQL 语句:insert into person(name, age, info) values (?, ?, ?);
             * 再获取所有的数据值 Object 数组
             * [zhengbin, 21, 要毕业了]
             */
            // 确定占位符的个数(即对象中不为 null 的字段个数)
            int columnNum = 0;
            // 插入数据的列名
            StringBuilder columns = new StringBuilder("(");
            // 填充占位符的值(即对象中不为null的字段的值)
            List<Object> valuesList = new ArrayList<Object>();
            // 如果为空则不执行
            if (CollectionUtil.isEmpty(objectList)) {
                return;
            }
            // 通过 List 中的第一个 Object,确定插入对象的字段
            Object object = objectList.get(0);
            Class clazz = object.getClass();
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true);
                if (field.get(object) != null) {
                    columnNum++;
                    columns.append(field.getName()).append(", ");
                    valuesList.add(field.get(object));
                }
            }
            columns.replace(columns.lastIndexOf(", "), columns.length(), ")");
    
            // 获取所有的值
            for (int i = 1; i < objectList.size(); i++) {
                for (Field field : fields) {
                    field.setAccessible(true);
                    if (field.get(objectList.get(i)) != null) {
                        valuesList.add(field.get(objectList.get(i)));
                    }
                }
            }
            // 确定一个 Object 的占位符 '?'
            StringBuilder zhanweifuColumn = new StringBuilder("(");
            for (int i = 0; i < columnNum; i++) {
                zhanweifuColumn.append("?, ");
            }
            zhanweifuColumn.replace(zhanweifuColumn.lastIndexOf(", "), zhanweifuColumn.length(), ")");
    
            // 确定所有的占位符
            int objectNum = objectList.size();
            StringBuilder zhanweifu = new StringBuilder();
            for (int j = 0; j < objectNum; j++) {
                zhanweifu.append(zhanweifuColumn.toString()).append(", ");
            }
            zhanweifu.replace(zhanweifu.lastIndexOf(", "), zhanweifu.length(), "");
    
            // 生成最终 SQL
            String sql = "INSERT INTO " + object.getClass().getSimpleName().toLowerCase() + " " + columns + " VALUES " + zhanweifu.toString();
            System.out.println(sql);
            System.out.println(valuesList);
        }
    

      

  • 相关阅读:
    上周热点回顾(12.10-12.16)团队
    上周热点回顾(12.3-12.9)团队
    上周热点回顾(11.26-12.2)团队
    上周热点回顾(11.19-11.25)团队
    上周热点回顾(11.12-11.18)团队
    【故障公告】SendCloud 邮件发送服务故障造成大量 QQ 邮箱收不到邮件团队
    上周热点回顾(11.5-11.11)团队
    上周热点回顾(10.29-11.4)团队
    SPSS学习系列之SPSS Modeler的帮助文档怎么调出来使用?
    SPSS学习系列之SPSS Text Analytics是什么?
  • 原文地址:https://www.cnblogs.com/firstdream/p/10089413.html
Copyright © 2020-2023  润新知