IBatisNet:让insert操作返回新增记录的主键值

时间:2023-02-24 09:31:30

项目引用ibatis包:

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

项目目录结构:

IBatisNet:让insert操作返回新增记录的主键值

项目中使用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操作返回新增记录的主键值

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&lowbar;获取插入记录的主键值

    <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&comma;last&lowbar;insert&lowbar;id&lpar;&rpar;&comma;selectkey

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

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

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

  7. &lt&semi;九&gt&semi;JDBC&lowbar;获取插入记录的主键值

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

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

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

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

随机推荐

  1. mysql 乱码问题(程序界面显示正常,mysql command line显示乱码)

    今天用java写一个程序,用的是mysql数据库.界面出现乱码,然后写了一个过滤器结果了乱码问题. 但是,当我在mysql command line 中查询数据的时候,在界面上显示正常的数据,在mys ...

  2. Hadoop日记Day12---MapReduce学习

    一.MapReduce简介 1.1MapReduce概述 MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题.MR由两个阶段组成:Map和Reduce ...

  3. C&num; 面向对象之概念理解(3)

    多态 多态是指两个或多个属于不同类的对象,对同一个消息(方法调用)做出不同响应的能力. 多态(<韦氏大词典>)中定义:可以呈现不同形式的能力或状态. C#如何实现多态的知识——即继承上覆载 ...

  4. ios5 xcode 4&period;2 中 release显示编译警告或错误的解决方法

    转自:http://lizi464789754.blog.163.com/blog/static/1689370852011924113245778/ 由于 iOS5 xcode4.2 引入了ARC ...

  5. C&num;生成缩略图代码

    /**//// <summary>         /// 生成缩略图         /// </summary>         /// <param name=&q ...

  6. Bzoj 2834&colon; 回家的路 dijkstra&comma;堆优化&comma;分层图&comma;最短路

    2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] D ...

  7. DOTween 模仿NGUI Tween

    最近再做一个小的项目,只要使用的是DOTween 动画. 但是感到DOTween 在某些方面不如 NGUI的Twenn 比较好用 所以就模仿了一下 在此,请各位大神指点一下 public class ...

  8. c&num;语言基础之组成结构

    一.项目结构 .cs---    源文件(程序代码) .csproj---项目文件(管理文件项) .sln---   解决方案文件(管理项目) .config---配置文件 函数的四要素:名称.输入. ...

  9. GCD is Funny

    GCD is Funny Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Pro ...

  10. 负载均衡 Lvs DR 模式笔记

    先来一张原理图,相当于ip-tun模式把tunl0的那块网卡配置在eth0:0的这个接口上,避免了兼容性的问题