IBatisNet1.5 -- 映射文件--Statements

  Ibatisnet的xml映射文件主要包括这几个部分,resultMaps,parameterMaps,下面分别说一下IBatisnet的映射文件中的Elements及其Attributes.
一、Statements
    简单的说,这一部分里放的是对数据库操作的SQL语句及存储过程等,它包括以下子元素:

Statement ElementAttributesChild ElementsMethods
<statement>
            id
            parameterClass
            resultClass
            listClass
            parameterMap
            resultMap
            cacheModel
All dynamic elements
Insert
            Update
            Delete
            All query methods
<insert>
            id
            parameterClass
            parameterMap
All dynamic elements
            <selectKey>
            <generate>
Insert
            Update
            Delete 
<update>
            id
            parameterClass
            parameterMap
            extends
All dynamic elements
            <generate>
Insert
            Update
            Delete
<delete>
            id
            parameterClass
            parameterMap
            extends
All dynamic elements
            <generate>
Insert
            Update
            Delete
<select>
            id
            parameterClass
            resultClass
            listClass
            parameterMap
            resultMap
            cacheModel
            extends
All dynamic elements
            <generate>
All query methods
<procedure>
            id
            parameterMap
            resultClass
            resultMap
            cacheModel
All dynamic elements 
Insert
            Update
            Delete
            All query methods

 然后说一下,这些Statement Element的Attributes
 1、id
       statement的标识,每个statement必须的attribute,还需注意的是,在所有的sqlmap中,它都是唯一的。
2、parameterMap
       parameterMap的值会按照顺序匹配statement中的sql语句中的?(占位符)。如下:

< parameterMaps >
    
< parameterMap  id ="simpleinsert"  class ="Employees" >
        
< parameter  property ="id" />
        
< parameter  property ="empcode" />
    
</ parameterMap >
</ parameterMaps >  

< statement  id ="insertEmployee"  parameterMap ="simpleinsert" >
      insert into Employees (Id, EmpCode) values (?,?);
</ statement >

上面代码中的parameterMap中我们定义了两个参数id,empcode,而在下面的statement中的insert语句的第一个?就会被id的值所取代,第二个?的值为empcode的值。当然IBatisnet中并不是这样一种参数的定义方式,另外还有两种inline,named方式。

3、parameterClass
      还是看上面的例子,如果我们没有对statement指定parameterMap,我们还可以通过指定parameterClass并使用inline parameter来完成同样的目的。如下:

< statement  id ="insertEmployee"  parameterClass ="OPS.Domain.Employees,OPS.Domain" >
      insert into Employees (Id, EmpCode) values (#Id#,#EmpCode#);
</ statement >

parameterClass也可以直接写成Employees。

< statement  id ="insertEmployee"  parameterClass ="Employees" >
      insert into Employees (Id, EmpCode) values (#Id#,#EmpCode#);
</ statement >

4、resultMap
      通过设置resultMap,我们可以控制如何从查询的结果集中提取数据。比如我们只需要结果集中的某几列就可以来设置resultMap中的result来完成。

< resultMaps >
        
< resultMap  id ="SelectResult"  class ="Employees" >
            
< result  property ="Id"  column ="id"   />
            
< result  property ="EmpCode"  column ="empcode"   />
            
< result  property ="EmpPassword"  column ="emppassword"   />
            
< result  property ="EmpName"  column ="empname"   />
            
< result  property ="EmpSex"  column ="empsex"   />
            
< result  property ="EmpAge"  column ="empage"   />
            
< result  property ="EmpMail"  column ="empmail"   />
            
< result  property ="EmpPhoneNo"  column ="empphoneno"   />
            
< result  property ="Description"  column ="description"   />
            
< result  property ="IsAdmin"  column ="isadmin"   />
            
< result  property ="IsDelete"  column ="isdelete"   />
        
</ resultMap >
</ resultMaps >

 

< statement  id ="SelectEmployees"  resultMap ="Employees" >
      select * from Employees
</ statement >

上面这个statement的查询结果就返回Employees的所有列,如果你只想返回其中几列,只需要更改resultMap就可以了。

5、resultClass
      对于控制查询结果的返回值,我们也可以通过设置resultClass来代替resultMap。指定的resultClass将自动对应到查询结果的列。

< select  id ="SelectEmployees"  parameterClass ="int"  resultClass ="Employees" >
            Select 
                  id as Id,
                  empcode as EmpCode,
                  emppassword as EmpPassword,
                  empname as EmpName,
                  empsex as EmpSex,
                  empage as EmpAge,
                  empmail as EmpMail,
                  empphoneno as EmpPhoneNo,
                  description as Description,
                  isadmin as IsAdmin,
                  isdelete as IsDelete
            From Employees
</ select >

 Employees.cs应包括Id,EmpCode,EmpPassword,EmpName,EmpSex,EmpAge,EmpMail,EmpPhoneNo,Description,IsAdmin,IsDelete这些属性。


using System;

namespace OPS.Domain
{
    
/// <summary>
    
/// Employees 
    
/// </summary>

    [Serializable]
    
public class Employees
    
{
        
public Employees()
        
{
            
        }

        
        
        
private int id;
        
///<sumary>
        
/// Id
        
///</sumary>

        public int Id
        
{
            
get{return id;}
            
set{id = value;}
        }

        
        
private string empcode;
        
///<sumary>
        
/// EmpCode
        
///</sumary>

        public string EmpCode
        
{
            
get{return empcode;}
            
set{empcode = value;}
        }

        
        
private string emppassword;
        
///<sumary>
        
/// EmpPassword
        
///</sumary>

        public string EmpPassword
        
{
            
get{return emppassword;}
            
set{emppassword = value;}
        }

        
        
private string empname;
        
///<sumary>
        
/// EmpName
        
///</sumary>

        public string EmpName
        
{
            
get{return empname;}
            
set{empname = value;}
        }

        
        
private string empsex;
        
///<sumary>
        
/// EmpSex
        
///</sumary>

        public string EmpSex
        
{
            
get{return empsex;}
            
set{empsex = value;}
        }

        
        
private int? empage;
        
///<sumary>
        
/// EmpAge
        
///</sumary>

        public int? EmpAge
        
{
            
get{return empage;}
            
set{empage = value;}
        }

        
        
private string empmail;
        
///<sumary>
        
/// EmpMail
        
///</sumary>

        public string EmpMail
        
{
            
get{return empmail;}
            
set{empmail = value;}
        }

        
        
private string empphoneno;
        
///<sumary>
        
/// EmpPhoneNo
        
///</sumary>

        public string EmpPhoneNo
        
{
            
get{return empphoneno;}
            
set{empphoneno = value;}
        }

        
        
private string description;
        
///<sumary>
        
/// Description
        
///</sumary>

        public string Description
        
{
            
get{return description;}
            
set{description = value;}
        }

        
        
private string isadmin;
        
///<sumary>
        
/// IsAdmin
        
///</sumary>

        public string IsAdmin
        
{
            
get{return isadmin;}
            
set{isadmin = value;}
        }

        
        
private string isdelete;
        
///<sumary>
        
/// IsDelete
        
///</sumary>

        public string IsDelete
        
{
            
get{return isdelete;}
            
set{isdelete = value;}
        }

    }

}

     
6、listClass
      为了提供返回IList of Objects的能力,statement中可以使用强类型的自定义集合类来做为listClass Attribute的值。这个类必须实现System.Collections.CollectionBase。当然statement还需指定resultClass,使得DataMapper知道如何在集合中处理这种类型。使用方法如下:


using System;
using System.Collections;
using System.Text;

namespace OPS.Domain
{
    
public class EmployeeCollection : CollectionBase
    
{
        
public EmployeeCollection() { }

        
public Employees this[int index]
        
{
            
get return (Employees)List[index]; }
            
set { List[index] = value; }
        }


        
public int Add(Employees value)
        
{
            
return List.Add(value);
        }


        
public void AddRange(Employees[] value)
        
{
            
for (int i = 0; i < value.Length; i++)
            
{
                Add(value[i]);
            }

        }


        
public void AddRange(EmployeeCollection value)
        
{
            
for (int i = 0; i < value.Count; i++)
            
{
                Add(value[i]);
            }

        }


        
public bool Contains(Employees value)
        
{
            
return List.Contains(value);
        }


        
public void CopyTo(Employees[] array, int index)
        
{
            List.CopyTo(array, index);
        }


        
public int IndexOf(Employees value)
        
{
            
return List.IndexOf(value);
        }


        
public void Insert(int index, Employees value)
        
{
            List.Insert(index, value);
        }


        
public void Remove(Employees value)
        
{
            List.Remove(value);
        }

    }

}

 

< select id = " SelectEmployees "  parameterClass = " int "  resultClass = " Employess "  listClass = " EmployeeCollection " >
            Select 
                  id 
as  Id,
                  empcode 
as  EmpCode,
                  emppassword 
as  EmpPassword,
                  empname 
as  EmpName,
                  empsex 
as  EmpSex,
                  empage 
as  EmpAge,
                  empmail 
as  EmpMail,
                  empphoneno 
as  EmpPhoneNo,
                  description 
as  Description,
                  isadmin 
as  IsAdmin,
                  isdelete 
as  IsDelete
            From Employees
</ select >


7、cacheModel
      如果你希望将查询结果集装入缓存,你可以通过设置statement的cacheModel来实现。首先需要配置缓存的模式,如下:

< cacheModel  id ="employee-cache"  implementation ="LRU" >
  
< flushInterval  hours ="24" />
  
< flushOnExecute  statement ="insertEmployee" />
  
< flushOnExecute  statement ="updateEmployee" />
  
< flushOnExecute  statement ="deleteEmployee" />
  
< property  name ="size"  value ="1000"   />
</ cacheModel >
关于缓存模式,后面会专门介绍。
在statement中使用缓存:
< statement  id ="selectAllEmployees"  cacheModel ="employee-cache" >
  select * from Employees
</ statement >

8、extends
      继承的属性也非常的有用,有很多SQL的操作的主题都一样,只是,Where子句不同,或Order By的内容不同等等,我们都可以将主体独立出来,作为BASE,然后写不同的条件或排序规则来继承它。如下:
     < select  id ="SelectEmployees"  parameterClass ="int"  resultMap ="SelectResult" >
            Select 
                  id,
                  empcode,
                  emppassword,
                  empname,
                  empsex,
                  empage,
                  empmail,
                  empphoneno,
                  description,
                  isadmin,
                  isdelete
            From Employees
        
</ select >

    
<!-- 员工列表 -->
    
< select  id ="EmployeeList"  parameterClass ="int"  resultMap ="SelectResult"  extends ="SelectEmployees" >
      Where isdelete='n'
    
</ select >

    
<!-- 员工明细 -->
    
< select  id ="EmployeeDetail"  parameterClass ="int"  resultMap ="SelectResult"  extends ="SelectEmployees" >
      Where id=#Id#
    
</ select >

    
<!-- 登录验证 -->
    
< select  id ="Login"  parameterClass ="int"  resultMap ="SelectResult"  extends ="SelectEmployees" >
      Where empcode=#EmpCode# and emppassword=#EmpPassword# and isdelete='n'
    
</ select >

    
<!-- 判断员工编号是否重复 -->
    
< select  id ="CheckEmpCode"  parameterClass ="String"  resultMap ="SelectResult"  extends ="SelectEmployees" >
      Where empcode=#EmpCode# and isdelete='n'
    
</ select >

 

一、Parameter Maps        
        首先来看一下ParameterMap的定义:
< parameterMap  id ="parameterMapIdentifier"  
  [class
="fullyQualifiedClassName, assembly|typeAlias" ]
  [extends
="[sqlMapNamespace.]parameterMapId" ] >
  
< parameter 
    
property  ="propertyName"  
    [column
="columnName" ]
    [direction
="Input|Output|InputOutput" ]
    [dbType
="databaseType"
    [type
="propertyCLRType" ]
    [nullValue
="nullValueReplacement"
    [size
="columnSize"
    [precision
="columnPrecision"
    [scale
="columnScale" ]  
    [typeHandler
="fullyQualifiedClassName, assembly|typeAlias" ]  
  <parameter   
/>
  
< parameter     />  
</ parameterMap >

其中只有id这个属性是必须的,其它都为可选。下面我们来看一个parameterMap在SQLMAP中的具体应用:
< parameterMap  id ="insert-employee-param"  class ="Employees" >
  
< parameter  property ="id"   />
  
< parameter  property ="empcode" />
</ parameterMap >

< statement  id ="insertEmployee"  parameterMap ="insert-employee-param" >
  insert into Employees (Id, EmpCode) values (?,?);
</ statement >

注意:我们通常在statement中使用的parameterMap都是在当前DataMap中定义的,其实我们可以引用应用程序里其它的DataMap中的parameterMap,但是前面要加上DataMap的namespace作为前缀。如:
< statement  id ="insertEmployee"  parameterMap ="otherDataMap.insert-employee-param" >
  insert into Employees (Id, EmpCode) values (?,?);
</ statement >

1、<parameterMap> attributes
      <parameterMap>包括三个属性:id(必须),class(可选),extends(可选)
      1.1、id
               是该parameterMap在当前DataMap中的唯一标识。
      1.2、class
               可以是property object或是IDictionary的实例,虽然class不是必须Attribute,但是我们最好去设置它的值,这样可以帮助我们验证传入参数的有效性并且能够优化性能。
      1.3、extends
               这个在statement中已经说过了,大概的意思都是一样的,这里不再多说,parameterMap可以继承其它DataMap中的parameterMap,继承的时候要加上DataMap的namespace。
2、<parameter> Elements
      <parameterMap>有一个或多个<parameter>的子元素,用于匹配SQL Statement中的占位符。
      2.1、property
               可以指定参数类中的一个属性,也可以是IDictionary instance中的一项的名称。它可以在SQL Statement中使用多次。
      2.2、column
               column通常用于定义存储过程中的参数名称。
      2.3、direction
               用于指定参数的类型:输出(Output)、输入(Input)、双向(InputOutput)。
      2.4、dbType
               指定参数对应于数据库的列的类型。通常情况下仅当列为nullable时需要指定dbType。另外,对于一些特殊的数据类型如DateTime,在.net中只有System.DateTime一种时间的数据类型,而数据库(MSSQL)中有DateTime,Date等,为了区分参数的类型,此时我们也需要指定dbType。
      2.5、type
               参数property在CLR中的类型。通常用于存储过程中的InputOutput和Output参数。
      2.6、nullValue
               当property的值为nullValue中设定的值的时候,就会将property的值替换为null。这个通常用于那些在程序中无法直接赋null值的数据类型,比如:int,double,float等类型。
      2.7、size
               一般用于设置property值的最大值。
      2.8、precision
               设置property值的精度。(?)
      2.9、scale
               设置property值的范围。(?)
      2.10、typeHandler
               typeHandler允许用户使用自定义的typeHandler,我们可以通过创建自定义的typeHandler来从数据库中存储或获取Boolean、Guid类型的数据。关于自定义typeHandler,将在后面的文章中专门介绍。

二、Inline Parameter Maps
        如果使用Inline Parameter(内置参数)来代替parameterMap,我们需要为它添加额外的类别信息。InlineParameter的语法允许你在有参数的sql statement中嵌入参数的property name,property type,column type和null value replacement。下面我们来一一示例:
1、 A <statement> using inline parameters
      
< statement  id ="insertEmployee"  parameterClass ="Employees" >
  insert into Employees(Id,EmpCode)
  values (#id#, #empcode#)
</ statement >

2、 A <statement> using an inline parameter map with a type
< statement  id ="insertEmployee"  parameterClass ="Employees" >
  insert into Employees(Id,EmpCode)
  values (#id:int#, #empcode:varchar#)
</ statement >

3、 A <statement> using an inline parameter map with a null value replacement
< statement  id ="insertEmployee"  parameterClass ="Employees" >
  insert into Employees(Id,EmpCode)
  values (#id:int:-99999#, #empcode:varchar#)
</ statement >

4、 A <statement> using alternate inline syntax with property, type, dbType, and null value replacement
< update  id ="UpdateEmployee"  parameterClass ="Employees" >
      update Employees set
      empcode=#EmpCode#,
      empname=#EmpName#,
      email = #Email,type=string,dbType=Varchar,nullValue=no_email@provided.com#
      where id = #Id#
</ update >

使用InlineParameter需注意几点:
      不能单独设置null value replacement,必须和dbType同时使用。
      对于既是参数又在resultMap中的null value,必须在resultMap中指定数据库列的null value replacement.
      对于有大量类型描述符或null value replacement的复杂查询,建议采用parameterMap.

三、Standard Type Parameters
      在实际的应用中,存在很多只带一个Int或是String型的参数的statement,这时候我们可以直接用standard library object(int ,string,etc)来作为Statement的参数,而不需要另外指定其它的object。如下:
A <statement> using standard type parameters
< update  id ="DeleteEmployee"  parameterClass ="int" >
      Update Employees Set
        isdelete = 'y'
      Where id=#value#
</ update >

四、Map or IDictionary Type Parameters
      我们还可以使用System.Collection.IDictionary的实例来作为Statement的参数类,最常用的也就是Hashtable了,如下:
< update  id ="ChangePassword"  parameterClass ="Hashtable" >
      Update Employees
      Set password=#Password#
      Where id=#Id#
</ update >
注意:在我们传入的hashtable中必须包括名为Password和Id的两个键,其值的类型必须匹配它们对应的数据库列的类型,否则将会出错。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值