当前位置:   article > 正文

MyBatis入门十:Mybatis数据插入、修改、删除二:<selectKey>标签和useGeneratedKeys属性的区别;(一个相对独立的知识点)_

通过上篇博客MyBatis入门九:Mybatis数据插入、修改、删除一:插入数据;可知,<selectKey>标签的作用是在数据插入以后,把最新的主键值进行返回和回填。

useGeneratedKeys属性也是在插入数据的时候,获取最新生成的主键id。

那么<selectKey>标签和useGeneratedKeys属性的区别是什么嘞???

 目录

0.【<selectKey>标签】和【seGeneratedKeys属性】简介 

(1) 标签的用法:

(2)useGeneratedKeys属性的用法:

1.既不使用<selectKey>标签也不使用useGeneratedKeys属性时

2.使用<selectKey>标签时候

3.使用useGeneratedKeys属性的时候

4.【<selectKey>标签】和【seGeneratedKeys属性】区别

(1)二者的区别:显式与隐式

(2)应用场景的区别

(3)Summary


0.【<selectKey>标签】和【seGeneratedKeys属性】简介 

(1) <selectKey>标签的用法:

<selectKey>标签必须书写在<insert>标签中;

……………………………………………………

(2)useGeneratedKeys属性的用法:


1.既不使用<selectKey>标签也不使用useGeneratedKeys属性时

  1. package com.imooc.mybatis;
  2. import com.imooc.mybatis.dto.GoodsDTO;
  3. import com.imooc.mybatis.entity.Goods;
  4. import com.imooc.mybatis.entity.Student;
  5. import com.imooc.mybatis.utils.MyBatisUtils;
  6. import org.apache.ibatis.io.Resources;
  7. import org.apache.ibatis.session.SqlSession;
  8. import org.apache.ibatis.session.SqlSessionFactory;
  9. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  10. import org.junit.Test;
  11. import java.io.IOException;
  12. import java.io.Reader;
  13. import java.sql.Connection;
  14. import java.util.HashMap;
  15. import java.util.List;
  16. import java.util.Map;
  17. /**
  18. * JUnit单元测试类
  19. */
  20. public class MyBatisTestor {
  21. @Test
  22. public void testInsert() throws Exception {
  23. SqlSession session = null;
  24. try {
  25. session = MyBatisUtils.openSession();
  26. Goods goods = new Goods();
  27. goods.setTitle("测试商品");goods.setSubTitle("测试子标题");goods.setOriginalCost(150f);
  28. goods.setCurrentPrice(100f);goods.setDiscount(0.67f);goods.setIsFreeDelivery(1);
  29. goods.setCategoryId(43);
  30. // insert()方法返回一个int类型的返回值:代表本次成功插入的记录总数;
  31. // (因为这儿我们不是批量插入,所以如果插入成功,num=1)
  32. int num = session.insert("goods.insertTest",goods);
  33. session.commit();// commit()方法:提交事务数据。
  34. System.out.println(goods.getGoodsId());
  35. System.out.println("打断点用。");
  36. } catch (Exception e) {
  37. if (session != null){
  38. session.rollback(); // 如果程序出错,未能完整执行,则回滚事务。。。
  39. // PS:发现Mybatis封装后,事务控制在编码实现上简单了些
  40. }
  41. throw e;
  42. }finally {
  43. MyBatisUtils.closeSession(session);
  44. }
  45. }
  46. }

运行结果:新生成的主键值goods_id并没有被回填到Goods对象的goodsId属性中。


2.使用<selectKey>标签时候

运行结果:新生成的主键值goods_id被回填到了Goods对象的goodsId属性中。


3.使用useGeneratedKeys属性的时候

运行结果:新生成的主键值goods_id被回填到了Goods对象的goodsId属性中。


4.【<selectKey>标签】和【seGeneratedKeys属性】区别

(1)二者的区别:显式与隐式

(1)【<selectKey>标签】需要明确写【select last_insert_id()】这条语句;

(2)【seGeneratedKeys属性】:JDBC与数据库连接的时候需要对应的数据库驱动,比如这儿我们使用的数据库是MySQL数据库,自然数据库驱动是MySQL的驱动,mybatis发现我们使用的是MySQL驱动,那么在底层执行的时候,其会自动的生成【select last_insert_id()】这句MySQL中获取主键的语句;;;;;那么当我们使用其他数据库的时候,比如使用SQLserver时,自然数据库驱动也要换成 驱动,mybatis会发现我们的数据库驱动变化了,其在底层执行的时候,其会自动生成与SQLserver兼容的、获取主键的语句了。。。。。。可以发现,【seGeneratedKeys属性】比【<selectKey>标签】简单,普适性可能更好些;

……………………………………………………

(2)应用场景的区别

(1)【<selectKey>标签】:诸如DB2,Oracle,MySQL,SQLserver,Sybase等关系型数据库,都可以使用【<selectKey>标签】;

(2)【seGeneratedKeys属性】:要求数据库必须支持“自增主键”类型;;目前支持“自增主键”的数据库有MySQL,SQLserver等;不支持“自增主键”的数据库有DB2,Oracle;即,在DB2和Oracle中不能使用【seGeneratedKeys属性】,而只能使用【<selectKey>标签】。

(3)附注:Oracle中,【<selectKey>标签】的用法:

……………………………………………………

(3)Summary

(1)【<selectKey>标签】编写麻烦,因为不同的数据库获取最新主键的SQL语句是不同的,在数据迁移的时候,需要修改【<selectKey>标签】的代码;

(2)【seGeneratedKeys属性】方便迁移;

(3)绝大多数可以使用【seGeneratedKeys属性】,因为其简单,适合初学者。。。优先推荐使用【seGeneratedKeys属性】;;;;;;;但是如果在复杂项目中,有很多种不同数据库要对数据进行支撑和保存的时候,就必须要使用【<selectKey>标签】了。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/241420
推荐阅读
相关标签
  

闽ICP备14008679号