根据map键值对,生成update与select语句,单条执行语句
方法
constructUpdateSQL
private static String constructUpdateSQL(String tableName, List<Map<String, Object>> maps, String primaryKeyName) {
/*update testMultiUpdateSQL set
remark = case id
when 1 then '是小明介绍来的'
when 2 then '比较有钱'
end,
realname = case id
when 1 then '田馥甄'
when 2 then '陈嘉桦'
end
where id in
( 1, 2 )*/
// 主键值合集
List<String> primaryKeyValues = new ArrayList<String>();
for (Map<String, Object> map : maps) {
primaryKeyValues.add(String.valueOf(map.get(primaryKeyName)));
}
// 列名集合
List<String> keys = new ArrayList<String>();
Map<String, Object> sigleMap = maps.get(0);
for (Map.Entry<String, Object> sigleEntry : sigleMap.entrySet()) {
String key = sigleEntry.getKey();
if (key.equals(primaryKeyName)) {
continue;
} else {
keys.add(key);
}
}
StringBuilder updateSQL = new StringBuilder();
updateSQL.append("UPDATE " + tableName + " SET ");
for (String key : keys) {
updateSQL.append(key + " = case " + primaryKeyName + " ");
for (String pkv : primaryKeyValues) {
for (Map<String, Object> map : maps) {
if (map.get(primaryKeyName).equals(pkv)) {
String val = String.valueOf(map.get(key));
updateSQL.append("when '" + pkv + "' then '" + val + "'");
break;
}
}
}
updateSQL.append("end,");
}
if (updateSQL.toString().endsWith(",")) {
updateSQL.deleteCharAt(updateSQL.length() - 1);
}
updateSQL.append(" WHERE " + primaryKeyName + " in ");
updateSQL.append("(");
for (String primaryKeyValue : primaryKeyValues) {
updateSQL.append("'" + primaryKeyValue + "',");
}
if (updateSQL.toString().endsWith(",")) {
updateSQL.deleteCharAt(updateSQL.length() - 1);
}
updateSQL.append(")");
return updateSQL.toString();
}
constructInsertSQL
private static String constructInsertSQL(String tableName, List<Map<String, Object>> maps) {
if (maps == null || maps.size() == 0) {
return "";
}
StringBuilder sb1 = new StringBuilder();
sb1.append("INSERT INTO ");
sb1.append(tableName);
sb1.append("(");
Map<String, Object> allField = maps.get(0); // 获取第一个集合,用户获取字段名
for (Map.Entry<String, Object> soe : allField.entrySet()) {
String fieldName = soe.getKey();
sb1.append(fieldName + ",");
}
if (sb1.lastIndexOf(",") == sb1.length() - 1) {
sb1.deleteCharAt(sb1.length() - 1);
}
sb1.append(")");
sb1.append(" VALUES ");
StringBuilder sb2 = new StringBuilder();
for (Map<String, Object> map : maps) {
StringBuilder t = new StringBuilder();
t.append("(");
for (Map.Entry<String, Object> filed : map.entrySet()) {
Object fieldValue = filed.getValue();
if (!PubString.isNullOrSpace(fieldValue)) {
t.append("'" + fieldValue + "',");
} else {
t.append("'',");
}
}
if (t.lastIndexOf(",") == t.length() - 1) {
t.deleteCharAt(t.length() - 1);
}
t.append("),");
sb2.append(t);
}
if (sb2.lastIndexOf(",") == sb2.length() - 1) {
sb2.deleteCharAt(sb2.length() - 1);
}
sb1.append(sb2).append(";");
return sb1.toString();
}
测试
Map m1 = new HashMap();
m1.put("id", "7f758e9e4e1b47cf8fad39f022e0a425");
m1.put("remark", "按时");
m1.put("realname", "阿斯顿发多少"); Map m2 = new HashMap();
m2.put("id", "d629146efa804612a64860f1e85d1249");
m2.put("remark", "陈嘉阿斯顿发斯蒂芬桦");
m2.put("realname", "田阿斯顿发送到馥甄"); List<Map<String, Object>> maps = new ArrayList<Map<String, Object>>();
maps.add(m1);
maps.add(m2); String updateSQL = constructUpdateSQL("testMultiUpdateSQL", maps, "id");
System.out.println(updateSQL); String insertSQL = constructInsertSQL("testMultiUpdateSQL", maps);
System.out.println(insertSQL);
update
testMultiUpdateSQL
set
remark = case
id
when '7f758e9e4e1b47cf8fad39f022e0a425' then '按时'
when 'd629146efa804612a64860f1e85d1249' then '陈嘉阿斯顿发斯蒂芬桦'
end,
realname = case
id
when '7f758e9e4e1b47cf8fad39f022e0a425' then '阿斯顿发多少'
when 'd629146efa804612a64860f1e85d1249' then '田阿斯顿发送到馥甄'
end
where
id in ( '7f758e9e4e1b47cf8fad39f022e0a425', 'd629146efa804612a64860f1e85d1249' ) ================================================================================================== insert
into
testMultiUpdateSQL( remark, id, realname )
values ( '按时', '7f758e9e4e1b47cf8fad39f022e0a425', '阿斯顿发多少' ),
( '陈嘉阿斯顿发斯蒂芬桦', 'd629146efa804612a64860f1e85d1249', '田阿斯顿发送到馥甄' );
根据map键值对,生成update与select语句,单条执行语句的更多相关文章
- 用字典给Model赋值并支持map键值替换
用字典给Model赋值并支持map键值替换 这个是昨天教程的升级版本,支持键值的map替换. 源码如下: NSObject+Properties.h 与 NSObject+Properties.m / ...
- java 把json对象中转成map键值对
相关:Json对象与Json字符串的转化.JSON字符串与Java对象的转换 本文的目的是把json串转成map键值对存储,而且只存储叶节点的数据 比如json数据如下: {responseHeade ...
- 如何将Map键值的下划线转为驼峰
本文不再更新,可能存在内容过时的情况,实时更新请移步我的新博客:如何将Map键值的下划线转为驼峰: 例,将HashMap实例extMap键值下划线转为驼峰: 代码: HashMap<String ...
- Java Map 键值对排序 按key排序和按Value排序
一.理论准备 Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等. TreeMap:基于红黑树(Red-Black tre ...
- 枚举类返回Map键值对,绑定到下拉框
有时候,页面的下拉框要显示键值对,但是不想从数据库取,此时我们可以写一个枚举类, Java后台代码 1.枚举类 import java.util.HashMap; import java.util.M ...
- ODAC(V9.5.15) 学习笔记(十九)主键值自动生成
ODAC支持通过Oracle的序列来自动生成表的主键功能.这个过程允许在客户端自动完成,不需要过多代码.这个对一些要求自动增长字段做主键的场合非常有用.其实现步骤为: 1.数据库必须先建立生成主键的序 ...
- Java的map键值对的用法,map的遍历,Entry对象的使用
思路: 1.定义集合 2.存储数据 3.添加元素 4.遍历 4.1将需要遍历的集合的键封装到set集合中(这用到了entrySet方法,和Entry对象) 4.2声明迭代器或者用for增强循环 4.3 ...
- a=av###b=bv###c=cv map键值对 (a,av) (b,bv) (c,cv)
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; impo ...
- list转map 键值对
Map<Long,Account> map = new HashMap<Long,Account>(); for(int i=0;i<list.size();i++){ ...
随机推荐
- 物联网将在2018年实现大规模发展--IBM的四大预测
物联网将在2018年实现大规模发展--IBM的四大预测 数据是数字化变革的基本组成部分,物联网.人工智能.区块链.边缘计算等技术预计将在来年掀起巨浪, 因为这些技术是收集.分析和存储信息的方法. ...
- shell 计算时间差
#!/bin/bash #date_5='awk 'BEGIN{print strftime("%H:%M",(systime()-300))}'' #ps -ef | grep ...
- c# vs2010 excel 上传oracle数据
excel 数据表上传到oracle数据库.过程例如以下: 1.打开本地excel文件 2.用OleDb连接excel文件 3.将来excel的数据读取到dataset中 4.把dataset 中数据 ...
- Java 泛型(Generics) 综述
一. 引子 一般的类和方法.仅仅能使用详细类型:要么是基本类型.要么是自己定义类型.假设要编写能够应用于多种类型的代码,这样的刻板的限制对代码的束缚就会非常大. 多态算是一种泛化机制,但对代码的约束还 ...
- [na]TCP的三次握手四次挥手/SYN泛洪
1.TCP报文格式 上图中有几个字段需要重点介绍下: (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记. (2)确认序号:Ack序号,占32位, ...
- NET二进制图片存储与读取的常见方法,iTextSharp添加图片生成PDF文件
public void iTextSharpCreatPDF() { string pdfpath = System.Web.HttpContext.Current.Server.MapPath(&q ...
- C++标准库及其保留字(关键字)——附:C++标准文档
引言 C++到目前共发布了4个国际标准:ISO/IEC 14882:1998.ISO/IEC 14882:2003.ISO/IEC 14882:2011.ISO/IEC 14882:20 ...
- kernel dump Analysis
https://social.msdn.microsoft.com/Forums/vstudio/en-US/0c418482-7edd-4c91-b7f4-6005d550244a/got-the- ...
- angular学习笔记(三十)-指令(9)-一个简单的指令示例
学了前面这么多关于指令的知识,现在就用指令来写一个小组件:expander 这个组件的功能就是点击开展菜单,再点击收起菜单: ↑↓点击展开收起 下面来看它的代码: html: <!DOCTYPE ...
- (原创)C++11改进我们的程序之简化我们的程序(六)
这次要讲的内容是:c++11中的lamda表达式. lamda表达式是我最喜欢的一个c++11特性之一,在我的代码中随处可见它的身影,其实在c#3.5中就引入了lamda,java中至今还没引入,要等 ...