spring+myBatis数据不入库问题,求大神解答。 10C

昨天做项目的时候遇到的问题,查询删除都是好的,保存死活不入库,以下是代码部分:

 /**
     * 试题模版导入
     * 
     * @param session
     * @param response
     * @param request
     * @throws Exception
     */
    @RequestMapping(value = "/templateImport", method = RequestMethod.POST)
    @ResponseBody
    public String templateImport(@RequestParam(value = "file", required = false) MultipartFile file, HttpSession session,
            HttpServletResponse response, HttpServletRequest request, ModelMap modelMap) {
        List<Map<Question, List<String>>> questionAndOptionsList = new ArrayList<Map<Question, List<String>>>();// 定义试题和答案的map集合对象集
        List<Row> rowList = new ArrayList<Row>();// 定义行对象
        String libraryId = request.getParameter("libraryId");
        if (StringUtils.isEmpty(libraryId)) {
            modelMap.put("message", "未选择题库");
            RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE);
            return null;
        }
        try {
            rowList = ExcelUtil.getRows(file, 1);
        } catch (Exception e) {
            modelMap.put("message", "解析模版出错");
            RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE);
            return null;
        }
        int dateNum = rowList.size();// 定义数据总条数
        int addNum = 0;// 定义新增数据条数
        int updateNum = 0;// 定义修改数据条数
        for (int i = 0; i < rowList.size(); i++) {
            Row row = rowList.get(i);
            Question question = new Question();// 定义试题对象
            List<String> questionOptionList = new ArrayList<String>();// 定义接收所有解析到的试题选项
            int cellNum = row.getLastCellNum();// 获取总列数
            String questionTypeId = null; // 定义转换之后的试题类型
            // 获取所有试题列的值
            String content = ExcelUtil.getStringCellValue(row.getCell(0));// 获取试题内容
            String questionTypeName = ExcelUtil.getStringCellValue(row.getCell(1));// 获取试题类型(拿到的是中文,需要自己转换)
            String answer = ExcelUtil.getStringCellValue(row.getCell(2));// 获取答案
            String analysis = ExcelUtil.getStringCellValue(row.getCell(3));// 获取试题解析
            /*
             * 试题信息非空校验
             */
            if (StringUtils.isEmpty(content)) {
                modelMap.put("message", "导入文件中第" + (i + 2) + "行的试题内容为空");
                RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE);
                return null;
            }
            if (StringUtils.isEmpty(questionTypeName)) {
                modelMap.put("message", "导入文件中第" + (i + 2) + "行的试题类型为空");
                RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE);
                return null;
            } else {
                // 解析试题类型为编码
                switch (questionTypeName) {
                case "单选题":
                    questionTypeId = Const.QUESTION_TYPE_ID_SINGLE;
                    break;
                case "多选题":
                    questionTypeId = Const.QUESTION_TYPE_ID_MULTIPLE;
                    break;
                case "判断题":
                    questionTypeId = Const.QUESTION_TYPE_ID_JUDGE;
                    break;
                default:
                    break;
                }
            }
            if (StringUtils.isEmpty(answer)) {
                modelMap.put("message", "导入文件中第" + (i + 2) + "行的答案为空");
                RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE);
                return null;
            }
            /*
             * 试题信息长度校验
             */
            if (content.length() > 1000) {
                modelMap.put("message", "导入文件中第" + (i + 2) + "行的试题内容长度超出范围");
                RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE);
                return null;
            }
            if (answer.length() > 200) {
                modelMap.put("message", "导入文件中第" + (i + 2) + "行的答案长度超出范围");
                RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE);
                return null;
            }
            if (analysis.length() > 500) {
                modelMap.put("message", "导入文件中第" + (i + 2) + "行的试题解析长度超出范围");
                RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE);
                return null;
            }

            /*
             * 校验通过之后设置question对象
             */
            question.setContent(content);// 设置内容
            question.setQuestionTypeId(questionTypeId);// 设置类型
            question.setAnswer(answer);// 设置答案
            question.setLibraryId(libraryId);// 设置题库
            question.setAnalysis(analysis);// 设置解析
            question.setDelFlag("0");// 设置删除标识(1、为删除0、为未删除)

            /*
             * 开始解析试题答案信息
             */
            for (int j = 4; j < cellNum; j++) {// 定义从第5列开始解析答案信息,第5列之前都时试题信息
                String questionOption = ExcelUtil.getStringCellValue(row.getCell(j));// 获取试题答案选项
                if (!StringUtils.isEmpty(questionOption)) {// 判断试题选项是否为空,如果为空则不存储该选项,也不中断解析之后的选项列
                    questionOptionList.add(questionOption);
                }
            }
            Map<Question, List<String>> map = new HashMap<Question, List<String>>();
            map.put(question, questionOptionList);
            questionAndOptionsList.add(map);
        }
        for (Map<Question, List<String>> questionAndOptions : questionAndOptionsList) {
            Set set = questionAndOptions.keySet();
            Iterator iterator = set.iterator();
            while (iterator.hasNext()) {
                Question keyQuestion = (Question) iterator.next();
                **questionService.save(keyQuestion);// 保存试题信息**
                List<String> questionOptionsList = questionAndOptions.get(keyQuestion);// 获取该试题所有的选项
                for (int j = 0; j < questionOptionsList.size() && j < 26; j++) {
                    String content = questionOptionsList.get(j);
                    char letterCapital = (char) (j + 65);// 将数字转换成对应的字母
                    QuestionOption questionOption = new QuestionOption();// 定义试题对象
                    questionOption.setContent(content);// 设置选项内容
                    questionOption.setQuestionId(keyQuestion.getId());// 设置试题ID
                    questionOption.setName(String.valueOf(letterCapital));// 设置选项编号(A、B、C...)
                    questionOption.setSortNum(String.valueOf(j));// 设置排序号
                    questionOption.setDelFlag("0");// 设置删除标识(1、为删除0、为未删除)
                    **optionService.save(questionOption);// 保存试题对象**
                }
            }
        }
        modelMap.put("message", "新增数据:" + addNum + "条,修改数据:" + updateNum + "条,失败:" + (dateNum - addNum - updateNum) + "条");
        RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.TRUE);
        return null;
    }

跟此方法同类下的保存方法是可以运行的,并且数据也能入库,上述方法没有出现任何错误,并且执行save之后对象ID也会自动生成,但就时不入库。

5个回答

数据库表中主键设置auto-increment了吗?spring 的事务有没有走完,而方法调用就结束了。故没有保存到库里,其实是回滚了!

Birds_Cerebrum
Birds_Cerebrum 都没问题,同事把库名字换了,我还找的是之前的库,数据插入进去了,猛然间看页面发现有插入的数据,才想到可能库被换掉了。
大约 2 年之前 回复

查看一下连接数据是否连接成功,然后在检查是否提交了事务

应该是没有配置spring的事务处理

遇到过类似问题,尝试在持久层添加注解@Transactional

so,是不是没有定义主键,我曾经也遇到过这样的问题,忘记定义主键,但是设定了某个字段自增,怎么插入都不成功,后来发现改正就成功了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问