【IBatis.Net】 各類配置說明

1、各個配置文件的做用說明

  providers.config:指定數據庫提供者,.Net版本等信息。html

  xxxxx.xml:映射規則。sql

  SqlMap.config:大部分配置通常都在這裏,如數據庫鏈接等等。數據庫

2、默認配置文件的存放位置

  在Windows應用項目或者類庫項目中,須要放在項目的/bin/debug/目錄下。apache

  在Web應用程序中,須要放在應用程序根目錄。緩存

  固然,這也不是強制性的,也能夠很靈活地配置服務器

複製代碼
        public IList<PersonModel> GetList()
        {
            //ISqlMapper mapper = Mapper.Instance();
            DomSqlMapBuilder builder = new DomSqlMapBuilder();
            ISqlMapper mapper = builder.Configure(@"C:\Users\Administrator\Desktop\Ibatis.Net測試\Ibatis.Net測試\SqlMap.config");
            IList<PersonModel> ListPerson = mapper.QueryForList<PersonModel>("SelectAllPerson", null);  //這個"SelectAllPerson"就是xml映射文件的Id
            return ListPerson;
        }
複製代碼

  例如以上代碼,就從指定的位置去加載了SqlMap.config。注意,雖然SqlMap.config是從指定的位置,可是要注意裏面的resource引入的資源,仍是從原來的默認目錄開始找,例如app

<providers resource="providers.config"/>

  SqlMap.config裏面的providers.config這個東西,仍是須要在原來默認位置。ide

3、SqlMap.config

  下面先放上一個在官網直接下載後的sample.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 resource="../../../Files/properties.config"/>
  
  <settings>
    <setting useStatementNamespaces="false"/>
  </settings>
  
  <providers resource="../../../Files/providers.config"/>
  
    <!-- Database connection information -->
    <database>
        <provider name="OleDb2.0"/>
        <dataSource name="Blogs" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=../../../Files/Blogs.mdb"/>
    </database>

    <sqlMaps>
            <sqlMap resource="../../../Files/Maps/Access/Post.xml" />
          <sqlMap resource="../../../Files/Maps/Access/Blog.xml" />
        <sqlMap resource="../../../Files/Maps/Access/Author.xml" />
    </sqlMaps>

</sqlMapConfig>
複製代碼

  一、properties節點性能

  properties節點一般用於引入在外部定義一些鍵值對配置文件,以方便在後面統一調用,這樣修改的時候,只修改就能夠了。

  它的引入方式有3種:

  •   resource: 經過相對路徑來肯定文件的位置。
  •   url:     經過絕對路徑來肯定文件位置。
  •   embedded:經過嵌入資源方式來肯定文件位置。

  <sqlMap embedded = "命名空間.文件名.後綴名, 命名空間"/>

  例如,你在外部的config文件中,定義了一個數據庫鏈接

<?xml version="1.0" encoding="utf-8" ?>
<setting>
  <add key="connectionString" value="server=KISSDODOG-PC;uid=sa;pwd=123;database=Test"/>
</setting>

  這樣在SqlMap.config文件就能夠這樣寫:

  <!--數據庫鏈接字符串-->
  <database>
    <provider name="sqlServer2008"/>
    <dataSource name="Test" connectionString="${DataSource}"/>
  </database>

  二、Settings節點

  Settings節點裏,能夠配置如下5個信息:

  • useStatementNamespaces:默認flase,是否使用全局完整命名空間。
  • cacheModelsEnabled :默認true,是否啓用緩存。
  • validateSqlMap:默認false,使用啓用SqlMapConfig.xsd來驗證映射XML文件。
  • useReflectionOptimizer:默認true,是否使用反射機制訪問C#中對象的屬性。
  • useEmbedStatementParams 是否使用嵌入的方式聲明可變參數

  示例:

  <settings>
    <setting useStatementNamespaces="false"/>  --使用全局完整命名空間
  </settings>

  使用全局命名空間時,不一樣的xml映射文件,id互不影響。若是出現提示出現 重複的sql Id的狀況,大可能是沒啓用。若是啓用,則執行sql語句時,要用命名空間.id的方式。這個理所固然要啓用的。區分清楚點好,不然很容易出現xml 的 sql id重複的狀況。

  三、Providers節點

  示例:

<providers resource="providers.config"/>

  這裏使用引入外部配置文件的方式實現。

  四、alias節點

  alias節點用於爲類指定一個別名,一般用於爲一些很長的類名指定一個別名,這樣能夠減小一些代碼。

<typeAlias alias="Person" type="iBatis.Domain.Person,iBatisSample"/>

  以上代碼的意思是,爲iBatis.Domain.Person類指定一個別名Person。Person就表明iBatis.Domain.Person這個類。

  起初我覺得別名只是起了縮短配置類的做用,但後來我發現別名是還有其餘做用的,它還指明瞭IBatis.net應該到哪一個程序集去找實體類。

  若是程序偶爾報以下錯誤,那麼你就要考慮加上別名了。

  「/」應用程序中的服務器錯誤。

  Could not load type from string value 'xxx'

<alias>
  <typeAlias alias="Field" type="Nx.Domain.Common.Field, Nx.Domain" />
</alias>

  Ibatis.Net有不少默認的別名:

  

  五、database節點

  指定一個你選擇使用的數據庫,和數據庫鏈接。

  示例:

  <database>
    <provider name="sqlServer2008"/>
    <dataSource name="Test" connectionString="server=KISSDODOG-PC;uid=sa;pwd=123;database=Test"/>
  </database>

  六、SqlMaps節點

  SqlMaps節點,用於配置映射信息。一般在映射信息寫在外部,在這個節點引入。

4、映射文件

  映射文件與NHibernate相似,都是指定哪一個屬性名,對於哪一個列名。不過貌似沒有NHibernate那麼複雜,東西貌似很少,不過也可能只是我瞭解得太少。

  下面來看看省略的寫法(當property與column徹底相同時,能夠這樣寫):

複製代碼
<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="Ibatis" xmlns="http://ibatis.apache.org/mapping" xmlns:xls="http://www.w3.org/2001/XMLSchema-instance">
  <statements>
    <select id="SelectAllPerson" resultClass="Ibatis.Net.Domain.PersonModel">
      select * from person
    </select>
  </statements>
</sqlMap>
複製代碼

  下面再來看看所有寫全的寫法,爲了展現不一樣,我將Id和Name的屬性名改成PersonId,PersonName:

複製代碼
<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="Ibatis" xmlns="http://ibatis.apache.org/mapping" xmlns:xls="http://www.w3.org/2001/XMLSchema-instance">
  <resultMaps>
    <resultMap id="Person" Class="Ibatis.Net.Domain.PersonModel">   <!--id會被statements節點所用,Class實體類所在位置-->
      <result property="PersonId" column="Id"/>  <!--property實體類的屬性名,column對應的列名-->
      <result property="PersonName" column="Name"/>
    </resultMap>
  </resultMaps>
  <statements>
    <select id="SelectAllPerson" resultMap="Person">  <!--id在程序中會被SqlMapper實體類所調用,resultMap就是resultMap節點的id-->
      select * from person
    </select>
  </statements>
</sqlMap>
複製代碼

  resultMaps部分:定義了數據庫字段名與實體類屬性名之間的關係。固然,若是你數據庫字段名與實體類屬性名徹底同樣,那麼resultMaps部分是能夠省略的。另外要注意一點,ResultMap的列比你查詢的列不能少,也不能多。它不會說,ResultMap裏映射的列多了,該屬性就自動將select返回的列自動置null,而是直接全部列都不映射賦值。也就是說,Person表有Id,Name,Age3列,若是你只想要SELECT兩個列(Id,Name),那麼ResultMap裏面的3列映射沒用了,你必須另外搞一個ResulpMap只映射兩列的。不爽。

  statements部分:用於定義你須要執行的語句,在程序中經過select的id調用。

 

屬性

說明

parameterMap

參數映射,需結合parameterMap節點對映射關係加以定義,對於存儲過程以外的statement而言,建議使用parameterClass做爲參數配置方式,一方面避免了參數映射配置工做,另外一方面其性能表現更加出色

parameterClass

參數類。指定了參數類型的完整類名(包括命名空間),能夠經過別名避免每次書寫冗長的類名

resultMap

結果映射,需結合resultMap節點對映射關係加以定義

resultClass

結果類。指定告終果類型的完整類名(包括命名空間),能夠經過別名避免每次書寫冗長的類名

cacheModel

Statement對應的Cache模塊

extends

重複使用SQL子句

  一、extends

  extends用於提取一段重複使用的SQL語句而避免重複書寫

複製代碼
<select id="SelectAllCustomers" resultMap="Customer">
   SELECT * FROM Customers
</select>

<select id="SelectAllCustomerOrderByCustomerID" resultMap="Customer" extends="SelectAllCustomers">
   ORDER BY CustomerID
</select>
複製代碼

  二、parameterMap的屬性

  它能夠接受三個屬性,id/class/extends,其中是有id是必須的,class用於聲明使用的實體類名稱,能夠是別名,也能夠是全名,extends,可想而知,不解釋
在它下一級節點中應該包含若干個parameter元素,來指定對象屬性與當前變量的映射規則,parameter有以下經常使用屬性:

  1. property:指定類中的一個屬性
  2. columu:定義的參數名稱
  3. direction:用於聲明存儲過程的參數方向(input,output,inputoutput)
  4. dbType:用於指定property映射到數據庫中的數據類型
  5. type:用於爲參數的對象指定CLR類型
  6. nullValue:指定在property爲什麼值時,將會在存儲數據時候,替換爲null,這是常常會被用到的
  7. size:用於指定最大值

  三、resultMap的屬性

  它的屬性不少是和parameterMap想對應的,可是值得一提的是它下面能夠添加一個constructor元素來匹配一個構造函數。固然,這個的前提是Customers類中有這樣一個構造函數。例如:

複製代碼
<resultMaps>
  <resultMap id="Customer" class="Customers">
  <constructor>
    <argument argumentName="PersonId" column="PersonID"/>
    <argument argumentName="PersonName" column="PersonName"/>
  </constructor>
  <result property="PersonId" column="PersonID"/>
  <result property="PersonName" column="PersonName"/>
  </resultMap>
</resultMaps>
複製代碼

  四、存儲過程

  這裏有一點區別就是,只可使用parameterMap,而不可使用parameterClass,其實想想,您難道還會爲每個存儲過程定義個傳入的實體類嗎?還有一點,就是他的參數徹底是按照 parameterMap中的定義自動匹配的。

<procedure id="demoProcedure" parameterMap="procedureDemo">
  CustOrderHist
</procedure>

 

  五、對SQL片斷的引用

  在編寫SqlMaps的時候,常常須要把一個SQL語句進行拆分,而後在不通的地方引用它咱們可使用sql和include的組合來完成。

複製代碼
<sql id="order">
  ORDER BY PersonID
</sql>
<select id="SelectAllCustomerOrderByCustomerID" resultMap="Customer">   SELECT * FROM Person   <include refid="test"/> </select>
複製代碼

 



 

5、$與#的區別

    • SELECT * FROM TABLE WHERE Id = #id# 其中若是字段id爲字符串類型,那麼#id#表示的就是'id',也就是說會自動加引號。若是id爲整型,那麼#id#就是整型;
    • SELECT * FROM TABLE WHERE Id = $id$ ,若是字段id爲整型,Sql語句就不會出錯,可是若是字段id爲字符串類型,那麼Sql語句應該寫成 SELECT * FROM TABLE WHERE Id = '$id$',不然會出錯,由於它不會自動增長單引號。

 

 

轉載自 http://www.cnblogs.com/kissdodog/p/3293381.html

相關文章
相關標籤/搜索