JDBC实现复杂SQL增删改事务功能
程序员文章站
2022-04-11 09:48:53
/** * @param bizObject * @return java.lang.String * @author HUGO * @Description 复查sql,n条事务批量添加,删除,更新 * @Description 使用说明demo * @date 2020/12/11 14:01 **/ public String testMapMore(BizObject bizObject) throws Exce......
一、JDBC实现主从表sql执行
1.testMapMore方法是用来查看如何封装数据
2.executeUpdateMapMore方法是实际实现主从表复杂sql
二、编写这个的目的:在公司框架中没有事务,碰到一些复杂主从关系,一对多,多对多,多对一,就需要一个方法来实现这样的功能,避免了在每个业务逻辑方法去实现开关事务功能。
/**
* @param bizObject
* @return java.lang.String
* @author HUGO
* @Description 复查sql,n条事务批量添加,删除,更新
* @Description 使用说明demo
**/
public String testMapMore() throws Exception {
List<Map<String, Object>> bigList = new ArrayList<>();//参数
String id = "firstTimesTest";//主表id
Map<String, Object> firstMap = new HashMap<>();//创建主表map
firstMap.put("sql", "sql字符串");//存储主表添加sql
List<Object> firstList = new ArrayList<>();//存储主表存储数据
firstList.add(id);//主表sql存放的参数
firstMap.put("listValue", firstList);//存储存储后的数据
bigList.add(firstMap);//将bigList添加第一个值
Map<String, Object> secMap = new HashMap<>();
List<List> secList = new ArrayList();//存储从表的数据
secMap.put("sql", "sql字符串");//从表sql
String secId = "secTableId";//从表id
for (int i = 0; i <= 5; i++) {//从表参数数据
List<Object> insertValue = new ArrayList<>();
insertValue.add(id);//主表id
insertValue.add(secId + i);//从表主键id叠加
secList.add(insertValue);
}
secMap.put("listValue", secList);//从表
bigList.add(secMap);
DBUtils.executeUpdateMapMore(bigList);
return "";// 返回创建数据的id
}
/**
* @param listSql map 1. key:sql value:String 2.key:listValue value:List<Object> (List<List>)
* 注意:
* 1.--->泛型Object 满足executeUpdate List满足executeBatch
* 2.List<List>的数据主要满足于有多个对象使用同一个sql
* @return boolean
* @Description List<Object> 需要满足第一条为SQL,后续的满足prepareStatement注入数据,不能用于超大量数据添加数据
* @Description 只满足insert, update, delete方法, 请勿在sql开头使用空格
* @Description 用于主从表同时更新(增加,删除,修改)使用
* @autor HUGO
**/
public static boolean executeUpdateMapMore(List<Map<String,Object>> listSql) throws Exception {
// 获取数据库连接
PreparedStatement ps = null;
Connection conn = null;
try {
conn = getConnection();
conn.setAutoCommit(false);//首先把Auto commit设置为false,不让它自动提交
// 执行语句
for (Map<String, Object> sql : listSql) {//默认List为0
if (sql == null || sql.isEmpty() || sql.size() == 1) {
throw new Exception("executeUpdateMore sql fail,sql data null or not list is empty");
}
String sqlStart = sql.get("sql").toString();
if (sqlStart.startsWith("update") || sqlStart.startsWith("insert") || sqlStart.startsWith("delete")) {
ps = conn.prepareStatement(sqlStart);
List<Object>listValue = (List<Object>)sql.get("listValue");
if(listValue.get(0) instanceof List){//判断是否为List<Object> 还是List<List>
for(int i = 0; i < listValue.size(); ++i){
List list = (List) listValue.get(i);
for(int j = 0; j < list.size(); ++j){
ps.setObject(j+1, list.get(j));
}
ps.addBatch();
}
ps.executeBatch();
}else{
for (int i = 0; i < listValue.size(); i++) {
ps.setObject(i+1, listValue.get(i));
}
ps.executeUpdate();
}
Logger.info("executeUpdateMore SQL success:\t" + sql);
} else {
throw new Exception("executeUpdateMore sql fail,sql data null or not list is empty");
}
}
conn.commit();//进行手动提交(commit)
conn.setAutoCommit(true);//提交完成后回复现场将Auto commit,还原为true
return true;
} catch (Exception e) {
Logger.info(e);
conn.rollback();
e.printStackTrace();
return false;
} finally {
try {
// 关闭连接
if (ps != null) {
conn.close();
ps.close();
}
} catch (SQLException e) {
Logger.info("Close connection error!", e);
}
}
}
本文地址:https://blog.csdn.net/HUGO_SKR/article/details/111045474
上一篇: python空元组在all中返回结果详解
下一篇: golang网络通信超时设置方式