3、MyBatis.Net学习笔记之增删改
来源:互联网 发布:淘宝有哪些漫画书店铺 编辑:程序博客网 时间:2024/06/14 10:42
增删改之前先说一下笔记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 ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE 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]GOSET ANSI_PADDING OFFGO
配置如下:
<?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!=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。本文出自 “熔 岩” 博客,转载请与作者联系!
大道至简
0 0
- 3、MyBatis.Net学习笔记之增删改
- ASP.NET学习笔记之增删改查操作
- MyBatis框架学习之增删改查
- MyBatis增删改示例——MyBatis学习笔记之二
- docker 学习笔记之增删改查
- MyBatis学习笔记(三)---增删改查
- mybatis学习笔记(七)增删改查
- mybatis学习笔记(二)增删改查
- mybatis学习笔记(二) --- 熟悉增删查改
- Mybatis学习笔记三:实现增删查改
- 【知了堂学习笔记】myBatis实现增删查改
- Mybatis学习笔记-第一个增删改查的程序
- mybatis之增删改查
- MyBatis之增删改查
- Mybatis之增删改查
- Mybatis笔记之二 -- 简单的增删改查
- (二)mybatis学习之入门增删改查
- MyBatis学习之SQL查询参数以及增删改操作
- (i++)+(i++)与(++i)+(++i)
- 流量分析篇(粗糙)
- C++chan常用API
- C++ primer(第五版) 练习 6.33
- UVA 10465 Homer Simpson(完全背包: 二维目标条件)
- 3、MyBatis.Net学习笔记之增删改
- MFC 模态对话框dlg.DoModal()返回值
- VS2005,VS2008,VS2010工程文件之间的相互移植和解决方案
- 计算机网络之物理层笔记
- Linux下防止程序重新启动
- 排序算法性能和使用场景总结
- div 包裹img,div 高度大于img
- python文件操作
- 580建筑英才简介