mybatis使用踩坑记录

**

mybatis使用踩坑记录1

**
mybatis运行SELECT SCOPE_IDENTITY()返回始终是1的问题
因为使用自动生成的mapper文件

<selectKey resultType="java.lang.Integer" keyProperty="id" order="BEFORE" >
      SELECT SCOPE_IDENTITY()
</selectKey>

生成的文件默认order=‘before’ 执行在insert之前
将order配置改为after了就可以了,
记录一下

上面处理的还是有问题 --下面是一个大佬说的应该就没问题了,搬过来记录一下
原文地址是:https://blog.csdn.net/weixin_44257627/article/details/109075275
keyColumn:插入数据以后,要返回的内容在数据表中对应的字段名称(这里返回的是插入记录的id(对应数据表中的名称为compete_id))

keyProperty:指定返回的id映射到bean中的哪个属性(这里是competeId),这个bean对应的类的名称就是上面insert标签中的属性parameterType的值,

order=”AFTER”:表示这个selectKey语句的执行是在insert语句之后

resultType:selectKey语句返回值的类型,我这里是int类型

下面说一下为什么执行这个sql后,一直返回1,而不是我们期望的id,先看一下调用代码

1 Integer result = competesMapperCustom.insertCompete(compete);
2 Integer competeId = compete.getCompeteId();

我插入数据时插入的是一个bean,这个bean的类型就是上面我们提到的parameterType的值,插入前它的id是空,

当我们执行插入后,返回插入的结果result,插入成功result=1,插入失败result=0,这就是为什么结果一直为1了,因为返回的结果根本不是我们需要的id,返回的id其实已经映射到了我们插入的bean中,我们只要通过它的get方法就可以得到了:compete.getCompeteId();


如果还是不可以就试试看官网吧
https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#insert_update_and_delete
我最后的解决方法是
去掉下面代码

<selectKey resultType="java.lang.Integer" keyProperty="id" order="AFTER" >
      SELECT SCOPE_IDENTITY()
    </selectKey>

加上配置useGeneratedKeys=“true” keyProperty=“id”

<insert id="insert" parameterType="com.jk.dto.mybatis.CaDysjCrbtreeElement"  useGeneratedKeys="true" keyProperty="id">
   <!--  <selectKey resultType="java.lang.Integer" keyProperty="id" order="AFTER" >
      SELECT SCOPE_IDENTITY()
    </selectKey> -->
    insert into ca_dysj_crbtree_element (tree_id, zt, 
      val)
    values (#{id,jdbcType=INTEGER}, #{treeId,jdbcType=INTEGER}, #{zt,jdbcType=INTEGER}, 
      #{val,jdbcType=NVARCHAR})
  </insert>

最后取值方式直接 xxx.getId()就可以了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值