一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM的批量删除与更新

系列回顾

          前面的文章一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM的基本操作和一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-演示ORM的条件查询两篇文章我演示了ORM的基本使用并引申到开发中最常见的条件查询业务,今天我基于前一篇文章的条件查询的基础演示根据条件的批量删除与更新。

问题提出

          在演示ORM的基于操作一文中我们演示了基于单记录(实体)的删除(Update)和更新(处理),但是没有提到指量记录的更新与删除,本文旨在提出一种ORM应用中的解决方案并演示他的用法。

如果解决

          批量更新与删除数据记录的本质是执行带批量查询条件的Update和Delete语句,ORM组件要完成这样的功能,所实现的思想就是根据条件生成批量更新的SQL语句,批量删除的SQL语句新式: delete +数据库表名+ where + 条件表达式,批量更新的SQL语句新式:update+数据库表名+set+(列名=?[,…])+ where + 条件表达式。

          既然我们知道了这样的处理方法,那么我们就可以转换为ORM组件的表示方式进行处理,在ORM组件的ITable接口中存在着以下三个方法:

    /// <summary>
    /// 从数据库中删除数据表记录。
    /// </summary>
    /// <param name="condition">数据查询条件。</param>
    /// <remarks>删除操作所影响的数据行数。</remarks>
    void Delete(Condition condition);

    /// <summary>
    /// 根据条件更新数据库表中的指定列的值。
    /// </summary>
    /// <param name="colValues">要更新的列及指定的值。</param>
    /// <param name="condition">数据查询条件。</param>
    /// <remarks>更新操作所影响的数据行数。</remarks>
    void Update(ColumnCollection colValues,Condition condition);

    /// <summary>
    /// 根据条件更新数据库表中的指定列的值。
    /// </summary>
    /// <param name="colValues">要更新的列及指定的值。</param>
    /// <param name="condition">数据查询条件。</param>
    /// <remarks>更新操作所影响的数据行数。</remarks>
    void Update(IDictionary<string, object> colValues,Condition condition);

          Delete方法使用很简单,带上删除记录的条件对象即可,Update方法的使用则复杂一些,除了设置更新记录的条件,还得设置更新列的内容,提供两种表示形式,ColumnCollection 集合与字典集合,其目的是完成字典名=?(值)的表示形式。

演示简介

          关于条件查询以及条件的构造的知识差不多也就是这些,讲起来也没有什么讲头,重点才于如何组合这些条件实现复杂的业务,在今天的案例中我选择性的演示几个条件的用法,所使用的数据还是商品字典,达到以下的功能:

           1.删除记录ID从100到500的记录并且单位为“1*瓶/瓶”的所有商品。

           2.更新商品编码前2位为“1a”并且单位为“1*袋/袋”的所有商品的商品说明为“垃圾货”,本演示使用update的两种重载。

          实现,在ClassLibDemo.DAL.SQLServer项目的类ProductList增加以下代码:

    public void DeleteProduct(int iStart, int iEnd, string unit)
    {
        Condition condition = this.CreateCondition();
        List<int> values = new List<int>(2);
        values.Add(iStart);
        values.Add(iEnd);
        condition.AddElement("IDN", values, ElementType.BetWeen);
        condition.AddElement("UNIT", unit);

        this.Delete(condition);
    }

    public void UpdateProductDescription(string code, string unit,string desc)
    {
        Condition condition = this.CreateCondition();
        condition.AddElement("CODE", code, ElementType.MatchPrefix);
        condition.AddElement("UNIT", unit);

        Dictionary<string, object> values = new Dictionary<string, object>();
        values.Add("DESCRIPTION", desc);
        this.Update(values,condition);
    }        

    public void UpdateProductDescription2(string code, string unit,string desc)
    {
        Condition condition = this.CreateCondition();
        condition.AddElement("CODE", code, ElementType.MatchPrefix);
        condition.AddElement("UNIT", unit);

        ColumnCollection values = new ColumnCollection(this);
        values.AddColumn("DESCRIPTION",DbType.String,desc);
        this.Update(values,condition);
    }        

         我们在控制台演示项目中使用这些查询:

    class ConditionUpdate
    {
        /// <summary>
        /// 删除记录ID从到的记录并且单位为“*瓶/瓶”的所有商品。
        /// </summary>
        public void DemoConditionDelete()
        {
            ProductList table = new ProductList();
            table.OrmAccessor = OrmContext.OrmAccessor;
            table.DeleteProduct(100, 500, "1*瓶/瓶");

            System.Console.WriteLine("删除完成");
        }

        /// <summary>
        /// 更更新商品编码前2位为“1a”并且单位为“1*袋/袋”的所有商品的商品说明为“垃圾货”。
        /// </summary>
        public void DemoConditionUpdate()
        {
            ProductList table = new ProductList();
            table.OrmAccessor = OrmContext.OrmAccessor;
            table.UpdateProductDescription("1a", "1*袋/袋", "垃圾货");

            System.Console.WriteLine("更新完成");
        }

        /// <summary>
        /// 删更新商品编码前2位为“1a”并且单位为“1*袋/袋”的所有商品的商品说明为“垃圾货”。
        /// </summary>
        public void DemoConditionUpdate2()
        {
            ProductList table = new ProductList();
            table.OrmAccessor = OrmContext.OrmAccessor;
            table.UpdateProductDescription2("1a", "1*袋/袋", "垃圾货");

            System.Console.WriteLine("更新完成");
        }

          案例输出结果:

SQL事件探查:

         有关本例子所涉及的数据表结构请参考基于AgileEAS.NET平台基础类库进行应用开发-总体说明及数据定义一文,有关数据对象模型定义文件、文档、DDL脚本请下载:http://files.cnblogs.com/eastjade/demo.db.doc.sql.rar,本文代码下载:ORM.Demo3.rar。 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玩转JavaEE

elasticsearch API约定(一)

前面我们介绍了一些REST API的基本用法,使读者对API的使用有了一个直观的了解,本文我们来介绍下Elasticsearch中的API约定,这些约定适用于大...

24930
来自专栏晨星先生的自留地

mysql注入高级篇2--sqli lab

22630
来自专栏灯塔大数据

Python-解决Cx_Oracle查询时UnicodeDecodeError的问题

近期在项目中,要对1张100多万条记录的表进行查询,然后进行一些数据的统计,但是在这个过程中,发现只查询出来几条数据就出现了UnicodeDecodeErro...

33760
来自专栏GopherCoder

Python: 实际项目中抽象出的小项目设计Python: 一周笔记

19030
来自专栏Linux驱动

C-fopen,fwrite,fread,fseek笔记

FILE * fopen(const char * path,const char * mode);

24820
来自专栏JavaQ

细说MySQL区分字母大小写

在Linux系统上使用MySQL,MySQL是区分字母大小写的,例如建A表时表名是大写的A,修改A表时脚本里写的a,就会报错表a不存在。在MySQL中,数据库对...

37850
来自专栏IT 指南者专栏

【SSH框架】之Hibernate系列(一)

微信公众号:compassblog 欢迎关注、转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1、Hibernate框架概述 (1)、什么是Hiber...

28280
来自专栏刺客博客

PHP利用phpexcel导入Excel表到Mysql数据库

1.3K30
来自专栏鸿的学习笔记

读会搜索引擎

搜索引擎一般由索引管理器,索引检索器,索引构建器,文档管理器组成。 索引管理器,顾名思义是管理带有索引结构的数据,负责对索引的访问。那么索引是怎么管理的呢?不...

19410
来自专栏java学习

Hibernate学习笔记2

定义hbm.xml映射文件和pojo类时都需要定义主键,Hibernate中定义的主键类型包括:自然主键和代理主键:

11340

扫码关注云+社区

领取腾讯云代金券