关于useGeneratedKeys问题

关于useGeneratedKeys问题

如果不设置useGeneratedKeys="true" 那么会发生什么情况?插入不成功?

正在回答

登陆购买课程后可参与讨论,去登陆

6回答

可以这么理解,如下是mybatis官方文档给出的解释,http://www.mybatis.org/mybatis-3/zh/configuration.html#settings,同学可以参考一下,祝学习愉快~

http://img1.sycdn.imooc.com//climg/5becd08200018d2e09480061.jpg

chrismorgen 2018-11-14 19:03:47

如果不加上useGeneratedKeys="true" 和keyProperty(id),那么下图的sql语句会报错,需要在insert into claim_voucher()中添加id字段;之所以用这两个属性,因为主键是自动增长的,所以keyProperty(id)属性会自动绑定claim_voucher表中的id,如果同学还有不明白的地方,可以继续提问,祝学习愉快~

http://img1.sycdn.imooc.com//climg/5bebffda00012b9409960132.jpg

  • 提问者 音殿 #1
    就insert语句 我给了他一个对象 里面有信息 然后id是自增的 但是插入的对象的ID还是空的 然后写了useGeneratedKeys="true" 他会把自增多一的 id放进对象里 然后插进数据库里?
    2018-11-14 20:53:16
chrismorgen 2018-11-14 18:33:14

是的,调用insertsql语句的方法是不需要获取返回值,但是当你插入数据的时候,是不需要输入编号的,所以需要这个编号赋值到bean对象中,譬如下图标记的ClaimVoucher对象中,这个对象之前的id值为null,添加useGeneratedKeys="true"这个属性之后,ClaimVoucher对象中的id就会被赋值为主键值,这就是这两个属性的作用。具体如何使用,其实在oa系统的课中就讲过了,同学可以参考这个链接https://class.imooc.com/lesson/596#mid=13573中的9分左右,老师有说明id编号的作用。看课加上我解释的,你会更容易理解一些,祝学习愉快~

http://img1.sycdn.imooc.com//climg/5bebf8b7000144f010130137.jpg

好帮手慕阿莹 2018-11-14 18:15:10

是这样滴,当我们设置id为自增长时,我们插入数据的时候,是不是不需要写主键id,数据库中会自动给它一个id?

但是我们查询的时候有时需要通过id查询怎么办呢?数据库自己给它的id,我们怎么知道这个id是几呢?这个时候就需要用到上边的知识了,这样它插入数据后,还会告诉你,你的id是多少。

就好像你去银行排队,排队是排上了,等业务员叫号的时候,你不知道自己是几号,排队的时候,需要工作人员或者机器告诉你,你是几号。这个就是返回的id。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!


chrismorgen 2018-11-14 15:06:24

给你举个例子,使用useGeneratedKeys="true"属性机型配置时,会返回插入数据的主键值,及建表时的主键值,比如你插入一条数据,主键值是3,那么配置useGeneratedKeys="true"时会返回3,.keyProperty(id)则跟你bean类中的属性是一致的,如下图所示,要与id一致,跟你http://class.imooc.com/course/qadetail/52257这个问答的功能一样,祝学习愉快~

http://img1.sycdn.imooc.com//climg/5bebc90a0001151503790155.jpg

  • 提问者 音殿 #1
    配置完插入后 返回到哪里?没看懂。。数据我已经插入了 为什么要返回id 3呢?
    2018-11-14 16:34:25
  • chrismorgen 回复 提问者 音殿 #2
    插入的数据的主键值会从数据库中返回到java代码中,并赋值给当前的bean对象中,返回id是为了要获取id的值,因为主键自增长是在插入数据之前是无法得知的,所以要在插入数据之后将主键的值返回,赋值给当前对象的属性。祝学习愉快~
    2018-11-14 17:42:26
  • 提问者 音殿 回复 chrismorgen #3
    插入数据调用的void insert(Department department); 不是无返回值类型的吗 不需要返回什么的呀 为什么需要这个id呢?em。。。
    2018-11-14 17:45:35
chrismorgen 2018-11-14 11:10:51

如果不设置useGeneratedKeys="true",那么就不会将新增加的主键赋值到自己的自己定义的keyProperty(id)中,也就是说,不会返回新增数据的主键值,而只是执行了插入的操作,祝学习愉快~

  • 提问者 音殿 #1
    1.keyProperty(id)是什么? 主键值是什么? 是说数据新增成功了 然后新增的id不会变成主键的意思? 2.如果不加useGeneratedKeys="true" 然后新增了数据 表里的那条数据和其他数据有什么区别?id会增长吗 是主键吗之类的
    2018-11-14 11:17:02
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
SSM主流框架入门与综合项目实战2018版
  • 参与学习           人
  • 提交作业       205    份
  • 解答问题       4317    个

Java中非常实用的SSM整合开发内容,从Spring开始,到MyBaits的进阶内容,再到SpringMVC的应用,最后是SSM整合开发案例,逐步深入,助你成长为一名Java工程师!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师