赞
踩
通过上篇博客MyBatis入门九:Mybatis数据插入、修改、删除一:插入数据;可知,<selectKey>标签的作用是在数据插入以后,把最新的主键值进行返回和回填。
useGeneratedKeys属性也是在插入数据的时候,获取最新生成的主键id。
那么<selectKey>标签和useGeneratedKeys属性的区别是什么嘞???
目录
0.【<selectKey>标签】和【seGeneratedKeys属性】简介
1.既不使用<selectKey>标签也不使用useGeneratedKeys属性时
4.【<selectKey>标签】和【seGeneratedKeys属性】区别
<selectKey>标签必须书写在<insert>标签中;
……………………………………………………
- package com.imooc.mybatis;
-
- import com.imooc.mybatis.dto.GoodsDTO;
- import com.imooc.mybatis.entity.Goods;
- import com.imooc.mybatis.entity.Student;
- import com.imooc.mybatis.utils.MyBatisUtils;
- import org.apache.ibatis.io.Resources;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- import org.junit.Test;
-
- import java.io.IOException;
- import java.io.Reader;
- import java.sql.Connection;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
-
- /**
- * JUnit单元测试类
- */
- public class MyBatisTestor {
-
- @Test
- public void testInsert() throws Exception {
- SqlSession session = null;
- try {
- session = MyBatisUtils.openSession();
- Goods goods = new Goods();
- goods.setTitle("测试商品");goods.setSubTitle("测试子标题");goods.setOriginalCost(150f);
- goods.setCurrentPrice(100f);goods.setDiscount(0.67f);goods.setIsFreeDelivery(1);
- goods.setCategoryId(43);
- // insert()方法返回一个int类型的返回值:代表本次成功插入的记录总数;
- // (因为这儿我们不是批量插入,所以如果插入成功,num=1)
- int num = session.insert("goods.insertTest",goods);
- session.commit();// commit()方法:提交事务数据。
- System.out.println(goods.getGoodsId());
- System.out.println("打断点用。");
- } catch (Exception e) {
- if (session != null){
- session.rollback(); // 如果程序出错,未能完整执行,则回滚事务。。。
- // PS:发现Mybatis封装后,事务控制在编码实现上简单了些
- }
- throw e;
- }finally {
- MyBatisUtils.closeSession(session);
- }
- }
-
- }
运行结果:新生成的主键值goods_id并没有被回填到Goods对象的goodsId属性中。
运行结果:新生成的主键值goods_id被回填到了Goods对象的goodsId属性中。
运行结果:新生成的主键值goods_id被回填到了Goods对象的goodsId属性中。
(1)【<selectKey>标签】需要明确写【select last_insert_id()】这条语句;
(2)【seGeneratedKeys属性】:JDBC与数据库连接的时候需要对应的数据库驱动,比如这儿我们使用的数据库是MySQL数据库,自然数据库驱动是MySQL的驱动,mybatis发现我们使用的是MySQL驱动,那么在底层执行的时候,其会自动的生成【select last_insert_id()】这句MySQL中获取主键的语句;;;;;那么当我们使用其他数据库的时候,比如使用SQLserver时,自然数据库驱动也要换成 驱动,mybatis会发现我们的数据库驱动变化了,其在底层执行的时候,其会自动生成与SQLserver兼容的、获取主键的语句了。。。。。。可以发现,【seGeneratedKeys属性】比【<selectKey>标签】简单,普适性可能更好些;
……………………………………………………
(1)【<selectKey>标签】:诸如DB2,Oracle,MySQL,SQLserver,Sybase等关系型数据库,都可以使用【<selectKey>标签】;
(2)【seGeneratedKeys属性】:要求数据库必须支持“自增主键”类型;;目前支持“自增主键”的数据库有MySQL,SQLserver等;不支持“自增主键”的数据库有DB2,Oracle;即,在DB2和Oracle中不能使用【seGeneratedKeys属性】,而只能使用【<selectKey>标签】。
(3)附注:Oracle中,【<selectKey>标签】的用法:
……………………………………………………
(1)【<selectKey>标签】编写麻烦,因为不同的数据库获取最新主键的SQL语句是不同的,在数据迁移的时候,需要修改【<selectKey>标签】的代码;
(2)【seGeneratedKeys属性】方便迁移;
(3)绝大多数可以使用【seGeneratedKeys属性】,因为其简单,适合初学者。。。优先推荐使用【seGeneratedKeys属性】;;;;;;;但是如果在复杂项目中,有很多种不同数据库要对数据进行支撑和保存的时候,就必须要使用【<selectKey>标签】了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。