使用JDBC(Dbutils工具包)来从数据库拿取map类型数据来动态生成insert语句
前言:
大家在使用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值了