增删改之前先说一下笔记1里提到的一个无法创建ISqlMapper对象的问题。

<resultMaps>
<resultMap id="FullResultMap" class="TUSER">
<result property="UID" column="U_ID" dbType="Int"/>
<result property="UName" column="U_Name" dbType="VarChar"/>
<result property="UDept" column="U_Dept" dbType="VarChar"/>
</resultMap>
</resultMaps>
<insert id="Insert" parameterClass="TUSER">
INSERT INTO [dbo].[T_USER] (
[U_ID], [U_Name], [U_Dept])
VALUES ( #UID,dbType=Int#
,#UName,dbType=VarChar#
, #UDept,dbType=VarChar#
)
</insert>

上面的代码是用模板生成的配置文件.不知道1.9.x的版本是不是有此问题,因为我用的是1.6.x的版本.上面的VALUES后面的"#UID,dbType=Int# "带有字段的类型,实际上在此配置上部分中已有说明,这里会报错.应该删除掉如下:

<insert id="Insert_User" parameterClass="TUser">
INSERT INTO [dbo].[T_USER] (
[U_Name]
, [U_Dept]
) VALUES (
#UName#
, #UDept#
)
</insert>

下面来说增删改

实体表如下.注意:主键是UID自增长

USE [MyBatisDemo]
GO /****** Object: Table [dbo].[T_USER] Script Date: 10/24/2014 16:27:28 ******/
SET ANSI_NULLS ON
GO SET QUOTED_IDENTIFIER ON
GO SET ANSI_PADDING ON
GO CREATE TABLE [dbo].[T_USER](
[U_ID] [int] IDENTITY(1,1) NOT NULL,
[U_Name] [varchar](50) NULL,
[U_Dept] [varchar](50) NULL,
CONSTRAINT [PK_T_USER] PRIMARY KEY CLUSTERED
(
[U_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO SET ANSI_PADDING OFF
GO

配置如下:

<?xml version="1.0" encoding="utf-8" ?>
<!--============================================================================
// CAUTION: This file is generated by IBatisNetGen.BatisMap.cst at 2014-10-22 13:59:11
// Any manual editing will be lost in re-generation.
//===========================================================================-->
<sqlMap namespace="MyBatisDemo"
xmlns="http://ibatis.apache.org/mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <alias>
<typeAlias alias="TUser" type="MyBatisDemo.TUser" />
</alias> <resultMaps>
<resultMap id="FullResultMap" class="TUser">
<result property="UID" column="U_ID" dbType="Int"/>
<result property="UName" column="U_Name" dbType="VarChar"/>
<result property="UDept" column="U_Dept" dbType="VarChar"/>
</resultMap>
</resultMaps> <statements> <insert id="Insert_User" parameterClass="TUser">
INSERT INTO [dbo].[T_USER] (
[U_Name]
, [U_Dept]
) VALUES (
#UName#
, #UDept#
)
</insert>
<update id="Update_User" parameterClass="TUser">
UPDATE [dbo].[T_USER] SET
[U_Name] = #UName#
, [U_Dept] = #UDept#
WHERE
([U_ID] = #UID#)
</update>
<delete id="Delete_User" parameterClass="TUser">
DELETE FROM [dbo].[T_USER]
WHERE
([U_ID] = #UID#)
</delete>
<select id="FindAll" resultMap="FullResultMap">
SELECT *
FROM [dbo].[T_USER]
</select>
</statements>
</sqlMap>

C#代码如下:

using System.Text;
using System.Windows.Forms;
/**/
using IBatisNet.Common; using IBatisNet.DataMapper; using IBatisNet.DataMapper.Configuration; using IBatisNet.Common.Utilities; using IBatisNet.DataAccess; using IBatisNet.DataAccess.Configuration; using IBatisNet.DataAccess.Interfaces; using IBatisNet.Common.Logging;
/* */ namespace MyBatisDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{ } private void button1_Click(object sender, EventArgs e)
{
var insertProductId = BaseDA.Insert<TUser>("Insert_User", new TUser()
{
UDept = "bbb",
UName = "bbb"
});
if( insertProductId!= )
{ MessageBox.Show(insertProductId.ToString(),"title"); }
} private void button2_Click(object sender, EventArgs e)
{
var insertProductId = BaseDA.Update<TUser>("Update_User", new TUser()
{
UID=,
UDept="qjs",
UName="qjs"
});
if (insertProductId != )
{ MessageBox.Show(insertProductId.ToString(), "title"); }
} private void button3_Click(object sender, EventArgs e)
{
var insertProductId = BaseDA.Delete("Delete_User", );
if (insertProductId != )
{ MessageBox.Show(insertProductId.ToString(), "title"); }
} private void button4_Click(object sender, EventArgs e)
{
List<MyBatisDemo.TUser> list_user = (List<MyBatisDemo.TUser>)BaseDA.QueryForList<MyBatisDemo.TUser>("FindAll", null);
dataGridView1.DataSource = list_user;
; }
}

当调用增加方法时提示"未将对象引用设置到对象的实例"的经典错误.

查来查去没有找到原因,后来突然想起某天在网上看到某位网友说的返回值为空的问题.一查果然是没有返回影响结果行数,而是返回的是NULL.

那么如何返回影响结果行数呢?请在配置中修改:

<insert id="Insert_User" parameterClass="TUser">
<selectKey property="UID" type="post" resultClass="int">select @@IDENTITY as value</selectKey>
INSERT INTO [dbo].[T_USER] (
[U_Name]
, [U_Dept]
) VALUES (
#UName#
, #UDept#
)
</insert>

实际上就是在内部加入了一个返回自增长的主键值.运行后程序通过.Update与delete不用修改会直接返回影响行数.后来在网上查到如下内容.

iBatis insert操作陷阱

在使用iBatis插入数据的时候,容易跌入陷阱。

一、保存insert方法

在保存数据方面,iBatis的insert方法返回的是新增记录的主键,类型为Object,但实为整数数字型,有时候会让人误解为实体类型,也并非任何表的insert操作都会返回主键----这是一个陷阱。

要返回这个新增记录的主键,前提是表的主键是自增型的,或者是Sequence的。否则获取新增记录主键的值为0或者null。

对于MySQL这样来写:
<selectKey keyProperty="id" resultClass="long">
select LAST_INSERT_ID()
</selectKey> 对比Hibernate返回的Serializable类型,实际上也是主键。 二、更新删除update/delete方法 返回影响的记录行数。 三、对DAO/Service设计时候的影响 1、对于自增主键类型表,DAO的save方法可以返回主键、或者实体对象(该对象的标识符域会填充上主键值)。 2、对于非自增主键类型表,DAO的save方法,在保存之前就指导整个实体对象的所有值(包括主键),因此返回什么都可以,也可以不返回值。 3、对于Service的,不管表如何,一般都返回保存的实体对象。 四、查询 1、对于findById方式查询一条记录并转换为某个JavaBean对象的时候,不会因为所传参数的标识的没有对应的记录的而发生异常。当不存在时候,会返回null。 本文出自 “熔 岩” 博客,转载请与作者联系!

3、MyBatis.Net学习笔记之增删改的更多相关文章

  1. Mybatis学习笔记3 - 增删改查示例

    1.接口定义 package com.mybatis.dao; import com.mybatis.bean.Employee; public interface EmployeeMapper { ...

  2. 【.NET-EF】Entity Framework学习笔记2 - 增删改(没查询)

    学习描述:用EF就像是省略了做实体类和DAL类,感觉是很方便,废话不多说,直接写步骤: 1.创建EF的edmx文件 这个其实在笔记1已说过,不过有些细节也要说,所以再说一遍,这里使用的是EF 6.1版 ...

  3. 【转载】ASP.NET MVC Web API 学习笔记---联系人增删改查

    本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查.目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的.下面我们通过创建一个简单的Web API来管理联系 ...

  4. EF学习笔记——通用增删改查方案

    http://blog.csdn.net/leftfist/article/details/25005307 我刚接触EF未久,还不知道它有什么强大之处,但看上去,EF提供了一般的增删改查功能.以往用 ...

  5. ASP.NET MVC Web API 学习笔记---联系人增删改查

    本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查. 目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的. 下面我们通过创建一个简单的Web API来管理 ...

  6. MongoDB学习笔记,基础+增删改查+索引+聚合...

    一 基础了解 对应关系 -> https://docs.mongodb.com/manual/reference/sql-comparison/ database -> database ...

  7. easyui学习笔记1—增删改操作

    最近公司要用easyui,这里自己看了官网几篇文章,遇到些问题,大多数的问题都是敲代码的时候笔误,其他有些地方确实需要注意一下,这里做些笔记. 1.在mysql中建好表之后修改id字段为递增字段,发现 ...

  8. 学习笔记: mysql增删改查基础语句

    mysql基础入门语句 增: INSERT INTO 表名(字段1, 2, 3) VALUES('值1', '2', '3') 删: DELETE FROM 表明 WHERE 删除条件 不提供更新条件 ...

  9. MongoDB学习笔记四—增删改文档下

    $slice 如果希望数组的最大长度是固定的,那么可以将 $slice 和 $push 组合在一起使用,就可以保证数组不会超出设定好的最大长度.$slice 的值必须是负整数. 假设$slice的值为 ...

随机推荐

  1. c#基础语言编程-常用函数

    类型转换Convert Convert考虑数据意义的转换. Convert是一个加工.改造的过程.在使用Convert的转换过程中不会返回异常,当遇到类型转换的不知道的时候,用Convert找找. T ...

  2. 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/19809337 作者:毛星云(浅墨 ...

  3. MySQL字符串函数

    字符串大写和小写转换 MySQL 字符串大写和小写转化函数有两对: lower(), uppper() 和 lcase(), ucase() mysql> select lower('DDD') ...

  4. android 23 启动带2个Categories值的预定义acticity和桌面activity

    mainActivity.java package com.sxt.day04_07_twoaction; import android.os.Bundle; import android.app.A ...

  5. OOP—ECMAScript实现详解

    我们将从最基本的数据类型来分析,首先要了解的是ECMAScript用原始值( primitive values) 和对象 ( objects) 来区分实体, 因此有些文章里说的“在JavaScript ...

  6. VMware虚拟机中调整Linux分区大小——使用gparted

    虚拟机分配了50G大小的空间,最近发现不够用,于是将扩展一下分区的大小,查了几种方法都不是很好,后来借助了gparted分区空间完成了,这个工具简单,方便,下面就简单的介绍一下.扩展分区主要要分为两步 ...

  7. Java编程陷阱-类成员初始化

    原文地址:http://blog.csdn.net/veryitman/article/details/6450523 如果你忽略Java的细节,恐怕你的代码会充满bug,下面讨论关于类成员初始化问题 ...

  8. ZOJ 3903 Ant(公式推导)

    这个公式推导过程是看的这位大牛的http://blog.csdn.net/bigbigship/article/details/49123643 扩展欧几里德求模的逆元方法: #include < ...

  9. 11.3 morning

    noip模拟题day1 总览(Overview)   题目名称 取模 等比数列 回文串 程序名 mod sequence palindromes 输入文件名 mod.in sequence.in pa ...

  10. poj 3565 ants

    /* poj 3565 递归分治 还有用KM的做法 这里写的分治 按紫书上的方法 不过那里说的有点冗杂了 可以简化一下 首先为啥可以分治 也就是分成子问题解决 只要有一个集合 黑白的个数相等 就一定能 ...