项目引用ibatis包:

IBatisNet.Common.dll --文件版本1.6.2.0
IBatisNet.DataAccess.dll
IBatisNet.DataMapper.dll

项目目录结构:

项目中使用ibatis做数据访问层已经有好长时间了。开发小组成员反映ibatis的insert操作返回的结果是null,这一点很是不爽。 其实,大家都是希望能够把新增记录的主键值返回出来。 上上周,大家有反编译ibatis的包,查看其实现原理,后来,又尝试其他方法,都没能给实现这个功能。

这两天,决定找点时间,来搞定这个头疼的事儿。

结合网上搜到的东东,总结出方案是通过insert语句的selectKey子元素来返回insert命令生成的记录的主键值。

如下是xml映射文件里insert节点:

<insert id="InsertEntity"  parameterclass="T_Ent_Project">
insert into T_Ent_Project(EntId,ProjectNo,ProjectName,BudgetAmount,LockedAmount,UsedAmount,AvailableAmount,Active,CreatedBy,CreatedTime,ModifiedBy,ModifidTime )
values( #EntId#, #ProjectNo#, #ProjectName#, #BudgetAmount#, #LockedAmount#, #UsedAmount#, #AvailableAmount#, #Active#, #CreatedBy#, #CreatedTime#, #ModifiedBy#, #ModifidTime# ) <!--通过insert语句的selectKey子元素来返回insert命令生成的记录的主键值-->
<selectKey resultClass="int" type="post" property="ProjectId">
select @@IDENTITY
</selectKey>
</insert>

需要注意的是,上面的select @@IDENTITY是相对于MsSql来讲的,如果数据库是mysql或oracle,会有不同。

另外,当selectKey配置不当,运行程序会出现类似如下异常:

  • Unknown selectKey type : ''
  • There is no Set member named '' in class 'T_Ent_Project'

如下是对ibatis做的crud的测试类:

using IBatisDemo.Domains;
using IBatisNet.DataMapper;
using IBatisNet.DataMapper.Configuration;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System; namespace IBatisDemo
{
[TestClass]
public class IbatisCRUDTest
{
[TestMethod]
public void TestCRUD()
{
// 初始化sqlmapper对象
DomSqlMapBuilder builder = new DomSqlMapBuilder();//bin\\
string path = System.AppDomain.CurrentDomain.BaseDirectory + /*"bin\\" +*/ "\\SqlMap.config";
ISqlMapper mapper = builder.Configure(path); // 定义实体对象
T_Ent_Project model = new T_Ent_Project()
{
ProjectName = "test mybatis",
EntId = ,
CreatedTime = DateTime.Now
}; // insert
var ret = mapper.Insert("MyBatis_T_Ent_Project.InsertEntity", model);
int newId = Convert.ToInt32(ret);
Console.WriteLine("insert后的记录的主键值:" + newId); // select
var newModel = mapper.QueryForObject<T_Ent_Project>("MyBatis_T_Ent_Project.getByKey", newId);
Assert.AreEqual(newId, newModel.ProjectId); //Update 和 Delete 都返回受影响的行数。
model.ProjectId = newId;
model.ProjectName += "updated";
int updRowCount = mapper.Update("MyBatis_T_Ent_Project.UpdateEntity", model);
Console.WriteLine("update影响行数:" + updRowCount); int delRet = mapper.Delete("MyBatis_T_Ent_Project.DeleteEntity", model.ProjectId);
Console.WriteLine("delete影响行数:" + delRet);
}
}
}

测试返回结果:

IBatisNet:让insert操作返回新增记录的主键值的更多相关文章

  1. MyBatis 插入时返回刚插入记录的主键值

    MyBatis 插入时返回刚插入记录的主键值 一.要求: 1.数据库表中的主键是自增长的,如:id: 2.获取刚刚插入的记录的id值: 二.源代码: 1.User.java package cn.co ...

  2. mybatis oracle 插入自增记录 获取主键值 写回map参数

    网上搜了好多文章照着弄都返回不了主键给map, 实践证明要在传入的map参数里写回插入的主键,要这样写 <selectKey resultType="java.lang.Integer ...

  3. JDBC_获取插入记录的主键值

    <span style="font-size:24px;">package src.com.JDBC2DAO.java; import static org.junit ...

  4. MYSQL 之 JDBC(十一): JDBC获取插入记录的主键值

    取得数据库自动生成的主键值 package com.litian.jdbc; import javax.swing.plaf.nimbus.State; import java.sql.*; /** ...

  5. mysql insert一条记录后怎样返回创建记录的主键id,last_insert_id(),selectkey

    mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...

  6. mybatis返回新增对象的主键

    加这两行就可以返回这个插入对象的自增的主键<insert id="insertSeatPortraitData" parameterType="seatPortra ...

  7. <九>JDBC_获取插入记录的主键值

  8. spring jdbc获取插入记录的主键id

    在JDBC3.0规范中,当新增记录时,允许将数据库自动产生的主键值绑定到Statement或PreparedStatement中.使用Statement时,可以通过以下方法绑定主键值: int exe ...

  9. 160613、MyBatis insert操作返回主键

    在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能,针对Sequence主键而言,在执行 ...

随机推荐

  1. Linux下修改mysql密码

    # /etc/init.d/mysql stop# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &# mysq ...

  2. Ubuntu grub引导修复

    通过USB启动盘安装系统时将引导程序指定到/dev/sdb1,正常应该是指定到/dev/sdb才是,导致安装之后启动不起来. 重新通过USB启动盘进入试用界面,然后打开终端通过如下操作进行grub引导 ...

  3. Unsupported major.minor version 51.0解决方法

    jdk1.6工程中使用外部jar包中类出现:Unsupported major.minor version 51.0 问题原因:外部jar包使用jdk1.7(jdk7)编译,而使用此jar包的工程jd ...

  4. 天气预报API(四):全国城市代码列表(“新编码”)

    说明 天气预报API系列文章涉及到的天气网站10个左右,只发现了中国气象频道和腾讯天气城市代码参数特别: 暂且称 中国气象频道.腾讯天气使用的城市代码为 "新编码" 注:中国气象频 ...

  5. Inno setup中定制安装路径

    我的程序修改了安装界面,所以我的界面中提供了更改安装路径的方法. 用户修改后的路径会被传回inno setup脚本,脚本中需要做的事情如下: 1,写一个函数,来返回新的安装路径,如: function ...

  6. smartupload 上传与下载(转载)

    前台: <form action="uploadimage.jsp" method="post" enctype="multipart/form ...

  7. window.showModalDialog返回值和window.open返回值实例详解

    最近在谷歌浏览器下发现一个问题,就是使用谷歌浏览器已经不兼容window.showModalDialog了,所以还是改成使用window.open(). 一.window.showModalDialo ...

  8. Reactnative 随笔一

    ---恢复内容开始--- 1.ReactDOM.render()    React的最基本方法,用于将模板转为HTML语言,并插入指定的DOM节点 将h标签插入example节点 2.HTML语言直接 ...

  9. 在Windows用Rebar来构建,编译,测试,发布Erlang项目

    rebar是一个遵循 Erlang/OTP 原则的 Erlang 项目构建工具,使用它可以减少构建标准 Erlang/OTP 项目架构配置的工作量,并且可以很容易的编译.测试.发布 Erlang 应用 ...

  10. JavaScript + HTML 虚拟键盘效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...