MyBatis 3的自增ID的Bug 续

本文详细探讨了MyBatis3在处理自增ID时遇到的问题,通过具体的代码示例展示了如何配置和使用自增ID特性,并提出了有效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

               

MyBatis 3的自增ID的Bug(续)

 

作者:chszs

转载请注明出处!


自上次我提出MyBatis 3的Bug之后,见:http://blog.youkuaiyun.com/chszs/archive/2011/03/31/6292719.aspx

我把Bug提交到MyBatis的官方网站,见http://code.google.com/p/mybatis/issues/detail?id=287

问题描述如下:

Eclipse Java Project:1. SqlMapConfig.xml<?xml version="1.0" encoding="UTF-8" ?>  <!DOCTYPE configuration      PUBLIC "-//mybatis.org//DTD Config 3.0//EN"      "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <environments default="development">  <environment id="development">   <transactionManager type="JDBC" />   <dataSource type="POOLED">    <property name="driver" value="com.mysql.jdbc.Driver" />    <property name="url" value="jdbc:mysql://localhost:3306/test?zeroDateTimeBehavior=convertToNull" />    <property name="username" value="root" />    <property name="password" value="adminadmin" />   </dataSource>  </environment> </environments> <mappers>  <mapper resource="com/sqlmap/WorkerMapper.xml" /> </mappers></configuration>  2. mysql.sqlUSE test;CREATE TABLE `worker` (  `id` INT(11) NOT NULL AUTO_INCREMENT,  `pin` VARCHAR(64) DEFAULT NULL,  `firstname` VARCHAR(64) DEFAULT NULL,  `lastname` VARCHAR(64) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=INNODB DEFAULT CHARSET=utf8;3. WorkerMapperpackage com.dao;import com.entity.Worker;public interface WorkerMapper { int insertWorker(Worker worker);}4. Worker.javapackage com.entity;public class Worker {    private Integer id;    private String pin;    private String firstname;    private String lastname;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getPin() {        return pin;    }    public void setPin(String pin) {        this.pin = pin == null ? null : pin.trim();    }    public String getFirstname() {        return firstname;    }    public void setFirstname(String firstname) {        this.firstname = firstname == null ? null : firstname.trim();    }    public String getLastname() {        return lastname;    }    public void setLastname(String lastname) {        this.lastname = lastname == null ? null : lastname.trim();    }}5. WorkerMapper.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.dao.WorkerMapper" >  <resultMap id="BaseResultMap" type="com.entity.Worker" >    <id column="id" property="id" jdbcType="INTEGER" />    <result column="pin" property="pin" jdbcType="VARCHAR" />    <result column="firstname" property="firstname" jdbcType="VARCHAR" />    <result column="lastname" property="lastname" jdbcType="VARCHAR" />  </resultMap>  <insert id="insertWorker" parameterType="com.entity.Worker" >   <selectKey resultType="int" keyProperty="id" order="AFTER">    select LAST_INSERT_ID()  </selectKey>    insert into worker    <trim prefix="(" suffix=")" suffixOverrides="," >      <if test="pin != null" >        pin,      </if>      <if test="firstname != null" >        firstname,      </if>      <if test="lastname != null" >        lastname,      </if>    </trim>    <trim prefix="values (" suffix=")" suffixOverrides="," >      <if test="pin != null" >        #{pin,jdbcType=VARCHAR},      </if>      <if test="firstname != null" >        #{firstname,jdbcType=VARCHAR},      </if>      <if test="lastname != null" >        #{lastname,jdbcType=VARCHAR},      </if>    </trim>  </insert></mapper>6. Test.java/** * @Author: Li.Qiang * @Date:   2011-3-9 */package com.test;import java.io.Reader;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 com.entity.Worker;public class Test { public static void main(String[] args) throws Exception{  String resource = "conf/SqlMapConfig.xml";  Reader reader = Resources.getResourceAsReader(resource);  SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);  SqlSession session = factory.openSession();    Worker worker = new Worker();  worker.setPin("123456");  worker.setFirstname("Tom");  worker.setLastname("Jack");  try{   for(int i=0; i<20; i++){    int tmpId = session.insert("insertWorker", worker);    session.commit();    System.out.println("Worker ID: " + tmpId);   }  } finally{   session.close();  }   }}7. Test.java Output:Worker ID: 1Worker ID: 1Worker ID: 1Worker ID: 1Worker ID: 1Worker ID: 1Worker ID: 1Worker ID: 1Worker ID: 1Worker ID: 1Worker ID: 1Worker ID: 1Worker ID: 1Worker ID: 1Worker ID: 1Worker ID: 1Worker ID: 1Worker ID: 1Worker ID: 1Worker ID: 1can't get the real id.
得到MyBatis作者的反馈,<insert>语句本身有int型的返回值,表示插入的条数。故在<insert>语句内想使用 <selectKey>返回自增ID自动生成的ID值是不可能的。
可以单独用<select>语句来完成返回自增ID自动生成的ID值。

 

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值