MyBatis 3的自增ID的Bug(续)
作者:chszs
转载请注明出处!
自上次我提出MyBatis 3的Bug之后,见:http://blog.csdn.net/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.sql
USE 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. WorkerMapper
package com.dao;
import com.entity.Worker;
public interface WorkerMapper {
int insertWorker(Worker worker);
}
4. Worker.java
package 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: 1
Worker ID: 1
Worker ID: 1
Worker ID: 1
Worker ID: 1
Worker ID: 1
Worker ID: 1
Worker ID: 1
Worker ID: 1
Worker ID: 1
Worker ID: 1
Worker ID: 1
Worker ID: 1
Worker ID: 1
Worker ID: 1
Worker ID: 1
Worker ID: 1
Worker ID: 1
Worker ID: 1
Worker ID: 1
can't get the real id.
得到MyBatis作者的反馈,<insert>语句本身有int型的返回值,表示插入的条数。故在<insert>语句内想使用<selectKey>返回自增ID自动生成的ID值是不可能的。
可以单独用<select>语句来完成返回自增ID自动生成的ID值。
分享到:
相关推荐
mybatis获取自增IDmybatis获取自增ID
mybatis获取自增主键的值 ,mybatis获取自增主键的值!
mybatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同。基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键,至于其他的手动生成唯一主键的问题在这里就不讨论了,这里主要说明下...
给大家分享MyBatis Oracle 自增序列的实现方法及mybatis配置oracle的主键自增长的方法,非常不错具有一定的参考借鉴价值,感兴趣的朋友一起看看吧
主键返回(mybatis的自增主键或者非自增主键) • 批量查询 • 动态传参 • 查询缓存(一级缓存、二级缓存) • 延迟加载(侵入式延迟加载、深度延迟加载) • 关联查询(一对一、一对映射) • 逆向工程 • ...
Mybatis插入数据返回自增主键 Mybatis插入数据以后只会返回影响的数据库行数,如果是插入一条数据成功则返回1,失败返回零,插入多条返回插入成功的数量。 通过注解或者xml配置无法直接返回自增的主键。Mybatis插入...
mybatis 自定义生成 entity/dao/mapper.xml 文件
mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis练习3mybatis...
一个保险箱密码保护程序 , 有10次密码输入机会,提示剩余尝试次数, 连续10输入错误密码自动关闭, 输入正确的密码给出提示。
1 修改Mapping文件(文件位置:src\main\java\org\mybatis\generator\codegen\mybatis3\xmlmapper\elements\) SelectByExampleWithBLOBsElementGenerator.java SelectByExampleWithoutBLOBsElementGenerator.java ...
MyBatis3官方中文文档高清 MyBatis3官方中文文档高清 MyBatis3官方中文文档高清 MyBatis3官方中文文档高清
mybatis3-dtd mybatis-3-config.dtd mybatis-3-mapper.dtd
MyBatis 3.2.6插入时候获取自增主键方法有两种,下面以以MySQL5.5为例通过两种方法给大家介绍mybatis获取自增主键的方法,一起看看吧
mybatis 3 中文 指南
mybatis3 spring3 cxf
mybatis3 中文手册, 官方版本,mybatis入门必读
mybatis配置的重要文件包括mybatis-3-config.dtd mybatis-3-mapper.dtd
MyBatis3 API 中文文档。MyBatis3 API 中文文档。MyBatis3 API 中文文档
MyBatis3 教程 中文版 MyBatis3 教程 中文版 MyBatis3 教程 中文版
mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架mybatis框架...