根据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++){ ...
随机推荐
- js中多个数字运算后值不对(失真)处理方法
最近遇到一个bug ,在js里面计算两个数字相减,633011.20-31296.30 得到的结果居然是601714.89,领导不乐意了说怎么少了0.01,我一听,噶卵达,来达鬼,不可能啊,我Goog ...
- ubuntu 安装python mysqldb
sudo apt-get install python-mysqldb #!/usr/bin/python #-*-coding:utf-8-*- ''' This file include all ...
- 腾讯企业邮箱SMTP-邮件发送失败异常:“ SMTPSendFailedException:501 ϵͳÒÑÇ¿ÖÆ¿ªÆôÕʺÅÉý¼¶ÉèÖã¬ÇëµÇ¼e
这里我们在报警发送邮件用的是腾讯的企业邮箱,突然这两天没有报警邮件,很是奇怪 发送邮件报错 SMTP-邮件发送失败异常:“ SMTPSendFailedException:501 ϵͳÒÑÇ¿ÖÆ ...
- js获取checkbox复选框获取选中的选项
js获取checkbox复选框获取选中的选项 分享下javascript获取checkbox 复选框获取选中的选项的方法. 有关javascript 获取checkbox复选框的实例数不胜数.js实现 ...
- Atitit undac网络设备管理法案 (路由器 交换机等) 法案编号USRr101510
Atitit undac网络设备管理法案 (路由器 交换机等) 法案编号USRr101510 1.1. 版本历史1 1.2. 密码设置规范 与原则1 1.3. 如何设置密码 ,设置一个简单又安 ...
- Android-一只手指滑动View,另一只手指按Home键,重新进入后View状态无法更新的问题
上午测试报了一个bug:说是一只手指拖动虚拟摇杆上的View滑块不松,另一只手指点击Home键将App压后台,重新进入的时候,View滑块卡死了. 刚开始看到这个问题感觉很奇怪,因为正常情况下,手指离 ...
- 牛津大学xDeepMind自然语言处理
http://study.163.com/course/introduction/1004336028.htm
- [Windows Azure]The Autoscaling Application Block
The Autoscaling Application Block 5 out of 6 rated this helpful - Rate this topic ...
- Ubuntu访问Windows共享目录
你可以选择目录挂载的形式,也可以选择直接使用图形界面的形式. 下面直接在文件浏览器中打开windows共享目录. 1 安装samba sudo apt-get install samba 2 打开一个 ...
- 解析虚拟VMware三种网络模式的根本区别
网络模式(文字解说)VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下 ...