使用JDBC(Dbutils工具包)来从数据库拿取map类型数据来动态生成insert语句
2023-02-18 16:42:09 时间
前言:
大家在使用JDBC来连接数据库时,我们通过Dbutils工具来拿取数据库中的数据,可以使用new BeanListHandler<>(所映射的实体类.class),这样得到的数据,不知道表的字段名字,我们在往数据库里添加时,需要自己来挨个写字段,非常麻烦!
于是,小编想到通过MapListHandler(),结果集为一个List<Map<String, Object>>,map中key为数据库字段名字,value为对应的值,这样就可以实现insert语句动态拼接了!!
步入正题:
直接展示代码
Connection con = null;
Statement sta = null;
try {
//1.注册驱动==》告诉指挥部有哪些造桥人可以调遣
Class.forName("com.mysql.cj.jdbc.Driver");
//这里是mysql为例 oracle的url ---"jdbc:oracle:thin:@localhost:1521:orcl"
String url = "jdbc:mysql://127.0.0.1:3306/test_1.0";
String user = "root";
String pwd = "root";
//2.获得链接==》指挥部根据传入类型 调遣不同的造桥的人造桥
con = DriverManager.getConnection(url,user,pwd);
//3.创建Statement对象===》造车
sta = con.createStatement();
//4.执行SQL ==》运行SQL 有结果返回
String sql="select * from user";
//第五步处理结果还可以引入Dbutils工具包来解析结果
QueryRunner queryRunner = new QueryRunner();
//添加map为了key作为表名
Map<String,List<Map<String, Object>>> mapMap = new HashMap<>();
List<Map<String, Object>> query = queryRunner.query(con, sql, new MapListHandler());
mapMap.put("user",query);
for (Map.Entry<String,List<Map<String, Object>>> mapTop :mapMap.entrySet()) {
String table = mapTop.getKey();//得到表名
//便利每个表的数据
for (Map<String, Object> button : mapTop.getValue()){
String columnName = "";//表的列名
String columnValue = "";//表对应的数据值
//拼接列名
for (String string :button.keySet()){
columnName+=string+",";
}
if (columnName != null){
columnName = columnName.substring(0, columnName.length()-1);
}
//拼接数据值
for (Object object : button.values() ){
if (object != null) {
columnValue += "'" + object.toString() + "',";
}else {//解决查询到的数据为null并且为int类型的
columnValue += "null,";
}
}
if (columnValue !=null){
columnValue = columnValue.substring(0,columnValue.length()-1);
}
//组装sql
String sql1 = "insert into "+ table +" ("+ columnName + ") values ("+ columnValue +")";
queryRunner.update(con, sql1);
}
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}finally {
//6.关闭资源
close(con,sta);
}
总结:
这样就可以实现insert语句的动态添加,不用再一个个的写数据库字段名字和对应的values值了
相关文章
- vivo 全球商城:订单中心架构设计与实践
- 发布会直播技术及业务实践
- vivo 商城架构升级-SSR 实战篇
- vivo 微服务 API 网关架构实践
- SPI 在 Dubbo中 的应用
- Sentinel 是如何做限流的
- 领域驱动设计(DDD)实践之路(四):领域驱动在微服务设计中的应用
- vivo 全球商城:从 0 到 1 代销业务的融合之路
- vivo 全球商城:架构演进之路
- 当我们谈前端性能的时候,我们谈的是什么
- 分布式搜索引擎 Elasticsearch 的架构分析
- 异步编程之事件循环机制
- Seata是什么?一文了解其实现原理
- Canal 组件简介与 vivo 帐号实践
- 源码深度解析 Handler 机制及应用
- 彻底搞懂 IO 底层原理
- 播放器性能优化之路
- vivo商城前端架构升级—多端统一探索、实践与展望篇
- vivo 调用链 Agent 原理及实践
- 分布式集群如何实现高效的数据分布