• iBatis 基础知识


    1.       VS集成(智能感应)

    每一个配置文件(SqlMap.configSQL 映射文件,providers.config)都与一个XML Schema文件关联。这种关联的好处在于,可以对文档进行验证(在运行时完成),使用编辑器的特性如智能感知/内容自动完成。

    要在VS.NETXML编辑器中的Schema和我们的配置文件之间建立关联,应该将Schema文件(SqlMap.xsdSqlMapConfig.xsdproviders.xsd)添加到VS.NET项目或者VS.NET安装目录。显然第二种选择会让我们一劳永逸。VS.NET安装目录可能是:

    C:\Program Files\Microsoft Visual Studio 8\Xml\SchemasVS.NET 2005

    C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Packages\schemas\xmlVS.NET 2003

    C:\Program Files\Microsoft Visual Studio .NET\Common7\Packages\schemas\xmlVS.NET 2002)。

    Schema文件注册到VS.NET后,我们就可以在VS.NET中享用智能感知和配置文档验证了。

    2.        三个配置文件说明

    (1)           SqlMap.config

     (名字一般遵循约定,可以使用其他名称)

     

    <?xml version="1.0" encoding="utf-8"?> 
    <sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper"
     
    xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance" >

     

     

      <properties >

    <property  resource="properties.config"/>   //标准的属性文件

    <property  resource="properties.config"/>

    <property  resource="properties.config"/>

     <property key="host.config" key="ibatis.com" />

    </properties>

     <settings>
        
    <setting useStatementNamespaces="false"/>
        
    <setting cacheModelsEnabled="true"/>
        
    <setting validateSqlMap="false"/>
       
    </settings>

     

     <providers embedded="resources.providers.config, IBatisNet.Test"/>

     

    <database>

    // 连接SQL Server
        
    <provider name="sqlServer1.1"/>
        
    <dataSource name="NPetshop" 
                    connectionString
    ="data source=(local)\NetSDK;database=${database};
           user id=${username};password=${password};"/>

        

    //连接Oracle

      <provider name="oracleClient1.0"/>
       
    <dataSource name="iBatisNet" 
           connectionString
    ="Data Source=${datasource};User Id=${userid};Password=${password}"/>

     

     </database>

     

     

     

      <typeHandlers>
        
    <typeHandler type="bool" dbType="Varchar" callback="YesNoBool"/>
      
    </typeHandlers>

     

      <sqlMaps>
        
    <sqlMap resource="${root}Maps/Account.xml"/>
        
    <sqlMap resource="${root}Maps/Category.xml"/>
        
    <sqlMap resource="${root}Maps/Product.xml"/>
      
    </sqlMaps> 
    </sqlMapConfig>

     

     

    节点说明:

    <properties>元素  

    可以同时指定几个不同属性文件,或者使用<property>元素直接向SqlMap.config文件添加键值对

     <property key="host.config" key="ibatis.com" />

    配置文件中的同一个值会出现在多处。通常情况下,我们将程序在服务器间迁移时,某些配置选项的值要进行修改。为了更好地管理这些配置选项的值,我们可指定一个标准的属性文件(含有name=value对),将DataMapper的部分配置转移到其中。在属性文件中的值将成为shell变量,可以在DataMapper配置文件和Data Map定义文件中使用。例如,如果属性文件中包含了

    <?xml version="1.0" encoding="utf-8" ?>    
    <settings>

        
    <add key="UserId" value="sa" />
    </settings

    那么在DataMapper配置文件(SqlMap.config)中的任何元素都可以使用变量${UserId}来插入值sa

     

    特性说明:

     

    resource

    指定要从应用程序根目录加载的属性文件。

    <properties resource="properties.config" />

    url

    指定属性文件的绝对路径

    <properties url="c:\Web\MyApp\Resources\properties.config" />
    -or-
    <properties url=
    file:///c:/Web/MyApp/Resources/properties.config />

    embedded

    指定要从程序集的资源中加载的属性文件。该特性的语法为’[extendednamespace.]filename, assemblyName’

     

    key

    定义一个属性键(变量)名

    Key="username"

     

     

     

    <providers>元素

    iBATISDataMapper发行包包含了一个标准的providers.config,其中一共有13Provider元素

     

    如果您使用的是SQL Server 2005,那么可以打开MARSMultiple Active Result Set)选项,即设置allowMARS=”true”,并在连接字符串中添加MultipleActiveResultSets=true

    providers.config文件位于DataMapper发行包的根目录。

    检查enable 特性值

     

     

    resource

    指定providers.config文件相对于应用程序根目录的相对路径。因为根目录因项目类型而有所不同,因此最好使用属性文件来表示相对路径。

    resource=”${root}providers.config”

    url

    指定providers.config文件的绝对路径

    url="c:\Web\MyApp\Resources\ providers.config" />

    -or-

    url=file:///c:/Web/MyApp/Resources/providers.config />

    embedded

    指定要从程序集的资源中加载的providers.config文件。该特性的语法为’[extendednamespace.]filename, assemblyName’

    embedded=”Resources.providers.config, MyApp.Data”

     

     

    <settings>元素

    <settings>元素中我们可以配置这些选项,对相应的DataMapper实例进行优化。每一个<settings>特性都有一个默认值,因此,您可以省略其中的特性甚至是整个<settings>元素。<settings>的特性值及其含义为:

     

    cacheModelsEnabled

    该选项在全局范围内启用或禁用一个DataMapper实例的所有Cache Model。这在调试时可能会很方便。

    ExamplecacheModelsEnabled=true

    默认值 true(启用)

    useStatementNamespaces

    如果启用该选项,那么在引用映射语句时必须总是使用完全限定的名称,即Sql Map的命名空间和语句的id。如queryForObject(“Namespace.statementId”)

    ExampleuseStatementNamespaces=false

    默认值 false(禁用)

    validateSqlMap

    该选项在全局范围内启用或禁用了针对Sql Map文件的校验。这在调试时可能会很方便。

    ExamplevalidateSqlMap=true

    默认值 false(禁用)

    useReflectionOptimizer

    该选项在全局范围内启用或禁用在访问C#对象属性或字段对反射的使用。反射优化器会提供获取、生成、实例化参数和返回结果对象的类型。

    ExampleuseReflectionOptimizer =true

    默认值 true(启用)

     

     

     

    <tyeAlias>元素

     

    alias

    该元素的唯一性名称

    alias=”Category”

    type

    要代替类型的完全限定名称

    type="IBatisInAction.Domain.Category, IBatisInAction.Domain"

     

    <typeHandle>

     

    <typeHandler>元素用于对自定义类型处理器(Custom Type Handler)的配置。Custom Type Handler扩展了DataMapper的功能,可以处理如下的情形:特定于数据库Provider的类型,数据库Provider未处理的类型,在特定程序中特殊设计。

    <typeHandler type="guid" dbType="Varchar" callback="GuidVarchar" />

    2SqlMap.xml

    映射语句类型

     

    语句类型

    特性

    子元素

    用途

    详细内容参考

    <select>

    id

    parameterClass

    resultClass

    listClass

    parameterMap

    resultMap

    cacheModel

    extends

    所有动态元素

    查询数据

    4.2节;
    8

    <insert>

    id parameterClass parameterMap

    所有动态元素<selectKey> <generate>

    插入数据

    5.2节;
    8

    <update>

    id
    parameterClass parameterMap extends

    所有动态元素

    更新数据

    5.3节;
    8

    <delete>

    id
    parameterClass parameterMap extends

    所有动态元素

    删除数据

    5.3节;
    8

    <procedure>

    id
    parameterMap resultClass resultMap cacheModel

    所有动态元素

    执行存储过程

    5.5节;
    8

    <statement>

    id parameterClass resultClass listClass parameterMap resultMap cacheModel

    所有动态元素

    可以包含任意类型的语句,几乎无所不能

    6.3.1节;
    8

     

     

     

    3.       SqlMap API

    ISalMapper 接口方法很多,常用的有:

     

    1.QueryforObject()方法

    从数据库中获取单行数据

    object QueryForObject(string statementName, object parameterObject);
    object QueryForObject(string statementName, object parameterObject, object
     resultObject);
    T QueryForObject<T>(
    string statementName, object
     parameterObject);
    T QueryForObject<T>(
    string statementName, object parameterObject, T instanceObject);

     

     

     

    2QueryForList() 方法

    得到多行记录

    IList QueryForList(string statementName, object parameterObject);
    void QueryForList(string statementName, object
     parameterObject, IList resultObject);
    IList QueryForList(
    string statementName, object parameterObject, int skipResults, int
     maxResults);

    IList<T> QueryForList<T>(
    string statementName, object
     parameterObject);
    void QueryForList<T>(string statementName, object
     parameterObject, IList<T> resultObject);
    IList<T> QueryForList<T>(
    string statementName, object parameterObject, int skipResults, int maxResults);

     

    3 QueryForDictionary() 方法

     QueryForMap() java

    QueryForMap()方法从数据库获取一行或多行记录,将结果转换为C#对象,然后放在一个IDictionary(而不是IList)中返回。它有两个版本:

    IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty);
    IDictionary QueryForMap(
    string statementName, object parameterObject, string keyProperty, string valueProperty);

    4.       映射语句学习

    1<select>

    #:

    Select  …… from  where  id=#value# 或者  id=#value:int#  设置类型

     

    #表示该语句接收一个简单的参数

     

     

    $占位符

     表示使用文本替换 语法,讲一个值直接插入SQL

     

    SQL非法注入

    <select id="getByLikeCity" resultClass="Account">

      select
        accountId,
        username,
        password,
        firstName,
        lastName,
        address1,
        address2,
        city,
        state,
        postalCode,
        country
        from Account
        where city like‘%$burg$%’

    若是传入burg’; drop table Account; --

     (使用$

     

    自动结果映射

    使用情况:单列查询,固定列列表查询以及动态列列表查询

     

    <select id="getAccountRemapExample" resultClass="hashtable" >
        select
        accountId,
        username,
        
    <dynamic>
            
    <isEqual property="includePassword" compareValue="true" >
                password,
            
    </isEqual>
        
    </dynamic>
        firstName,
        lastName
        from Account
        
    <dynamic prepend=" where ">
            
    <isNotEmpty property="city">
                city like #city#
            
    </isNotEmpty>
            
    <isNotNull property="accountId" prepend=" and ">

      accountId = #accountId#
            
    </isNotNull>

        
    </dynamic>
    </select>

     

     

     

     

     

    结果映射

    <result Map>特性

    <resultMap id="get-product-result" class="product">
        
    <result property="id" column="PRD_ID"/>
        
    <result property="description" column="PRD_DESCRIPTION"/>
        
    <result property="subCode" column="PRD_SUB_CODE" nullValue="-9999" />
    </resultMap>

     

    ResultMap

     

    特性

    描述

    id

    必需的,为Result Map提供唯一标识。

    class

    可选的,指定当前Result Map使用的类。可以设置为类的完整名称或别名。

    extends

    可选的,指定要进行“继承”的Result Map

     

     

     

    子元素特性

     

    特性

    描述

    property

    必需的,表示结果对象的属性名称。

    column

    必需的,指定结果集中的列名称,使用该列来产生当前属性。

    columnIndex

    可选的,指定列的索引,该特性对性能会有轻微的帮助99%的应用程序中是不需要的,而且它还会牺牲可维护性和可读性。另外一些provider中,该特性可能对性能没有任何帮助。

    dbType

    用于显式地指定列的类型。由于CLR和数据库中类型的不一致,该特性比较有用,尤其是对datetimestring类型。

    type

    用于显式地指定结果对象属性的CLR类型。通常属性的类型可通过反射获得,但在映射到Hashtable之类的对象时就无能为力了。

     

    隐式的结果映射

     

    如果SQL语句返回的列与结果对象的属性相匹配,那么显式的Result Map就不再必要了

     

    <statement id="selectProduct" resultClass="Product">
        select
        id,
        description
        from PRODUCT
        where id = #value#
    </statement>

     

     

    如果列名和属性名称不一致,可以使用列的别名

     

    <statement id="selectProduct" resultClass="Product">
        select
        PRD_ID as id,
        PRD_DESCRIPTION as description
        from PRODUCT
        where PRD_ID = #value#
    </statement>

    当然,此时就不能指定dbTypenullValue或者其它的特性了

     

    返回IDictionary类型的结果

    需要的只是包含数据的键/值列表,Result Map可以生成一个IDictionary类型的实例,其语法与普通的POCO对象一样:

    <resultMap id="select-product-result" class="hashtable">
        
    <result property="id" column="PRD_ID"/>
        
    <result property="code" column="PRD_CODE"/>
        
    <result property="description" column="PRD_DESCRIPTION"/>
        
    <result property="suggestedPrice" column="PRD_SUGGESTED_PRICE"/>
    </resultMap>

    在这个例子中,iBATIS会为每一行创建一个Hashtable实例,这个实例包含了返回的数据,属性名idcode等均作为Hashtablekey,列的值则作为Hashtable的值。

    也可以使用IDictionary类型作为隐式的Result Map

    <statement id="selectProductCount" resultClass="hashtable">
        select * from PRODUCT
    </statement>

     

     

     

     

     

     

  • 相关阅读:
    解决点击链接自动置顶问题
    ie6 下遮罩层 height 不显示100%的解决方法
    【转帖】微软分布式缓存框架Volocity资源推荐
    Tips 2 MVC实现多个按钮提交的几种方法
    .NET Framework 4 中的新增功能
    Memcached 汇总 不断更新
    理解敏捷Agile
    GPIOPS中断成功,问题仍旧存在 ZEDBOARD,ZYNQ7000
    Xilinx驱动API的一个重要BUG,ZEDBOARD,ZYNQ7000
    RelativeLayout相对布局
  • 原文地址:https://www.cnblogs.com/Jennie/p/2152068.html
Copyright © 2020-2023  润新知