1. + View code
  2. private static void insertObject(List<?> objectList) throws IllegalAccessException {
  3. /**
  4. * 比如:
  5. * SQL 语句:insert into person(name, age, info) values ('...', '...', '...');
  6. * 其中 values 改为占位符:
  7. * SQL 语句:insert into person(name, age, info) values (?, ?, ?);
  8. * 再获取所有的数据值 Object 数组
  9. * [zhengbin, 21, 要毕业了]
  10. */
  11. // 确定占位符的个数(即对象中不为 null 的字段个数)
  12. int columnNum = 0;
  13. // 插入数据的列名
  14. StringBuilder columns = new StringBuilder("(");
  15. // 填充占位符的值(即对象中不为null的字段的值)
  16. List<Object> valuesList = new ArrayList<Object>();
  17. // 如果为空则不执行
  18. if (CollectionUtil.isEmpty(objectList)) {
  19. return;
  20. }
  21. // 通过 List 中的第一个 Object,确定插入对象的字段
  22. Object object = objectList.get(0);
  23. Class clazz = object.getClass();
  24. Field[] fields = clazz.getDeclaredFields();
  25. for (Field field : fields) {
  26. field.setAccessible(true);
  27. if (field.get(object) != null) {
  28. columnNum++;
  29. columns.append(field.getName()).append(", ");
  30. valuesList.add(field.get(object));
  31. }
  32. }
  33. columns.replace(columns.lastIndexOf(", "), columns.length(), ")");
  34.  
  35. // 获取所有的值
  36. for (int i = 1; i < objectList.size(); i++) {
  37. for (Field field : fields) {
  38. field.setAccessible(true);
  39. if (field.get(objectList.get(i)) != null) {
  40. valuesList.add(field.get(objectList.get(i)));
  41. }
  42. }
  43. }
  44. // 确定一个 Object 的占位符 '?'
  45. StringBuilder zhanweifuColumn = new StringBuilder("(");
  46. for (int i = 0; i < columnNum; i++) {
  47. zhanweifuColumn.append("?, ");
  48. }
  49. zhanweifuColumn.replace(zhanweifuColumn.lastIndexOf(", "), zhanweifuColumn.length(), ")");
  50.  
  51. // 确定所有的占位符
  52. int objectNum = objectList.size();
  53. StringBuilder zhanweifu = new StringBuilder();
  54. for (int j = 0; j < objectNum; j++) {
  55. zhanweifu.append(zhanweifuColumn.toString()).append(", ");
  56. }
  57. zhanweifu.replace(zhanweifu.lastIndexOf(", "), zhanweifu.length(), "");
  58.  
  59. // 生成最终 SQL
  60. String sql = "INSERT INTO " + object.getClass().getSimpleName().toLowerCase() + " " + columns + " VALUES " + zhanweifu.toString();
  61. System.out.println(sql);
  62. System.out.println(valuesList);
  63. }

  

反射生成 INSERT 多个对象的 SQL 语句(批量插入)的更多相关文章

  1. SQL语句-批量插入表(表数据插表)

    批量插入表(表数据插表) ****1.INSERT INTO SELECT语句语句形式为:Insert into Table2(field1,field2,...) select value1,val ...

  2. .net Sql语句批量插入数据库数据

    #region 使用SqlBulkCopy public static bool ExecuteTransactionScopeInsert(DataTable dt, int batchSize) ...

  3. C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例

    Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. ...

  4. statement 对象执行sql语句

    statement对象执行sql语句    关于Statement.它是Java执行数据库操作的一个重要步骤,可以执行一些简单的SQL语句,从而完成对数据库的操作.它有两个子接口,分别是Prepare ...

  5. SQL SERVER 使用BULK Insert将txt文件中的数据批量插入表中(1)

    1/首先建立数据表 CREATE TABLE BasicMsg( RecvTime FLOAT NOT NULL , --接收时间,不存在时间相同的数据 AA INT NOT NULL, --24位地 ...

  6. SQL 2005批量插入数据的二种方法

    SQL 2005批量插入数据的二种方法 Posted on 2010-07-22 18:13 moss_tan_jun 阅读(2635) 评论(2) 编辑 收藏 在SQL Server 中插入一条数据 ...

  7. 一条insert语句批量插入多条记录

    一条insert语句批量插入多条记录 常见的insert语句,向数据库中,一条语句只能插入一条数据: insert into persons (id_p, lastname , firstName,  ...

  8. statement对象与sql语句(新手)

    本篇介绍读上篇代码中的疑惑点 实现简单网页上对数据内容进行增删改查,需要用到三个部分:jsp网页前端部分+java后台程序+数据库表 一.创建一个Statement (用于在已经建立数据库连接的基础上 ...

  9. SQL Server 批量插入数据方案 SqlBulkCopy 的简单封装,让批量插入更方便

    一.Sql Server插入方案介绍 关于 SqlServer 批量插入的方式,有三种比较常用的插入方式,Insert.BatchInsert.SqlBulkCopy,下面我们对比以下三种方案的速度 ...

随机推荐

  1. Redis 超时排查

    突然收到告警,提示redis挂了,同时大群也在说某某redis连接超时了,过了一会儿就恢复了.这时登上服务器,查看监控.首先看看qps: 可以看到qps并不高,但是中间有段时间没取到数据是怎么回事?那 ...

  2. SpringBoot(9) SpringBoot整合Mybaties

    一.近几年常用的访问数据库的方式和优缺点 1.原始java访问数据库 开发流程麻烦 <1>注册驱动/加载驱动 Class.forName("com.mysql.jdbc.Driv ...

  3. Java设计模式学习记录-备忘录模式

    前言 这次要介绍的是备忘录模式,也是行为模式的一种 .现在人们的智能手机上都会有备忘录这样一个功能,大家也都会用,就是为了记住某件事情,防止以后自己忘记了.那么备忘录模式又是什么样子的呢?是不是和手机 ...

  4. centos7安装kafka_2.11

    1.下载 官网地址:http://kafka.apache.org/downloads.html 下载:wget https://www.apache.org/dyn/closer.cgi?path= ...

  5. 业务开发(一)—— MySQL

    0x01.SQL异常Incorrect string value java.sql.SQLException: Incorrect string value: '\xE6\x88\x91\xE7\x9 ...

  6. 【转载】在Centos系统上采用二进制文件部署Node.js环境

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,用来方便地搭建快速的易于扩展的网络应用.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又 ...

  7. Elasticsearch系列(1):认识Elasticsearch

    官方定义 Elasticsearch 是一个实时的分布式搜索分析引擎, 它能让你以一个之前从未有过的速度和规模,去探索你的数据. 它被用作全文检索.结构化搜索.分析以及这三个功能的组合. Elasti ...

  8. Html5、css、JavaScript基础

    一.HTML学习 HTML样式Css 内联样式- 在HTML元素中使用"style" 属性 内部样式表 -在HTML文档头部 <head> 区域使用<style& ...

  9. 向后台提交数据:通过form表单提交数据需刷新网页 但通过Ajax提交数据不用刷新网页可通过原生态Ajax或jqueryAjax。Ajax代码部分

    原生态Ajax提交表单:需要借助XMLHttpRequest对象的open,要收通过post发送请求还要setRequsetHeader,然后把数据发送给后端,代码如下 目录结构 index.py代码 ...

  10. Javascript URI 解析介绍

    URI 在维基百科中对于URI的解释是这样子的: 在计算机术语中,统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一互联网资源名称的字符串. 该种标识 ...