Mybatis执行update失败的解决

Mybatis执行update失败

今天在进行分布式重构项目的时候碰到一个问题,在执行sql的时候只有update不能成功,其他语句都可以正常执行,报错如下: 版本:org.mybatis:mybatis:3.4.5

接口

@UpdateProvider(type = ManagerProvider.class, method = "updateManager")
int updateManager(Manager manager) throws Exception;

报错信息

Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml]
SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase, Hana]
org.springframework.jdbc.UncategorizedSQLException: Error getting generated key or setting result to parameter object. Cause: java.sql.SQLException: 不允许的操作;

uncategorized SQLException for SQL []; SQL state [99999]; error code [17090]; 不允许的操作; nested exception is java.sql.SQLException: 不允许的操作

原因

由于mybatis在执行insert和update的时候都默认生成key,然后注入,所以在执行update的时候会报错。

解决办法

在接口上增加注解 @Options(useGeneratedKeys = false),不让mybatis自动注入key,问题解决。

@UpdateProvider(type = ManagerProvider.class, method = "updateManager")
@Options() //    @Options(useGeneratedKeys = false)
int updateManager(Manager manager) throws Exception;

最后说明一点,版本:org.mybatis:mybatis:3.4.4这个版本没有此类问题。

Mybatis插入(更新)失败 却不报错

问题描述

mybatis进行数据插入或更新操作,方法成功执行,数据库中却不存在新数据,原本代码如下:

    @Test
    public void test7() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        EmployeeMapperDynamicSql mapper = sqlSession.getMapper(EmployeeMapperDynamicSql.class);
        Employee employee = new Employee(null,"gfdhg","456dfgngh@qq.com","female",null);
        mapper.addEmps(Collections.singletonList(employee));
        sqlSession.close();
    }

解决方案

在插入或更新语句后,增添commit,代码如下:

    @Test
    public void test7() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        EmployeeMapperDynamicSql mapper = sqlSession.getMapper(EmployeeMapperDynamicSql.class);
        Employee employee = new Employee(null,"gfdhg","456dfgngh@qq.com","female",null);
        mapper.addEmps(Collections.singletonList(employee));
        /*添加commit*/
        sqlSession.commit();
        sqlSession.close();
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • MyBatis注解方式之@Update/@Delete使用详解

    @Update 1. RoleMapper接口增加接口方法 /** * * * @Title: updateSysRoleById * * @Description: updateSysRoleById * * @param sysRole * @return * * @return: int */ @Update({ "update sys_role set role_name = #{roleName},enabled = #{enabled},create_by = #{createBy}

  • mybatis 实现多条update同时执行

    想在mapper的一个更新节点进行多条update语句的操作: <update id="cleanUserByPhone" parameterType="java.lang.String"> update user set valid_status = 1 where mobile_phone = #{mobilePhone}; update user_account set valid_status = 1 where mobile_phone = #

  • 解决Mybatis返回update后影响的行数问题

    主要在JDBC链接中加入这个参数即可: useAffectedRows=true 补充知识:mybatis批量update,返回行数为-1 mybatis批量更新返回结果为1,是由于mybatis的defaultExExecutorType引起的, 它有三个执行器:SIMPLE 就是普通的执行器:REUSE 执行器会重用预处理语句(prepared statements): BATCH 执行器将重用语句并执行批量更新. BATCH可以批量更新操作,缓存SQL以提高性能,缺陷就是无法获取updat

  • mybatis update set 多个字段实例

    我就废话不多说了,大家还是直接看代码吧~ <update id="updateCustomer" parameterType="com.entrym.domain.Customer"> UPDATE customer set <if test="name!=null">name=#{name,jdbcType=VARCHAR},</if> <if test="role!=null"&g

  • mybatis update更新字段的使用操作

    多个mapper方法,更新单字段 说实话不太推荐,因为如果有10个字段要更新,难道写10个方法. 但是实际中很多人都这么写. 通用mapper方法,java代码控制字段 特点是一个mapper方法包含所有字段,不为空的就update. 但是需要控制入参,一般有2中方式: new 一个对象然后set id和要改的字段 如果字段多比较费劲,需要一个一个set. 查询出对象,然后set要改的字段 这2种方式差不多,就是代码看起来不一样. 特别注意,定位字段不要加if 要更新的字段加if没有什么问题 但

  • 解决mybatis批量更新(update foreach)失败的问题

    如下所示: <!--批量更新报表 --> <update id="updateIssueByBatch" parameterType="java.util.List"> <foreach collection="issueList" item="item" index="index" separator=";"> update sys_issue &l

  • Mybatis执行update失败的解决

    Mybatis执行update失败 今天在进行分布式重构项目的时候碰到一个问题,在执行sql的时候只有update不能成功,其他语句都可以正常执行,报错如下: 版本:org.mybatis:mybatis:3.4.5 接口 @UpdateProvider(type = ManagerProvider.class, method = "updateManager") int updateManager(Manager manager) throws Exception; 报错信息 Loa

  • mybatis执行update批量更新时报错的解决方案

    目录 执行update批量更新时报错 在使用Mybatis批量更新时 定义Mapper Dao接口中定义 最后在service中调用 同时执行多条sql的办法 执行update失败问题 说下原因 解决办法 执行update批量更新时报错 在使用Mybatis 批量更新时 想要批量更新时通常在mapper中这么写: 定义Mapper  Dao接口中定义 最后在service中调用 生成的sql直接放到mysql中运行完全没有问题,但是mybatis执行的时候却会报错: <span style=&quo

  • Mybatis执行Update返回行数为负数的问题

    目录 Mybatis执行Update返回行数为负数 在官网上找到原因 Mybatis Update返回值 对应的java程序打印数字 Mybatis执行Update返回行数为负数 获取mybatis的update行数,总是返回负数. 在官网上找到原因 是由于defaultExecutorType的引起的,defaultExecutorType有三个执行器SIMPLE.REUSE和BATCH. 其中BATCH可以批量更新操作缓存SQL以提高性能,但是有个缺陷就是无法获取update.delete返

  • mybatis 有时update语句执行无效的解决方案

    目录 项目里mybatis有时update语句执行无效 解决办法 执行update语句后,数据没有被更新,也没有报错 问题描述 详细情况 解决办法 项目里mybatis有时update语句执行无效 公司测试人员在测试的时候发现,在积分系统,消费产生了积分,有时候,却不能加到用户累计积分上去. 明明积分流水记录跟用户积分的增加在一个事务当中的.积分流水记录生成成功,偏偏用户积分没有加上去?奇了怪了. 加积分的代码是: tMemberPointMapper.updateByPrimaryKeySel

  • MySQL数据库执行Update卡死问题的解决方法

    目录 问题分析 解决办法 过程复现和解决 扩展 总结 执行数据库更新update操作的时候数据库卡死了 问题分析 一般都是数据库事务未提交,导致update或者delete卡死. 解决办法 在执行完更新或删除后,记得将事务提交commit; 找到数据库客户端,执行commit操作. 如果还不行. 那么应该是数据库在执行数据操作失败 or 事务未提交 之后,将需要执行的sql语句锁死了. 过程复现和解决 通过如下命令查看数据库的自动提交状态 show variables like 'autocom

  • oracle执行update语句时卡住问题分析及解决办法

    问题 开发的时候debug到一条update的sql语句时程序就不动了,然后我就在plsql上试了一下,发现plsql一直在显示正在执行,等了好久也不出结果.但是奇怪的是执行其他的select语句却是可以执行的. 原因和解决方法 这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit却强制关闭连接,oracle就会将这条提交的记录锁住.由于我的java程序中加了事务,之前debug

  • mybatis执行批量更新batch update 的方法(oracle,mysql两种)

    Oracle和MySQL数据库的批量update在mybatis中配置不太一样: oracle数据库: <code class="hljs tcl" style=""><<span class="hljs-keyword" style="">update</span> id=<span class="hljs-string" style=""

  • 解决mybatis执行SQL语句部分参数返回NULL问题

    今天在写代码的时候发现一个问题:mybatis执行sql语句的时候返回bean的部分属性为null,在数据库中执行该sql语句能够正常返回,把相关代码反反复复翻了个遍,甚至都重启eclipse了,依旧没解决问题,后来网上搜了一下,还真有类似的问题. 闲话少说,直接说问题,该sql语句是自己写的,resultType直接用了该bean全名称,最终导致部分属性显示为null, 原来的写法: <select id="selectByArticle" parametertype=&quo

  • 安装oracle11g INS-30131执行安装程序验证所需的初始设置失败的解决方法

    安装oracle11g [INS-30131] 执行安装程序验证所需的初始设置失败. 解决方法 第一步: 控制面板>所有控制面板项>管理工具>服务>SERVER 启动 TCP/IP 启动 第二步: 1.点击 开始->运行 ,输入regedit ,然后回车键进入注册编辑器 2.找到并点击HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\LanmanServer\Parameters 3.如果AutoShareServer和

随机推荐