在上次的文章中简单介绍了 Reface.NPI 中的功能。

本期,将对这方法名称解析规则进行详细的解释和说明,

以便开发者可以完整的使用 Reface.NPI 中的各种功能。


基本规则

  • 方法名称以 Insert , Delete , Select , Update 开头
  • 方法名以数个单词构成,关键字、字段、操作符、参数名都是一个单词
  • 每个单词以大写开头,其余全小写
    • UserName 会被认作两个单词
    • Username 会被认作一个单词
  • 使用入参填充 Sql参数 时,不计大小写,你可以用 id 填充 @Id 的值

1 Insert 规则

仅使用 Insert 将使用实体中的所有字段的值写入。

void Insert(Entity entity);

开发者也可以通过 Without 关键字排除一些字段的写入,特别是那些依赖数据库本身的字段。

下面的例子不会对 IdCreateTime 字段写入

bool InsertWithoutIdCreatetime(User user);

2 Delete 规则

Delete 方法名包含一个 条件规则

条件规则 允许开发者定义一个 where 子语。

2.1 使用 By 声明一个 条件规则

要在方法名中声明一个条件,必须以 By 作为开始。

下面的方法,将会生成 where Id = @Id , 并以入参的 id 作为 @Id 的值。

void DeleteById(int id);

2.2 使用 AndOr 合并多个条件

你也可以使用 AndOr 合并多个条件

下面两个方法将会生成 where Id = @Id and/or Name = @Name 并以入参的 idname 分别作用 @Id@Name 的值。

bool DeleteByIdAndName(int id, string name)

bool DeleteByIdOrName(int id, string name)

注意

  • 因为没有想到一个好的方法可以对条件进行分组,所以目前不可以声明条件组,形如 where ( Id = @Id and Name = @Name ) or ( State = @State and Loginname = @Loginname )

如果您有好的想法,您也可以告诉我,共同完善 Library 。非常期待您的分享,感谢!

2.3 更多的操作符

很明显,我们不可能总是用 = 作为条件的判断操作,

我们还有 大于,小于,Like等等。

你可以在字段名后面加上操作符来实现此功能。

下面的例子会生成 where Name Like @Name 的条件。

int DeleteByNameLike(string name)

目前系统中支持的操作符有

Sql Method
= Is , Equal , Equals
> Greaterthan , Gt
>= Greaterthanandequals , Gteq
< Lessthan , Lt
<= Lessthanandequals , Lteq
Like Like , Likes
In In

2.4 自定义参数名

在上面的例子中,参数名直接与字段名相同。

我们也可以在操作符后加上参数名来改名这个默认的参数名。

下面的例子会生成 where Password Like @Badpassworda Or Password Like @Badpasswordb

int DeleteByPasswordLikeBadpasswordaOrPasswordLikeBadpasswordb(string badPasswordA, string badPasswordB);

3 Update 规则

Update 规则由两个部分组成

  • 条件规则 ( 与 Delete 规则相同)
  • Set 规则

Set 规则

3.1 指定 set 的字段

Update 关键字后接的部分,一直到 By 之前,都是 Set 的字段。

下面的例子会生成 set Password = @Password where Id = @Id

void UpdatePasswordById(int id, string password);

3.2 多个 set

你可以用 And 连接多个 set

下面的例子会生成 set Password = @Password , Changingtime = @Changingtime where Id = @Id

bool UpdatePasswordAndChangingtimeById(int id, string password, DateTime changingTime);

3.3 自定义 set 参数

条件规则 一样,生成的语句中,会默认使用字段名作为参数名。

你也可以在字段后添加 Equals 再加上 参数名称 来自定义参数名。

下面的例子会生成 set Count = @Newcount where Id = @Id And Count = @Oldcount

int UpdateCountEqualsNewcountByIdAndCountIsOldcount(int id, int oldCount, int newCount);

3.4 不指定 set 子句

当没有 set 子句的时候,

会以排除了 By 子句的条件后的所有字段作为 set 子句。

下面的例子会生成 update [user] set name = ?, password = ? where id = ?

// User : Id, Name, Password
int UpdateById(int id, User user);

若表中还有一些字段在 Update 时即不是条件,也不打算更新。可以使用 Without 关键字指定。

下面的例子中,User 包含四个属性

  • Id
  • Name
  • Password
  • CreateTime
// 下面的语句不会对 CreateTime 进行更新
void UpdateWithoutCreatetimeById(int id, User user);

4 Select 规则

Select规则 包含以下三个规则

  • 条件规则 ( 与 DeleteUpdate 相同 )
  • 输出字段规则
  • 排序规则
  • 分页查询

4.1 输出字段

这个规则比较简单,

只要把字段列在 Select 后即可,

多个字段可以用 And 连接。

输出字段是可选的,你可以跳过这个部分直接编写条件。

IList<Entity> SelectIdAndNameAndCreatetime();

4.2 条件规则

UpdateDelete 一样,使用 By 关键字开始条件子句

User SelectById(int id);

4.3 排序规则

4.3.1 Orderby 子句

排序规则是由关键字 Orderby 开头的 ( 除了 O 都是 小写 )。

下面的例子会生成 ORDER BY Id Asc / Desc

IList<Entity> SelectOrderbyId();
IList<Eneity> SelectOrderbyIdDesc();

4.3.2 多个排序

多个排序不需要使用 And 连接,直接拼接即可。

IList<User> SelectOrderbyUsernameCreatetime();

4.3.3 分页查询

Select 方法前加上 Paging 就可以使用分页查询功能。

注意

  • 使用分页查询时,必须提供类型为 Paging 的参数。
IList<Order> PagingSelectByCreatetimeGt(DateTime createTime);

使用基于 Reface.AppStarter 开发的 Reface.AppStarter.NPI 你可以不避手动创建代理类,

只需要通过构造函数注入那些实现了 NPI 的接口,就可以直接对数据库进行增删改查的操作了。

在后面的文章中,会介绍 Reface.AppStarter.NPI 的功能和使用方法。


相关链接

关注公众平台【清水潭】,可以查阅更多资料

Reface.NPI 方法名称解析规则详解的更多相关文章

  1. SVN权限解析规则详解(转)

    首先创建一个版本库后,会生成最初的目录结构和基本的配置文件,本文主要分析“authz”文件的内容:我们先抛开alias和groups不谈,将重点放在路径的权限配置上. 一. 权限格式 svn权限的基本 ...

  2. 深入解析ThreadLocal 详解、实现原理、使用场景方法以及内存泄漏防范 多线程中篇(十七)

    简介 从名称看,ThreadLocal 也就是thread和local的组合,也就是一个thread有一个local的变量副本 ThreadLocal提供了线程的本地副本,也就是说每个线程将会拥有一个 ...

  3. 53个Oracle语句优化规则详解(转)

    Oracle sql 性能优化调整  1. 选用适合的ORACLE优化器        ORACLE的优化器共有3种:a. RULE (基于规则)   b. COST (基于成本) c. CHOOSE ...

  4. Nginx 常用全局变量 及Rewrite规则详解

    每次都很容易忘记Nginx的变量,下面列出来了一些常用 $remote_addr //获取客户端ip $binary_remote_addr //客户端ip(二进制) $remote_port //客 ...

  5. ESLint 规则详解(二)

    接上篇 ESLint 规则详解(一) 前端界大神 Nicholas C. Zakas 在 2013 年开发的 ESLint,极大地方便了大家对 Javascript 代码进行代码规范检查.这个工具包含 ...

  6. Apache Rewrite 规则详解

    在开篇之前: 我想说这篇文章其实是我刚刚接触Rewrite的时候学习的文档,应属转载,但是在这里我不想写明原地址,原因是文章中大多数给出的配置命令经实验都是错误的.需要原文的可以在谷歌上搜索一下&qu ...

  7. JavaEE实战——XML文档DOM、SAX、STAX解析方式详解

    原 JavaEE实战--XML文档DOM.SAX.STAX解析方式详解 2016年06月22日 23:10:35 李春春_ 阅读数:3445 标签: DOMSAXSTAXJAXPXML Pull 更多 ...

  8. PHP 面向对象编程和设计模式 (5/5) - PHP 命名空间的使用及名称解析规则

    PHP高级程序设计 学习笔记 2014.06.12 命名空间概述 PHP 在 5.3.0 以后的版本开始支持命名空间.什么是命名空间?从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这 ...

  9. QuantLib 金融计算——基本组件之天数计算规则详解

    目录 天数计算规则详解 定义 30 / 360 法 30/360 US 30/360 Bond Basis 30E/360 30E/360 ISDA Actual 法 Actual/Actual IC ...

随机推荐

  1. 登录页面判断session退出登录清空session

    1 2 3 4 5 6 if(empty($_POST)){      $_SESSION = array();     if(isset($_COOKIE[session_name()])){    ...

  2. Excel之在单元格中生成随机密码

    公式 =CHAR(INT(RAND()*26+97))&INT(RAND()*10)&CHAR(INT(RAND()*26+97))&INT(RAND()*10) 分析 CHA ...

  3. 基于Linux Lite 4.8制作“Windows 12 Lite”正式发布

    值得注意的是,这款Windows 12 Lite的宣传标语将矛头直指Windows 10,声称不会迫使用户更新.不会存在病毒或恶意软件.启动速度比Win 10快3倍.提供8万多款优质软件.允许与Win ...

  4. php实现下载功能

    <?php header("Content-type:text/html;charset=utf-8"); $file_name="1.text"; // ...

  5. juery 实现选项卡

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. Java基础(五):数组

    数组,一种应用非常广泛的数据结构,简单地来说就是一组类型相同且无序的元素的存储在固定长度且有序的内存空间. 创建一个数组 在Java中,我们可以通过[]去声明一个指定类型的数组 int[] a; // ...

  7. Flask 请求中间件、错误处理、标签、过滤器、CBV

    目录 一.请求中间件 二.请求中间件额外方法(重写源码) 三.请求错误处理 四.请求标签.过滤器 五.CBV写法 基础版 常用版 一.请求中间件 中间件: 1 before_first_request ...

  8. ipadmini从9.3.5降级8.4.1并完美越狱

    ipadmini之前是iOS9.3.5实在是卡的用不了,于是打算降级,但是尝试了包括改版本描述等很多方法一直失败.今天突然成功降级8.4.1并且完美越狱,运行流畅了非常多.赶紧发个教程,回馈一下网友. ...

  9. 基于 HTML5 WebGL 与 GIS 的智慧机场大数据可视化分析【转载】

    前言:大数据,人工智能,工业物联网,5G 已经或者正在潜移默化地改变着我们的生活.在信息技术快速发展的时代,谁能抓住数据的核心,利用有效的方法对数据做数据挖掘和数据分析,从数据中发现趋势,谁就能做到精 ...

  10. 嘉泽 P2120: 【基础】半质数 题解

    原题链接 简要题意: 求区间内能分解为两个质数乘积的数. 欧拉筛先筛素数. 然后再筛答案. 时间复杂度: \(O(n)\). 实际得分:\(100pts\). #pragma GCC optimize ...