代码小目,怎么着给内定路由安顿计算机

By admin in 4858.com on 2019年5月2日

标签: 代码片段 平常记录

MyBatis之动态sql

2017/09/30

我们须求精通的是,使用mybatis入眼是对sql的利落解析和拍卖。在本来的UserMappser.xml中,大家那样查询表中满足条件的记录
:

4858.com 1

上述语句在表中查询满足username规范的笔录,这样写查询语句有贰个害处,正是该语句只好通过username查询数据库。当我们在多规格中询问时,如若无需username条件而是需求任何三个查询条件时,那UserMapper.xml文件中的那几个查询条件就没用了。

要求:将自定义查询条件查询用户列表和询问用户列表总记录数改为动态sql。须求动用if标签和where标签。

开卷导航

翻阅导航


1.if和where

应用if标签和where标签在UserMapper.xml中增多如下内容:
修改自定义查询条件查询用户列表代码:

4858.com 2

代码小目,怎么着给内定路由安顿计算机。修改自定义查询条件查询用户列表总记录数代码:

4858.com 3

发现<where><if>在上述三个查询语句中重新的代码现身了两遍,那这里大家是还是不是能够把一样的sql片段拿出去单独写在三个sql片段中然后再在差别的查询语句中使用呢?答案是确定的,看下边包车型大巴sql片段。

问题

问题

经常记录的代码片段

2.sql片段

由此sql片段能够将通用的sql语句收收取来,单独定义,在任何的statement中得以引用sql片段。当中通用的sql语句,一般用在:where条件、查询列。

焚薮而田方案

化解方案

一.应用Paralle进行互动总括累加求和的不如情势

public static int ParallelSum(IEnumerable<int> values)
{
    object mutex = new object();
    int result = 0;

    Parallel.ForEach(
        source: values,
        localInit: () => 0, 
        body: (item, state, localValue) => localValue + item,
        localFinally: localValue =>
        {
            lock (mutex)
                result += localValue;
        });

    return result;
}

public static int ParallelSum(IEnumerable<int> values)
{
    return values.AsParallel().Sum();
}

public static int ParallelSum(IEnumerable<int> values)
{
    return values.AsParallel()
        .Aggregate(
        seed: 0, 
        func: (sum, item) => sum + item
        );
}

2.1定义sql片段

在UserMapper.xml中添加<sql>标签代表sql片段:

4858.com 4

诸如此类就变成了sql片段的定义,然后才能应用sql片段。

工作原理

做事原理

二. 值对象的1种完成方式

public abstract class ValueObject<T> : IEquatable<T>
    where T : ValueObject<T>
  {
    public virtual bool Equals(T other)
    {
      if (other == null)
        return false;

      var t = GetType();
      var otherType = other.GetType();

      if (t != otherType)
        return false;

      var fields = t.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);

      foreach (var field in fields)
      {
        var value1 = field.GetValue(other);
        var value2 = field.GetValue(this);

        if (value1 == null)
        {
          if (value2 != null)
            return false;
        }
        else if (!value1.Equals(value2))
          return false;
      }

      return true;
    }

    public override bool Equals(object obj)
    {
      if (obj == null)
        return false;

      var other = obj as T;

      return Equals(other);
    }

    public override int GetHashCode()
    {
      var fields = GetFields();

      var startValue = 17;
      var multiplier = 59;

      var hashCode = startValue;

      foreach (var field in fields)
      {
        var value = field.GetValue(this);

        if (value != null)
          hashCode = hashCode*multiplier + value.GetHashCode();
      }

      return hashCode;
    }

    private IEnumerable<FieldInfo> GetFields()
    {
      var t = GetType();

      var fields = new List<FieldInfo>();

      while (t != typeof (object))
      {
        fields.AddRange(t.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public));

        t = t.BaseType;
      }

      return fields;
    }

    public static bool operator ==(ValueObject<T> x, ValueObject<T> y)
    {
      return x.Equals(y);
    }

    public static bool operator !=(ValueObject<T> x, ValueObject<T> y)
    {
      return !(x == y);
    }
  }

2.2使用sql片段

使用<include>标签对地方定义的sql片段加以引用:

4858.com 5

4858.com 6

测试类代码不改变,那样大家便不假考虑了对sql片段的引用。

偶尔大家盼望查询语句是如此select id,username,birthday from user where username like '%codingXiaxw%' and id
in (1,2)
,那大家又应该在sql片段中怎么着增添代码呢?那时候须要选择<foreach>标签。

代码演示

代码演示

3.ChangeTrackerHelpers

public static class ChangeTrackerHelpers
    {
    public static void ConvertStateOfNode(EntityEntryGraphNode node) {
      IObjectWithState entity = (IObjectWithState)node.Entry.Entity;
      node.Entry.State = ConvertToEFState(entity.State);
    }
    private static EntityState ConvertToEFState(ObjectState objectState) {
      EntityState efState = EntityState.Unchanged;
      switch (objectState) {
        case ObjectState.Added:
          efState = EntityState.Added;
          break;
        case ObjectState.Modified:
          efState = EntityState.Modified;
          break;
        case ObjectState.Deleted:
          efState = EntityState.Deleted;
          break;
        case ObjectState.Unchanged:
          efState = EntityState.Unchanged;
          break;
      }
      return efState;
    }
  }

3.foreach标签

在statement通过foreach遍历parameterType中的集合类型。首先大家须求在UserQueryVo中定义Listids属性:

4858.com 7

并累加相应的get和set方法。

然后大家在UserMapper.xml中央银行使foreach修改where语句,使用foreache遍历list:

4858.com 8

各属性表明见代码注释,然后是测试代码:

4858.com 9

因此那伍篇小说,大家便产生了MyBatis学习的基础知识。

 

 

4. 推荐介绍使用查询语法而不是循环

        public static IEnumerable<Tuple<int, int>> ProductIndices()
        {
            for (var i = 0; i < x; i++)
            for (var j = 0; j < y; j++)
                if (x + y < 100)
                    yield return Tuple.Create(x, y);
        }

        /// <summary>
        ///     推荐使用查询语法而不是循环
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<Tuple<int, int>> ProductIndicesV2()
        {
            return from item1 in Enumerable.Range(0, x)
                from item2 in Enumerable.Range(0, y)
                where item1 + item2 < 100
                select Tuple.Create(item1, item2);
        }

问题

万一仅仅针对钦定的路由举办一些特定的音信管理,而不是采纳于全部路由,大家相应如何做吗?

 

问题

若是单单针对钦赐的路由进行一些特定的新闻管理,而不是利用于全体路由,大家应有咋做吧?

 

化解方案

ASP.NET WEB API
的大队人马成效都内建了音讯管理器。他们确实的威力是为音讯的全局处理以及为全局的应用程序业务管理提供比较轻便的管理机制。不过,在某部分风貌下的需倘诺,使用新闻管理器处理应用程序内定部分的一定行为。

 

我们要依据每一个路由配置音讯处理器(DelegatingHandler),而不是在
HttpConfiguration 中注册全局的。在 HttpRouteCollectionExtension
中有2个重载的 MapHttpRoute 方法 ,他是足以成功。

public static IHttpRoute(this HttpRouteCollection routes,string name,string routeTemplate,object defaults,object contraints,HttpMessageHandler handler)

 

*注意** 只可以在聚集式路由中使用,而无法在属性路由中应用。*

 

减轻方案

ASP.NET WEB API
的浩大功力都内建了消息管理器。他们真的的威力是为音讯的全局管理以及为大局的应用程序业务管理提供相比较轻便的拍卖体制。可是,在某部分现象下的急需是,使用音信处理器处理应用程序钦命部分的特定行为。

 

大家要依附每种路由配置音讯处理器(DelegatingHandler),而不是在
HttpConfiguration 中登记全局的。在 HttpRouteCollectionExtension
中有三个重载的 MapHttpRoute 方法 ,他是足以做到。

public static IHttpRoute(this HttpRouteCollection routes,string name,string routeTemplate,object defaults,object contraints,HttpMessageHandler handler)

 

*注意4858.com,** 只可以在聚集式路由中采纳,而无法在属性路由中采纳。*

 

做事原理

在 Web API
管道中,基于路由的讯息管理器是在全局消息管理器之后,HttpControllerDispatcher
此前实行。3个号称 HttpRouteDispatcher
的服务来担负鉴定分别给定路由是或不是内定了音信管理器。假若是的话,请求将交由Computer管理,不然,继续管理,匹配Controller。

 

内定路由计算机须要钦点 InnerHandler
来继续管理音信。大家务必增多三个内定路由微机,或然,将请求交还给
HttpControllerDispatcher,如代码片段 三-2二所示。使用这几个手艺,只要在结尾增多HttpControllerDispatcher,在路由上能够有许多计算机,即便最后不加多HttpControllerDispatcher 的话,就呼吁不到此外 Controller。

 

代码片段 三-2二.行使钦定路由计算机

 

以此能够给开荒者提供看不完随声附和的东西,尤其是,基于地方认证相关的气象,只要在急需身份注明的路由中扩张安全有关的管理器。

 

做事规律

在 Web API
管道中,基于路由的消息管理器是在大局音信管理器之后,HttpControllerDispatcher
在此以前施行。2个称作 HttpRouteDispatcher
的劳动来担当鉴定区别给定路由是还是不是内定了音讯管理器。如若是的话,请求将交由微型Computer管理,不然,继续管理,相称Controller。

 

钦点路由电脑须要钦赐 InnerHandler
来继续管理音讯。我们必须增加一个点名路由微型Computer,大概,将呼吁交还给
HttpControllerDispatcher,如代码片段 三-22所示。使用那个技巧,只要在终极加多HttpControllerDispatcher,在路由上能够有众多处理器,假诺最后不增多HttpControllerDispatcher 的话,就请求不到其余 Controller。

 

代码片段 三-2二.运用内定路由Computer

 

以此能够给开拓者提供许多世故的事物,特别是,基于地点验证相关的气象,只要在要求身份认证的路由中扩充安全相关的管理器。

 

代码演示

记录路由 /api/[sometink] 的日记,而不需求记录
/api/public/[something]
的。那么,我们须求新闻管理器应用在钦赐的路由上,而不是在大局上拍卖全部的请求。

 

先是,我们做二个简易的 API 请求日志记录管理器,如代码片段 3-二三 所示。

代码片段 3-二三. 日记新闻管理器,仅仅作用在钦点的路由上。

 

在此地,我们从未供给深究 Request/Response
日志的骨子里贯彻方式。为了产生代码演示,我们只要将日志记录到内部存款和储蓄器中就足以。我们最首要的关怀点是在Computer功用在钦定路由的建制。需求留意的是,要传
ASP.NET WEB API HttpConfiguration 对象给电脑。如代码片段 3-贰四 所示。

 

代码片段 叁-2肆. 常规路由的登记与有计算机的注册

 

假如应用程序运行以来,效果应该如下

  • 所有 /api/public/[something] 相关的呼吁不会被记录 Request/Response
    的日志。
  • 所有 /api/[something] 相关的恳求会被记录 Request/Response
    的日志,这主假设因为,上边的安顿只是对如此的路由增加了微型计算机。

 

代码演示

记录路由 /api/[sometink] 的日记,而不需求记录
/api/public/[something]
的。那么,大家须要音信管理器应用在钦定的路由上,而不是在大局上拍卖全部的伸手。

 

先是,我们做1个差不离的 API 请求日志记录管理器,如代码片段 三-23 所示。

代码片段 3-二叁. 日记音信管理器,仅仅效率在钦命的路由上。

 

在这边,我们尚无须要深究 Request/Response
日志的其实贯彻方式。为了形成代码演示,大家只要将日志记录到内部存款和储蓄器中就足以。我们首要的关切点是在Computer功用在钦赐路由的建制。供给留意的是,要传
ASP.NET WEB API HttpConfiguration 对象给计算机。如代码片段 三-24 所示。

 

代码片段 三-二四. 常规路由的挂号与有Computer的登记

 

万一应用程序运行以来,效果应该如下

  • 所有 /api/public/[something] 相关的央浼不会被记录 Request/Response
    的日志。
  • 所有 /api/[something] 相关的请求会被记录 Request/Response
    的日志,那第二是因为,上边的布局只是对这么的路由增添了微型Computer。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有