欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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