zoukankan      html  css  js  c++  java
  • mybatis.net 4 ISqlMapper 传递参数

    在使用 mybatis.net 的时候,必然会涉及到命令参数问题。

    1. 没有参数的 SQL

    最为简单的就是没有参数的命令了。比如下面查询所有的产品,没有使用任何参数。

    <select id="GetAllProducts"  resultMap="GetAllProductsResult">
      <![CDATA[
      SELECT productid, productname FROM [Production].Products
      ]]>
    </select>

    那么,在代码中可以直接传递一个 null,表示没有参数。

    public IList<EntityModel.Product> GetProductList()
    {
        IList<EntityModel.Product> productList
            = Mapper.QueryForList<EntityModel.Product>("GetAllProducts", null);
    return productList; }

    2. 只有一个参数的 SQL

    如果你的语句只有一个参数,例如,通过产品的 Id 查询特定的产品信息。这里使用的 SQL 语句定义如下。

    <!-- 如果使用 resultClass,主要注意返回字段名称的大小写也需要与类中定义的属性匹配 -->
    <select id="GetProductById" parameterClass="int"  resultClass="Product" >
      <![CDATA[
        select ProductId , ProductName from [Production].Products where productid = #value#
      ]]>
    </select>

    此时,唯一的参数可以使用 #value# 表示,我们就不用挖空心思专门为它起一个名字了。

    在代码中,直接传递对应的参数即可,这个唯一的参数就对应 SQL 中定义的 #value# 。

    public EntityModel.Product GetProductById(int id)
    {
        EntityModel.Product product
            = Mapper.QueryForObject<EntityModel.Product>("GetProductById", id);
    return product; }

    在上面的例子中,id 的值就传递给了 #value# 。

    3. 多个参数问题

    多个参数的话,就会涉及到区分参数的问题了。我们通常使用名值对来表示参数。

    又有两种方式,一种使用对象的属性方式,一种使用字典方式。

    先看我们熟悉的对象方式。可以定义一个表示参数的对象,对象的属性名称分别表示各个参数的名称,对象的值就表示参数的值。

    namespace EntityModel
    {
        public class Shipper
        {
            public int ShipperId { set; get; }
            public string ComapanyName { set; get; }
            public string Phone { set; get; }
        }
    }

    然后,需要在映射文件中定义需要使用的类型。

    <alias>
      <typeAlias alias="Shipper" type="EntityModel.Shipper, EntityModel"/>
    </alias>

    随后,用在 SQL 语句中。注意每个参数使用 #参数名# 进行表示,这里的名称来自类中定义的属性名称,因此,一定要注意字母的大小写问题。

    insert 元素的 parameterClass 表示使用实体类来表示参数,这里的 Shipper 来自刚刚定义的类型别名。

    <statements>
      <insert id="insertShipperByModel" parameterClass="Shipper" >
        <selectKey property="ShipperId" type="post" resultClass="int">
          ${selectKey}
        </selectKey>
        <![CDATA[
          insert into Sales.Shippers ( companyname, phone) values ( #ComapanyName#, #Phone# );
        ]]>
      </insert>
    </statements>

    语句开始中的 selectKey 用来在执行插入语句之后,获取刚刚生成的标识值。这里使用到的 selectKey 定义在 SqlMap.config 的属性中。

      <properties>
        <property key="selectKey" value="select @@IDENTITY as value" /> 

    好了,最后,我们可以在代码中使用实体来传递参数了。数据访问对象中的插入方法如下所示。

    public int InsertShipper(EntityModel.Shipper model)
    {
        int result = (int) this.Mapper.Insert("insertShipperByModel", model);
        return result;
    }

    第二种方式,需要使用字典来完成。

    我们将所有的参数都定义为字典中的键值对。这里使用了字典的接口 IDictionary,注意键使用 string 类型来表示参数的名称,而值使用了 object 类型。

    public int InsertShipper(string companyName, string phone)
    {
        IDictionary<string, object> parameter
            = new Dictionary<string, object>();
        parameter.Add("comapanyname", companyName);
        parameter.Add("phone", phone);
    
        int id = (int) this.Mapper.Insert("insertShipperByParameter", parameter);
        return id;
    }

    在映射文件中,需要将 parameterClass 设置为字典接口  System.Collections.IDictionary。而 SQL 语句中则使用字典中的键值。还是要注意大小写问题。这里同样也是区分大小写的。

    <insert id="insertShipperByParameter" parameterClass="System.Collections.IDictionary">
      <selectKey property="ShipperId" type="post" resultClass="int">
        ${selectKey}
      </selectKey>
      <![CDATA[
        insert into Sales.Shippers ( companyname, phone) values ( #comapanyname#, #phone# );
      ]]>
    </insert>

    4. 生成的标识列问题

    在 mybatis.net 中使用 select @@IDENTITY as value 来获取刚刚生成的标识列,你可能更想使用 select scope_identity()  来获取。直接使用是不行的。

    可以在映射文件中,将插入语句定义为一个普通的查询语句,如下所示:

    <select id="insertShipperByParameter" parameterClass="System.Collections.IDictionary">
      <![CDATA[
        insert into Sales.Shippers ( companyname, phone) values ( #comapanyname#, #phone# );
        select cast( scope_identity()  as int) value
      ]]>
    </select>

    这里还使用了 cast 将 scope_identity() 转化为整数,因为这个函数的类型实际上是 numbric ,并不是真正的整数类型。

    在数据访问对象中,则使用普通的查询来调用这个 SQL 语句。

    public int InsertShipper(string companyName, string phone)
    {
        IDictionary<string, object> parameter
            = new Dictionary<string, object>();
        parameter.Add("comapanyname", companyName);
        parameter.Add("phone", phone);
    
        int id = this.Mapper.QueryForObject<int>("insertShipperByParameter", parameter);
        return id;
    }

    这样,就可以直接获取生成的标识。

  • 相关阅读:
    分享 35 套精美的 PSD 图标素材
    策略模式
    步步为营 .NET三层架构解析 二、数据库设计
    TFS安装与管理
    MMN实用架构过程概览
    Mvc学习
    三层架构[转]
    left join 和 left outer join 的区别
    300万条记录 like 和 charindex 函数性能比较
    jQuery插件InputLimitor实现文本框输入限制字数统计
  • 原文地址:https://www.cnblogs.com/haogj/p/3001528.html
Copyright © 2011-2022 走看看