3、MyBatis.Net学习笔记之增删改

增删改之前先说一下笔记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">
      <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 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!=0 )
            { MessageBox.Show(insertProductId.ToString(),"title"); }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            var insertProductId = BaseDA.Update<TUser>("Update_User", new TUser()
            {
                UID=2,
                UDept="qjs",
                UName="qjs"
            });
            if (insertProductId != 0)
            { MessageBox.Show(insertProductId.ToString(), "title"); }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            var insertProductId = BaseDA.Delete("Delete_User", 3);
            if (insertProductId != 0)
            { 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。

本文出自 “熔 岩” 博客,转载请与作者联系!
时间: 2024-12-11 16:21:48

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

easyui学习笔记1—增删改操作【转载】

最近公司要用easyui,这里自己看了官网几篇文章,遇到些问题,大多数的问题都是敲代码的时候笔误,其他有些地方确实需要注意一下,这里做些笔记. 1.在mysql中建好表之后修改id字段为递增字段,发现这个奇怪的mysql语法,如下 alter table student change id id int auto_increment; 这句是在student表已经建好的情况下来修改字段id为自增列,奇怪的是为嘛change id id,并且后面还要带上id的类型int? 2.html5标记 如何

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

本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查.目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的.下面我们通过创建一个简单的Web API来管理联系人 说明:为了方便数据不使用真正的数据库,而是通过内存数据模拟 1.       Web API中包含的方法 Action HTTP method Relative URI GetAllContact GET /api/contact GetContact GET /api/contact /id

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

http://blog.csdn.net/leftfist/article/details/25005307 我刚接触EF未久,还不知道它有什么强大之处,但看上去,EF提供了一般的增删改查功能.以往用过一些ORM方法,尽管有代码生成器,但代码量总的 来说比较多.这次采用EF,我就想,能不能尽量写出一些通用的方法,以后添加表.实体类,只需做很少的改动,就能拥有基本的增删改查功能呢? 方案如下: 1. 分为几个部分:BLL.DAL.Model.Interface.其中,EF生成的代码放在Model.

MyBatis学习--简单的增删改查

jdbc程序 在学习MyBatis的时候先简单了解下JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: 1 Public static void main(String[] args) { 2 Connection connection = null; 3 PreparedStatement preparedStatement = null; 4 ResultSet resultSet = null; 5 6 try { 7 //加载数据库驱动 8 Class.forName

Jquery Easy UI初步学习(三)数据增删改

第二篇只是学了加载用datagrid加载数据,数据的增删改还没有做,今天主要是解决这个问题了. 在做增删改前需要弹出对应窗口,这就需要了解一下EasyUi的弹窗控件. 摘自:http://philoo.cnblogs.com/ 我的理解,就是panel有的属性Window.dialog都有,同时保留自己的扩展属性方法 , 所以主要展示pannel的属性. Pannel 属性 名称 类型 说明 默认值 title string 显示在Panel头部的标题文字. null iconCls strin

Mybatis使用之简单的增删改查

Mybatis使用之简单的增删改查 一:简介 主要记录最简单的数据的增删改查.下一章会有各个操作详细一点的配置说明.以Author表为例(见上一博客).Author表没有关联任何其他表.也没有特殊字段. 二:映射规则 2.1.映射文件中的sql方法与对应的XxxMapper接口中的方法映射规则: a)映射文件的namespace的值是XxxMapper接口的全限定名.即包名+接口名称 b)映射文件中表示增删改查的标签(select.insert.delete.update)的id的值是接口中方法

Mybatis简单的入门之增删改查

一般的步骤如下 1.添加Mybatis所需要的包,和连接数据库所需的包 2.配置mybatis-config.xml文件 3.配置与pojo对应的映射文件 mybatis-config,xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http:/

C#语法基础学习笔记-自增(i++、++i)

在刚刚的学习过程中,把困扰已久的问题解决了.下面来跟大家一起分享,探讨一下. i++和++i的相同点: 如:1).int  i=1;  i++;  Console.WriteLine(i); 2).int i=1;++i;Console.WriteLine(i); 通过编译运行上面两端代码,结果i最后的值都是2,i++和++i 的作用是实现变量i的自增. 不同点: 如:1).int i=1;int j=0;j=i++*2;Console.WriteLine("j的值 是{0},i的值是{1}&q

SpringBoot + MyBatis 实现对员工的增删改查

SpringBoot + MyBatis 实现对员工的增删改查 一.使用idea新建SpringBoot项目 File-->New-->Project-->Spring Assistant-->Next-->修改报名,项目名等信息-->Next-->在web中选中web,在SQL中选中MySQL.JDBS.MyBatis-->Next-->Finish 二.修改pom.xml文件[之前的操作已经导入了springboot.mysql.jdbc.myba