【IBatis.Net】 各种配置说明
一、各個(gè)配置文件的作用說(shuō)明
providers.config:指定數(shù)據(jù)庫(kù)提供者,.Net版本等信息。
xxxxx.xml:映射規(guī)則。
SqlMap.config:大部分配置一般都在這里,如數(shù)據(jù)庫(kù)連接等等。
二、默認(rèn)配置文件的存放位置
在Windows應(yīng)用項(xiàng)目或者類(lèi)庫(kù)項(xiàng)目中,需要放在項(xiàng)目的/bin/debug/目錄下。
在Web應(yīng)用程序中,需要放在應(yīng)用程序根目錄。
當(dāng)然,這也不是強(qiáng)制性的,也可以很靈活地配置
public IList<PersonModel> GetList(){//ISqlMapper mapper = Mapper.Instance();DomSqlMapBuilder builder = new DomSqlMapBuilder();ISqlMapper mapper = builder.Configure(@"C:\Users\Administrator\Desktop\Ibatis.Net測(cè)試\Ibatis.Net測(cè)試\SqlMap.config");IList<PersonModel> ListPerson = mapper.QueryForList<PersonModel>("SelectAllPerson", null); //這個(gè)"SelectAllPerson"就是xml映射文件的Idreturn ListPerson;}例如以上代碼,就從指定的位置去加載了SqlMap.config。注意,雖然SqlMap.config是從指定的位置,但是要注意里面的resource引入的資源,還是從原來(lái)的默認(rèn)目錄開(kāi)始找,例如
<providers resource="providers.config"/>SqlMap.config里面的providers.config這個(gè)東西,還是需要在原來(lái)默認(rèn)位置。
三、SqlMap.config
下面先放上一個(gè)在官網(wǎng)直接下載后的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>1、properties節(jié)點(diǎn)
properties節(jié)點(diǎn)通常用于引入在外部定義一些鍵值對(duì)配置文件,以方便在后面統(tǒng)一調(diào)用,這樣修改的時(shí)候,只修改就可以了。
它的引入方式有3種:
- resource: 通過(guò)相對(duì)路徑來(lái)確定文件的位置。
- url: ? 通過(guò)絕對(duì)路徑來(lái)確定文件位置。
- embedded:通過(guò)嵌入資源方式來(lái)確定文件位置。
<sqlMap embedded = "命名空間.文件名.后綴名, 命名空間"/>
例如,你在外部的config文件中,定義了一個(gè)數(shù)據(jù)庫(kù)連接
<?xml version="1.0" encoding="utf-8" ?> <setting><add key="connectionString" value="server=KISSDODOG-PC;uid=sa;pwd=123;database=Test"/> </setting>這樣在SqlMap.config文件就可以這樣寫(xiě):
<!--數(shù)據(jù)庫(kù)連接字符串--><database><provider name="sqlServer2008"/><dataSource name="Test" connectionString="${DataSource}"/></database>2、Settings節(jié)點(diǎn)
Settings節(jié)點(diǎn)里,可以配置以下5個(gè)信息:
- useStatementNamespaces:默認(rèn)flase,是否使用全局完整命名空間。
- cacheModelsEnabled :默認(rèn)true,是否啟用緩存。
- validateSqlMap:默認(rèn)false,使用啟用SqlMapConfig.xsd來(lái)驗(yàn)證映射XML文件。
- useReflectionOptimizer:默認(rèn)true,是否使用反射機(jī)制訪問(wèn)C#中對(duì)象的屬性。
- useEmbedStatementParams 是否使用嵌入的方式聲明可變參數(shù)
示例:
<settings><setting useStatementNamespaces="false"/> --使用全局完整命名空間</settings>使用全局命名空間時(shí),不同的xml映射文件,id互不影響。如果出現(xiàn)提示出現(xiàn) 重復(fù)的sql Id的情況,大多是沒(méi)啟用。如果啟用,則執(zhí)行sql語(yǔ)句時(shí),要用命名空間.id的方式。這個(gè)理所當(dāng)然要啟用的。區(qū)分清楚點(diǎn)好,否則很容易出現(xiàn)xml 的 sql id重復(fù)的情況。
3、Providers節(jié)點(diǎn)
示例:
<providers resource="providers.config"/>這里使用引入外部配置文件的方式實(shí)現(xiàn)。
4、alias節(jié)點(diǎn)
alias節(jié)點(diǎn)用于為類(lèi)指定一個(gè)別名,通常用于為一些很長(zhǎng)的類(lèi)名指定一個(gè)別名,這樣可以減少一些代碼。
<typeAlias alias="Person" type="iBatis.Domain.Person,iBatisSample"/>以上代碼的意思是,為iBatis.Domain.Person類(lèi)指定一個(gè)別名Person。Person就代表iBatis.Domain.Person這個(gè)類(lèi)。
起初我以為別名只是起了縮短配置類(lèi)的作用,但后來(lái)我發(fā)現(xiàn)別名是還有其他作用的,它還指明了IBatis.net應(yīng)該到哪個(gè)程序集去找實(shí)體類(lèi)。
如果程序偶爾報(bào)如下錯(cuò)誤,那么你就要考慮加上別名了。
“/”應(yīng)用程序中的服務(wù)器錯(cuò)誤。
Could not load type from string value 'xxx'
<alias><typeAlias alias="Field" type="Nx.Domain.Common.Field, Nx.Domain" /> </alias>Ibatis.Net有很多默認(rèn)的別名:
5、database節(jié)點(diǎn)
指定一個(gè)你選擇使用的數(shù)據(jù)庫(kù),和數(shù)據(jù)庫(kù)連接。
示例:
<database><provider name="sqlServer2008"/><dataSource name="Test" connectionString="server=KISSDODOG-PC;uid=sa;pwd=123;database=Test"/></database>6、SqlMaps節(jié)點(diǎn)
SqlMaps節(jié)點(diǎn),用于配置映射信息。通常在映射信息寫(xiě)在外部,在這個(gè)節(jié)點(diǎn)引入。
四、映射文件
映射文件與NHibernate類(lèi)似,都是指定哪個(gè)屬性名,對(duì)于哪個(gè)列名。不過(guò)貌似沒(méi)有NHibernate那么復(fù)雜,東西貌似不多,不過(guò)也可能只是我了解得太少。
下面來(lái)看看省略的寫(xiě)法(當(dāng)property與column完全相同時(shí),可以這樣寫(xiě)):
<?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>下面再來(lái)看看全部寫(xiě)全的寫(xiě)法,為了展示不同,我將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會(huì)被statements節(jié)點(diǎn)所用,Class實(shí)體類(lèi)所在位置--><result property="PersonId" column="Id"/> <!--property實(shí)體類(lèi)的屬性名,column對(duì)應(yīng)的列名--><result property="PersonName" column="Name"/></resultMap></resultMaps><statements><select id="SelectAllPerson" resultMap="Person"> <!--id在程序中會(huì)被SqlMapper實(shí)體類(lèi)所調(diào)用,resultMap就是resultMap節(jié)點(diǎn)的id-->select * from person</select></statements> </sqlMap>resultMaps部分:定義了數(shù)據(jù)庫(kù)字段名與實(shí)體類(lèi)屬性名之間的關(guān)系。當(dāng)然,如果你數(shù)據(jù)庫(kù)字段名與實(shí)體類(lèi)屬性名完全一樣,那么resultMaps部分是可以省略的。另外要注意一點(diǎn),ResultMap的列比你查詢的列不能少,也不能多。它不會(huì)說(shuō),ResultMap里映射的列多了,該屬性就自動(dòng)將select返回的列自動(dòng)置null,而是直接所有列都不映射賦值。也就是說(shuō),Person表有Id,Name,Age3列,如果你只想要SELECT兩個(gè)列(Id,Name),那么ResultMap里面的3列映射沒(méi)用了,你必須另外搞一個(gè)ResulpMap只映射兩列的。不爽。
statements部分:用于定義你需要執(zhí)行的語(yǔ)句,在程序中通過(guò)select的id調(diào)用。
?
| 屬性 | 說(shuō)明 |
| parameterMap | 參數(shù)映射,需結(jié)合parameterMap節(jié)點(diǎn)對(duì)映射關(guān)系加以定義,對(duì)于存儲(chǔ)過(guò)程之外的statement而言,建議使用parameterClass作為參數(shù)配置方式,一方面避免了參數(shù)映射配置工作,另一方面其性能表現(xiàn)更加出色 |
| parameterClass | 參數(shù)類(lèi)。指定了參數(shù)類(lèi)型的完整類(lèi)名(包括命名空間),可以通過(guò)別名避免每次書(shū)寫(xiě)冗長(zhǎng)的類(lèi)名 |
| resultMap | 結(jié)果映射,需結(jié)合resultMap節(jié)點(diǎn)對(duì)映射關(guān)系加以定義 |
| resultClass | 結(jié)果類(lèi)。指定了結(jié)果類(lèi)型的完整類(lèi)名(包括命名空間),可以通過(guò)別名避免每次書(shū)寫(xiě)冗長(zhǎng)的類(lèi)名 |
| cacheModel | Statement對(duì)應(yīng)的Cache模塊 |
| extends | 重復(fù)使用SQL子句 |
1、extends
extends用于提取一段重復(fù)使用的SQL語(yǔ)句而避免重復(fù)書(shū)寫(xiě)
<select id="SelectAllCustomers" resultMap="Customer">SELECT * FROM Customers </select><select id="SelectAllCustomerOrderByCustomerID" resultMap="Customer" extends="SelectAllCustomers">ORDER BY CustomerID </select>2、parameterMap的屬性
它可以接受三個(gè)屬性,id/class/extends,其中是有id是必須的,class用于聲明使用的實(shí)體類(lèi)名稱(chēng),可以是別名,也可以是全名,extends,可想而知,不解釋
在它下一級(jí)節(jié)點(diǎn)中應(yīng)該包含若干個(gè)parameter元素,來(lái)指定對(duì)象屬性與當(dāng)前變量的映射規(guī)則,parameter有如下常用屬性:
3、resultMap的屬性
它的屬性很多是和parameterMap想對(duì)應(yīng)的,但是值得一提的是它下面可以添加一個(gè)constructor元素來(lái)匹配一個(gè)構(gòu)造函數(shù)。當(dāng)然,這個(gè)的前提是Customers類(lèi)中有這樣一個(gè)構(gòu)造函數(shù)。例如:
<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>4、存儲(chǔ)過(guò)程
這里有一點(diǎn)區(qū)別就是,只可以使用parameterMap,而不可以使用parameterClass,其實(shí)想一想,您難道還會(huì)為每一個(gè)存儲(chǔ)過(guò)程定義個(gè)傳入的實(shí)體類(lèi)嗎?還有一點(diǎn),就是他的參數(shù)完全是按照 parameterMap中的定義自動(dòng)匹配的。
<procedure id="demoProcedure" parameterMap="procedureDemo">CustOrderHist </procedure>?
5、對(duì)SQL片段的引用
在編寫(xiě)SqlMaps的時(shí)候,經(jīng)常需要把一個(gè)SQL語(yǔ)句進(jìn)行拆分,然后在不通的地方引用它我們可以使用sql和include的組合來(lái)完成。
<sql id="order">ORDER BY PersonID </sql><select id="SelectAllCustomerOrderByCustomerID" resultMap="Customer">SELECT * FROM Person<include refid="test"/> </select>
?
?
五、$與#的區(qū)別
- SELECT * FROM TABLE WHERE Id = #id#?其中如果字段id為字符串類(lèi)型,那么#id#表示的就是'id',也就是說(shuō)會(huì)自動(dòng)加引號(hào)。如果id為整型,那么#id#就是整型;
- SELECT * FROM TABLE WHERE Id =?$id$ ,如果字段id為整型,Sql語(yǔ)句就不會(huì)出錯(cuò),但是如果字段id為字符串類(lèi)型,那么Sql語(yǔ)句應(yīng)該寫(xiě)成 SELECT * FROM TABLE WHERE Id =?'$id$',否則會(huì)出錯(cuò),因?yàn)樗粫?huì)自動(dòng)增加單引號(hào)。
?
?
轉(zhuǎn)載自?http://www.cnblogs.com/kissdodog/p/3293381.html
轉(zhuǎn)載于:https://www.cnblogs.com/qifei-jia/p/8033486.html
總結(jié)
以上是生活随笔為你收集整理的【IBatis.Net】 各种配置说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JSPatch defineProtoc
- 下一篇: .NET 环境中使用RabbitMQ