+ 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);
}

  

反射生成 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. socket的阻塞与非阻塞,同步与异步

    同步/异步主要针对C端: 同步:      所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步 ...

  2. VisualVM远程连接Tomcat

    最近项目已经要提测了,有时间来考虑一些性能上的事儿了.之前拜读过<深入理解java虚拟机>,只可惜当时功力尚浅,有些东西还是不太懂,而且应用场景也没有,所以借这次机会看看.当然了,这次并不 ...

  3. LINUX负载均衡LVS-DR搭建

    1.搭建前的规划工作 这里从lvs官方网站找了一个nat模型的图,如下: 我这里使用虚拟机模拟出了4台rhel6机器.一台服务器作为lvs调度器(和宿主机桥接),3台服务器作为具体的web服务器(使用 ...

  4. MariaDB/MySQL备份和恢复(二):数据导入、导出

    MariaDB/MySQL备份恢复系列: 备份和恢复(一):mysqldump工具用法详述 备份和恢复(二):导入.导出表数据 备份和恢复(三):xtrabackup用法和原理详述 1.导出.导入数据 ...

  5. Linux核心命令

    Linux核心命令 strace(查看系统调用的一个过程) 例:strace cat /test.txt netstat perf top pidstat mpstat dstat vmstat sl ...

  6. [转]php 图片验证码生成 前后台验证

    本文转自:https://www.cnblogs.com/xiaoyezi/p/3541195.html 自己从前一段时间做了个php小项目,关于生成图片验证码生成和后台的验证,把自己用到的东西总结一 ...

  7. C#函数返回值。

    一.params. 可变参数,无论有几个参数,必须出现在参数列表的最后,可以为可变参数直接传递一个对应类型的数组. class Program { static void Main(string[] ...

  8. IdentityServer4客户端JWT解密实现(基于.net4.0)

    情景:公司项目基于.net4.0,web客户端实现单点登录需要自己解密id_token,对于jwt解密,.net提供了IdentityModel类库,但是4.0中该类库不可用,所以自己实现了解密方法. ...

  9. dotnetcore-officeaddin-toolbox : Office 365 Add-in开发人员的工具箱

    在上一篇文章(.NET Core开源行动:一键创建Excel Add-in) 中我给大家展示了一套为Office 365 Add-in开发人员准备的模板库,你可以通过 dotnet new excel ...

  10. MyBatis:Pagehelper分页

    对于分页插件这里选择查询所有用户的信息,以列表返回 前端只需输入分页数的数据既可 service实现类也很方便,甚至我都开始有点喜欢上这种Example的SQL形式了. 最后页面调用url的json信 ...