当我们在ibatis中使用一对一的时候,想取得自增加字段的值。
Ibatis也提供这种取值方式,具体的配置如下 :
DROP TABLE IF EXISTS `t_blog`;
CREATE TABLE `t_blog`(
`id` bigint NOT NULL auto_increment, -- blog编号
`name` varchar(255) NOT NULL , -- blog名称
`description` varchar(255) default '' , -- blog介绍
`domain` varchar(255) NOT NULL , -- blog域名
PRIMARY KEY (`id`)
)
TYPE=InnoDB DEFAULT CHARSET=utf8 ;
ibatis中对应的配置如下:
<!-- 添加博客 -->
<insert id="insertBlog">
insert into t_blog
(name, description, domain)
values
(#name#, #description#, #domain#)
<selectKey resultClass="int" keyProperty="id" >
SELECT @@IDENTITY AS ID
</selectKey>
</insert>
DAO中的调用方法:
public int insertBlog(Blog blog) throws DAOException {
try{
return ((Integer)getSqlMapClientTemplate().insert("insertBlog", blog)).intValue();
}
catch(Exception ex){
logger.error(ex);
throw new DAOException("创建博客发生错误...");
}
}
test insertBlog方法返回的int为自增加的id。
[转帖2]
Xml代码
<!-- Oracle SEQUENCE -->
<insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">
<selectKey resultClass="int" keyProperty="id" type="pre">
<![CDATA[SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL]]>
</selectKey>
<![CDATA[insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values #id#,#description#)]]>
</insert>
<!-- Microsoft SQL Server IDENTITY Column -->
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">
<![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values (#description#) ]]>
<selectKey resultClass="int" keyProperty="id" type="post">
<![CDATA[SELECT @@IDENTITY AS ID ]]> <!-- 该方法不安全 应当用SCOPE_IDENTITY() 但这个函数属于域函数,需要在一个语句块中执行。 -->
</selectKey>
</insert>
<!-- Microsoft SQL Server IDENTITY Column 改进-->
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">
<selectKey resultClass="int" keyProperty="id">
<![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values (#description#)
SELECT SCOPE_IDENTITY() AS ID ]]>
</selectKey>
</insert>
<!-- Mysql Last Insert Id -->
<insert id="insertProduct-Mysql" parameterClass="com.domain.Product">
<![CDATA[insert into PRODUCT(PRD_DESCRIPTION) values (#description#)]]>
<selectKey resultClass="int" keyProperty="id">
<![CDATA[SELECT LAST_INSERT_ID() AS ID ]]> <!-- 该方法LAST_INSERT_ID()与数据库连接绑定,不会发生上述MS SQL Server的函数问题。 -->
</selectKey>
</insert>
<!-- Oracle SEQUENCE -->
<insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">
<selectKey resultClass="int" keyProperty="id" type="pre">
<![CDATA[SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL]]>
</selectKey>
<![CDATA[insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values #id#,#description#)]]>
</insert>
<!-- Microsoft SQL Server IDENTITY Column -->
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">
<![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values (#description#) ]]>
<selectKey resultClass="int" keyProperty="id" type="post">
<![CDATA[SELECT @@IDENTITY AS ID ]]> <!-- 该方法不安全 应当用SCOPE_IDENTITY() 但这个函数属于域函数,需要在一个语句块中执行。 -->
</selectKey>
</insert>
<!-- Microsoft SQL Server IDENTITY Column 改进-->
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">
<selectKey resultClass="int" keyProperty="id">
<![CDATA[insert into PRODUCT (PRD_DESCRIPTION) values (#description#)
SELECT SCOPE_IDENTITY() AS ID ]]>
</selectKey>
</insert>
<!-- Mysql Last Insert Id -->
<insert id="insertProduct-Mysql" parameterClass="com.domain.Product">
<![CDATA[insert into PRODUCT(PRD_DESCRIPTION) values (#description#)]]>
<selectKey resultClass="int" keyProperty="id">
<![CDATA[SELECT LAST_INSERT_ID() AS ID ]]> <!-- 该方法LAST_INSERT_ID()与数据库连接绑定,不会发生上述MS SQL Server的函数问题。 -->
</selectKey>
</insert>
[实例]
<insert id="insertAuthor" parameterClass="Author">
insert into AUTHOR( AUT_NAME ) values ( #name# )
<selectKey resultClass="int" keyProperty="id">
select LAST_INSERT_ID() as id
</selectKey>
</insert>
Integer resultId = ( (Integer)getSqlMap().insert("insertAuthor", newer) ).intValue();