根据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++){ ...
随机推荐
- 用Python3发送邮件详解
[整个邮件系统是怎样工作的] 邮件自互联网诞生之初就有了,它和web服务一样也是采用的c/s架构,比如我们常见的邮件客户端有outlook.foxmail这些邮件客户端软件. 当我们要发邮件时客户端就 ...
- kibana 的search 的的搜索提示挡住输入框
解决方案就是 [root@10-19-148-59 styles]# pwd /data/package/kibana/src/public/styles [root@10-19-148-59 sty ...
- CSS加DIV布局
第一种: <div> <div class="right"> <p></p> <p></p> <p&g ...
- Android 3.0开始引入fragments(碎片、片段)类
Fragment要点 Fragment作为Activity界面的一部分组成出现. 可以在一个Activity中同时出现多个Fragment,并且,一个Fragment亦可在多个Activity中使用. ...
- React Native超棒的LayoutAnimation(布局动画)
该文翻译自:https://medium.com/@Jpoliachik/react-native-s-layoutanimation-is-awesome-4a4d317afd3e#.6 ...
- SQL Server 2008 添加登录账户 配置权限
首先打开数据库,并以windows身份验证模式扥牢固数据库, 然后在左侧的[对象资源管理器中]展开[安全性]节点,鼠标右键点击节点中的[登录名],在弹出的菜单中单击[新建登录名],弹出如图对话框: 然 ...
- x86-64整数寄存器
- iOS 系统消息通知
一.键盘 1.UIKeyboardWillShowNotification-将要弹出键盘 2.UIKeyboardDidShowNotification-显示键盘 3.UIKeyboardWillHi ...
- 常用sql自定义函数
--把数字转为千分位格式的字符串显示,调用如 select dbo.f_splitstr(11111111111111) CREATE FUNCTION [dbo].[f_splitstr]( @st ...
- 菜鸟学SSH(四)——Struts2拦截器
什么是拦截器 拦截器(Interceptor)是Struts 2的一个强有力的工具,有许多功能都是构建于它之上,如国际化(前两篇博客介绍过).转换器,校验等. 拦截器是动态拦截Action调用的对象. ...