MyBatis 您所在的位置:网站首页 sql新增数据不成功怎么办 MyBatis

MyBatis

2024-06-09 04:02| 来源: 网络整理| 查看: 265

前言

关于这篇文章,主要针对通过调用 MyBatis-Plus API 实现动态修改数据时遇到的,不是使用的SQL,如果你使用的是SQL则建议移步到相关文章,以免耽误你的工作时间,如果是SQL,在移步前博主给两个关注点可以尝试去解决:一个是事务方面,有可能数据已经修改成功,但是在下一步的操作中,可能在某步失败后导致全局数据回滚,所以修改失败;二一个是设置自动提交openSession( autoCommit=true),在CRUD的业务逻辑代码后加上 sqlSession.commit() 即可。

再次声明,本篇博文主要针对 MyBatis-Plus API 调用跟新时,失败的解决办法,下面很长。

 

问题概述

当实体的所有字段都不为空时,修改是成功的,但是,当某个字段的值不传时,修改成功后,该字段还是显示原来的值。目的,希望此时该字段的实际数据被修改为空,但实际数据未作任何改变。

关于这个问题,网上没有可行的解决办法,只能将问题结合源码进行分析并找到合适的解决方案,下面是博主的源码分析,不到之处望指正。

 

问题前奏(示例性代码,目的为阐述问题):

1、接收数据

package com.travel.etcp.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; import java.util.List; /** * * @author HuaZai * @contact [email protected] * * @description * 一号服务器 * * @className EmployeeController * @package com.travel.etcp.controller * @createdTime 2018年05月05日 下午5:52:07 * * @version V1.0.0 */ @Slf4j @RestController @Api(value = "/emp") @RequestMapping("/emp") public class EmployeeController { @Autowired public EmployeeService employeeService; @SysLog("用户模块-修改用户") @PutMapping("/updateEmployeeById") @ApiOperation(value = "/updateEmployeeById", notes = "通过EmployeeId更新用户信息") public ResponseData updateEmployeeById( @ApiParam(name = "employee", value = "Employee 实体") @RequestParam(name = "employee") Employeee employee) { try { String header = HttpContextUtils.getHttpServletRequest().getHeader(Constant.TERMINAL_TYPE_HEADER); employeeService.updateEmployeeById(employee); } catch (Exception e) { log.info(Constant.INFO_LOG_MSG, e.getMessage()); // 这个需要配置插件 return ResponseData.error(RespCodeEnum.ERROR_INTERNAL_SERVER.getCode(), "用户修改失败"); } return ResponseData.ok(); } }

2、服务接口:

package com.travel.etcp.service; import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.IService; import java.util.List; /** * * @author HuaZai * @contact [email protected] * * @description * TODO * * @className EmployeeService * @package com.travel.etcp.service * @createdTime 2018年05月05日 下午4:32:07 * * @version V1.0.0 */ public interface EmployeeService extends IService { void updateEmployeeById(Employee employee); }

 

3、 数据处理:

package com.travel.etcp.service.impl; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * * @author HuaZai * @contact [email protected] * * @description * TODO * * @className EmployeeServiceImpl * @package com.travel.etcp.service.impl * @createdTime 2018年05月05日 下午4:58:13 * * @version V1.0.0 */ @Slf4j @Service public class EmployeeServiceImpl extends ServiceImpl implements EmployeeService { @Autowired private EmployeeService employeeService; @Autowired private EmployeeMapper employeeMapper; @Transactional @Override public void updateEmployeeById(Employee employee) { try { // 这儿因为继承了MyBatis的ServiceImpl类,而在ServiceImpl中实现了IService类, // 所以这儿可以去掉employeeService 而直接调用API:updateById(employee); employeeService.updateById(employee); } catch (Exception e) { log.error(Constant.INFO_LOG_MSG, e.getMessage()); } } }

 

源码解析:

1、以直接调用 API 的方式,所以从 ServiceImpl 类开始,如下:

package com.baomidou.mybatisplus.service.impl; import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Map; import org.apache.ibatis.binding.MapperMethod.ParamMap; import org.apache.ibatis.session.SqlSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; public class ServiceImpl implements IService { @Autowired protected M baseMapper; public ServiceImpl() { } protected static boolean retBool(Integer result) { return SqlHelper.retBool(result); } protected Class currentModelClass() { return ReflectionKit.getSuperClassGenricType(this.getClass(), 1); } protected SqlSession sqlSessionBatch() { return SqlHelper.sqlSessionBatch(this.currentModelClass()); } protected String sqlStatement(SqlMethod sqlMethod) { return SqlHelper.table(this.currentModelClass()).getSqlStatement(sqlMethod.getMethod()); } /** * 省略部分代码 */ @Transactional(rollbackFor = { Exception.class }) public boolean updateById(T entity) { return retBool(this.baseMapper.updateById(entity)); } /** * 省略部分代码 */ }

 

2、查看API接口 IService 类 ,如下:

package com.baomidou.mybatisplus.service; import com.baomidou.mybatisplus.mapper.Wrapper; import com.baomidou.mybatisplus.plugins.Page; import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Map; public interface IService { boolean insert(T var1); boolean insertAllColumn(T var1); boolean insertBatch(List var1); boolean insertBatch(List var1, int var2); boolean insertOrUpdateBatch(List var1); boolean insertOrUpdateBatch(List var1, int var2); boolean insertOrUpdateAllColumnBatch(List var1); boolean insertOrUpdateAllColumnBatch(List var1, int var2); boolean deleteById(Serializable var1); boolean deleteByMap(Map var1); boolean delete(Wrapper var1); boolean deleteBatchIds(Collection


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有