MyBatis-映射器中selectKey标签详解

selectKey用来处理不支持自动生成主键的数据库

只能存在于insertupdate的子标签中,一般不建议使用.
注意selectKey的主要效用并不是用来处理自动生成主键的,
其本质作用是:用sql语句来处理,需要特殊处理的表中的列字段,
而不是用java代码来处理,以此来减少代码的冗余度.

候选属性介绍

  • keyProperty
    结果集映射目标类的属性;
    若存在多个,则使用逗号分隔;
  • keyColumn
    目标类的属性,映射结果集的列名;
    若存在多个,则使用逗号分割;
  • resultType
    设置返回类型;
    可使用全类名或者是别名;
  • order
    设置此selectKey的执行顺序是早于sql语句,还是晚于sql语句;
    候选值是BEFOREAFTER;
  • statementType
    设置sql语句的映射类型;候选值有:
    STATEMENT,PREPARED,CALLABLE;
  • databaseID
    ibatis全局配置中的databaseIdProvider标签呼应.

补充说明

  • mysql中可使用rand()函数来获取随机的小数,
    后续完善后,可测试selectKey标签.
    mysql中输入? rand查看帮助手册.
  • 其他数据库中,可查阅相关官方文档的数学函数模块.

代码测试selectKey的效用

  1. 查看表结构,entity类对象省略.
    CREATE TABLE `emp` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(255) NOT NULL,
    `age` int(11) NOT NULL,
    `sex` int(4) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1
    
  2. ibatis的全局配置和映射器接口配置省略.
  3. 映射器接口selectKey标签的配置.
                                         
    <insert id="testSelectKey">                                     
      <selectKey keyColumn="age" keyProperty="age" order="BEFORE" 
        resultType="int">                                       
        SELECT TRUNCATE(RAND()*100,0)                           
      selectKey>                                                
      INSERT INTO emp(name,age,sex) VALUE(                        
      #{name},#{age},#{sex}                                       
      )                                                           
    insert>                                                       
    
  4. 测试类中的主要代码片段.
    SqlSession session = sqlSessionFactory.openSession(true);
    try
    {
      SelectKeyTag dao = session.getMapper(SelectKeyTag.class);
    
      Emp obj = new Emp();
      obj.setName("xiaoHua");
      obj.setSex(0);
    
      boolean result = dao.test_selectKey(obj);
      log.info(result);
    } finally
    {
      session.close();
    }
    

你可能感兴趣的:(归档弃用)