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

项目引用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 = 0,
                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);
        }
    }
}

测试返回结果:

时间: 2024-10-11 20:09:10

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

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

MyBatis 插入时返回刚插入记录的主键值 一.要求: 1.数据库表中的主键是自增长的,如:id: 2.获取刚刚插入的记录的id值: 二.源代码: 1.User.java 1 package cn.com.zfc.model; 2 3 public class User { 4 5 private Integer id; 6 private String name; 7 private String password; 8 9 public Integer getId() { 10 retur

MyBatis+MySQL 返回插入记录的主键ID

今天用到了多个表之间的关系,另一个表中的一个字段要以第一个表的主键作为外键. 下面说两种方法,MyBatis+MySQL 返回插入记录的主键ID: 第一种: <insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User"> insert into us

mybatis insert语句 返回插入的记录的主键值

Map<String,Object> paymentMp = new HashMap<String,Object>();        paymentMp.put("amount", 12.0 );        paymentMp.put("pay", Attributes.Payment_Pay_No);        paymentMp.put("status", Attributes.Payment_Status_

MyBatis返回插入记录的主键

如果想插入一条记录之后,立刻对其进行其他操作,这时候就需要获取记录的主键(通常是ID),MyBatis有以下方式处理. Dao层的接口定义如下: void importUser(@Param( "user" ) User user); 注意:这里不能因为要返回主键而定义接口的返回值类型为String或者int,会报错. xml配置文件: <insert id= "importUser" useGeneratedKeys = "true" k

JDBC:元数据 &amp;&amp; 获取插入记录的主键值 &amp;&amp; _JDBC_处理 Blob

一.元数据 DatabaseMetaData类 DatabaseMetaData 类中提供了许多方法用于获得数据源的各种信息,通过这些方法可以非常详细的了解数据库的信息: getURL():返回一个String类对象,代表数据库的URL. getUserName():返回连接当前数据库管理系统的用户名. isReadOnly():返回一个boolean值,指示数据库是否只允许读操作. getDatabaseProductName():返回数据库的产品名称. getDatabaseProductV

jdbc 预编译处理 和spring返回自增主键值

利用GeneratedKeyHolder获得新建数据主键值 Spring利用GeneratedKeyHolder,提供了一个可以返回新增记录对应主键值的方法 : int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder)//该方法返回受影响的行数,同时将新增记录对应主键值赋值给generatedKeyHolder参数 Spring为KeyHolder接口指代了一个通用的实现类GeneratedKeyHolder,该

Mybatis 插入数据后返回主键值

Oracle中获取刚刚插入记录的主键值: <insert id="insertSelective" parameterType="com.jxxx.p2pp.model.UUserInfo">     <selectKey resultType="java.math.BigDecimal" order="BEFORE" keyProperty="id">    SELECT U_US

mybatis在oracle插入对象后返回主键值

在mybatis中默认插入一条记录后,返回值为插入记录的条数. 现在想获取插入记录后,当前被插入的记录的主键值,需在insert方法中添加如下代码: <insert id="insert" parameterType="cn.com.pm.ppm.model.UserInfo" >   <selectKey resultType="java.math.BigDecimal" order="BEFORE" ke

获取呈现在格表(table)记录的主键

用mouse点击表格(table)的行或是批定列,获取记录的主键值.在ASP.NET的MVC应用程序中,已经没有办法象ASP.NET的Data控件一样,如GridView,DataList和Repeater控件好找到记录记键值了.下面的示例中,Insus.NET演示,如何获取呈现在格表(table)记录的主键.打开以前练习的例子: 先来演示,点击行中任何一列,获取: 实时演示: 如果,我们想只能点击第一列,才去获取记录的主键值,也就是说,指定点击某一列,这样的话,我们改一下jQuery代码: 看