项目引用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. sharedpreferences的简单使用

    sharedpreferences 以键值对的方式将数据保存在xml   创建:SharePreferences sp = getShareferences(name,context.---) con ...

  2. map阶段动态获取CombineTextInputFormat各输入文件路径

    老mr程序中map中conf的map.input.file参数只能获取获取CombineTextInputFormat的第一个输入文件,而新版mr程序则连第一个输入文件也无法获取,这是因为create ...

  3. 读取全球ip获取用户地区

    这个 首先说明下.ip库是qq纯真ip库 dat文件类型 public static string QQipPath = AppDomain.CurrentDomain.BaseDirectory + ...

  4. 国内及Github优秀开发人员列表

    自从入了Android软件开发的行道,解决问题和学习过程中免不了会参考别人的思路,浏览博文和门户网站成了最大的入口.下面这些列表取名为:国内及Github优秀开发人员列表,就是浏览后的成果. 虽然下述 ...

  5. IE全屏浏览代码

    以前做过一个网络版的商场导购触摸屏系统,用ASP写的,就是要在运行的时候全屏浏览而不能出现标题栏.工具栏.状态栏等.解决方法是用JS弹出全屏窗口,建立html文件,代码如下: <script l ...

  6. 解决mac安装grunt时出现[command not found]的错误

    第一步: 1先确定一下.bash_profile是否存在. 2在mac终端输入: test -e .bash_profile && echo "found" || ...

  7. ASP.NET Core 1.0 部署 HTTPS (.NET Framework 4.5.1)

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  8. VS2012中,C# 配置文件读取 + C#多个工程共享共有变量 + 整理using语句

    (一) C# 配置文件读取 C#工程可以自动生成配置文件,以便整个工程可以使用设置的配置进行后续的处理工作. 1. 首先,右键工程文件-->Properties -->settings-- ...

  9. CSS盒模型

    CSS盒模型是CSS 可视化格式化系统的基石,它是理解样式表如何工作的核心概念.盒模型用于元素定位和页面布局.元素框的最内部分是实际的内容,直接包围内容的是内边距.内边距呈现了元素的背景.内边距的边缘 ...

  10. disconf使用

    1.创建app,确定version 2.创建配置文件redis.config 3.选择app下env环境,上传redis.config到disconf 4.创建disconf.properties到c ...