国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
IbatisNet開發(fā)使用小結(jié) 之一
一.   介紹
平常做企業(yè)級應(yīng)用,需求變化是經(jīng)常的事,而很多基礎(chǔ)代碼重復(fù)也是很讓人頭疼的問題。所以很多人會使用一些ORM框架來增強(qiáng)項目的可維護(hù)性、可擴(kuò)展性。IBatis.Net就是一個比較易用的ORM框架,使用起來較為方便、靈活。IBatis.Net是從Ibatis的Java版本移植過來的.NET版本。iBATIS作為一種獨特的Data Mapper,使用SQL映射的方式將對象持久化至關(guān)系型數(shù)據(jù)庫。簡單的理解就是它將我們在數(shù)據(jù)訪問層實現(xiàn)的C#邏輯代碼,變?yōu)橥ㄟ^關(guān)系數(shù)據(jù)庫與對象的映射,將SQL邏輯放到外部的XML配置文件中,以方便以后的維護(hù)。
這個框架有兩個主要的組成部分,一個是SQL Maps,另一個是Data Access Objects。Sql Maps是這個框架的核心部分,通過使用Sql Maps你可以顯著的節(jié)約數(shù)據(jù)庫操作的代碼量。SQL Maps使用一個簡單的XML文件來實現(xiàn)從實體到SQL statements的映射。使用DAO,封裝了對數(shù)據(jù)的訪問,你可以動態(tài)配置你的應(yīng)用程序來訪問不同的實體存儲機(jī)制。隱藏持久性層實現(xiàn)的細(xì)節(jié),Data Access Objects允許你通過一個簡單接口的來操作數(shù)據(jù)。
二.   準(zhǔn)備工作
下面先讓我們來動手實踐一下,看看如何使用和調(diào)用IbatisNet。
1.  下載IbatisNet軟件包:http://ibatis.apache.org/dotnetdownloads.cgi
iBATIS.NET Downloads
DataMapper 1.6.2 [MD5] [PGP] (BETA)DataAccess 1.9.2 [MD5] [PGP] (BETA)Source Revision 709676 [MD5] [PGP]
官方網(wǎng)站還提供了一個示例項目:NPetShop Example Application
2.  建立測試數(shù)據(jù)庫,并在數(shù)據(jù)庫中創(chuàng)建一個Person 表:
字段
類型
大小
PER_ID
int
4
PER_FIRST_NAME
nvarchar
40
PER_LAST_NAME
nvarchar
40
PER_BIRTH_DATE
DateTime
8
PER_WEIGHT_KG
float
8
PER_HEIGHT_M
float
8
三.   開發(fā)步驟
1. 邏輯結(jié)構(gòu)
2. 建立項目
打開VS.NET,新建一個“ASP.NET Web應(yīng)用程序”項目。
3. 添加引用
在項目中添加下面dll的引用:
IBatisNet.Common.dll
IBatisNet.DataMapper.dll
IBatisNet.DataAccess.dll
4. 在項目中,添加配置文件  SqlMap.config
該文件為IBatis.net默認(rèn)的配置文件,不能缺少,當(dāng)然可以不必是Sql.config,但是如果改為其他的名字的話需要在前臺代碼中說明,請參考下面的內(nèi)容providers.config:該文件必須存在,并且不能改變它的文件名,該文件描述了如何連接數(shù)據(jù)庫,無須配置
結(jié)合上面示例中的IbatisNet配置文件,下面對配置文件中各節(jié)點的說明:
<?xml version="1.0" encoding="utf-8"?>
<sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<!-- 常量屬性,通過單獨文件properties.config加載-->
<properties resource="properties.config"/>
<!-- 常量屬性,通過程序集資源中 加載
<properties embedded="database.config, IBatisNetDemo"/>-->
<settings>
<setting useStatementNamespaces="${useStatementNamespaces}"/>
<setting cacheModelsEnabled="true"/>
<setting validateSqlMap="false"/>
</settings>
<!-- 數(shù)據(jù)驅(qū)動提供類配置文件的路徑和文件名 -->
<providers resource="providers.config"/>
<!-- 設(shè)置數(shù)據(jù)庫連接信息 -->
<database>
<provider name="${provider}"/>
<dataSource name="IBatisNetTest" connectionString="${connectionString}"/>
</database>
<!-- 指定項目內(nèi)映射的文件的位置-->
<sqlMaps>
<!-- 從程序集中
<sqlMap embedded="${root}Person.xml,${assembly}" />-->
<!-- 從文件中-->
<sqlMap resource="@Maps/Person.xml" />
</sqlMaps>
</sqlMapConfig>
詳細(xì)說明:
(1) properties節(jié)點
可以根據(jù)需要配置一些常量屬性。如果這些屬性有很多的話可以單獨寫一個文件里面,再通過resource(或url, embedded分別是引用url和編譯在程序中的資源文件)屬性引用進(jìn)來。
properties 節(jié)點參數(shù)
參數(shù)
描述
resource
指定the properties文件從application的根目錄進(jìn)行加載
resource="properties.config"
url
指定the properties文件從文件的絕對路徑進(jìn)行加載
url="c:\Web\MyApp\Resources\properties.config"
或者
url="file://c:\Web\MyApp\Resources\properties.config"
embedded
指定文件可以作為程序集的資源文件進(jìn)行加載'
embedded=" database.config, IBatisNetDemo”
上面例子中properties.config文件的配置如下:
<?xml version="1.0" encoding="utf-8" ?>
<settings>
<!—應(yīng)用程序和配置屬性設(shè)置-->
<add key="provider" value="sqlServer2.0" />
<add key="connectionString"   value="server=127.0.0.1;database=TVSystem;uid=sa;pwd=1" />
<add key="root" value="IBatisNetTest.Maps." />
<add key="assembly" value="IBatisNetTest" />
<add key="userid" value="sa" />
<add key="password" value="" />
<add key="database" value="Northwind" />
<add key="datasource" value="localhost" />
<add key="selectKey" value="select @@IDENTITY as value" />
<add key="directory" value="Maps" />
<add key="useStatementNamespaces" value="false" />
</settings>
下面解釋一下這個文件的節(jié)點參數(shù)
properties.config節(jié)點參數(shù)
參數(shù)
描述
key
定義key (variable) 名字
key="username"
value
定義DataMapper 中使用的 key的值
value="mydbuser"
(2) setting節(jié)點
Setting節(jié)點參數(shù)
參數(shù)
描述
cacheModelsEnabled
是否啟用sqlMap上的緩存機(jī)制
Example: cacheModelsEnabled=”true”
Default: true (enabled)
useStatementNamespaces
是否使用Satement命名空間,這里的命名空間指的是映射文件中sqlMap節(jié)點的namespace屬性,如上例中針對Person表的映射文件sqlMap節(jié)點
<sqlMap namespace="Person" xmlns="http://ibatis.apache.org/mapping"
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance> 這里,指定了此sqlMap節(jié)點下定義的操作均叢屬于“Person”命名空間在useStatementNamespaces=”true”的情況下,Statement調(diào)用需追加命名空間,如:sqlMap.Update(“Person.UpdatePerson”,person);否則直接通過Statement名稱調(diào)用即可,如sqlMap.Update(“UpdatePerson”,person);但請注意此時需要保證所有映射文件中,statement定義無重名
Example: useStatementNamespaces=”false”
Default: false (disabled)
validateSqlMap
是配置要不要啟示SqlMapConfig.xsd schema驗證映射文件.
Example: validateSqlMap=”false”
Default: false (disabled)
(3) provider節(jié)點
配置數(shù)據(jù)驅(qū)動提供類配置文件的路徑和文件名,通過resource(或url, embedded分別是引用url和編譯在程序中的資源文件)屬性引用進(jìn)來,參數(shù)的含義同properties。
ADO.NET是通過數(shù)據(jù)訪問提供程序(Provider)訪問數(shù)據(jù)庫。IBatisNet使用的是插件式結(jié)構(gòu)來使用這些數(shù)據(jù)庫提供程序,每一個Provider對應(yīng)于providers.config文件中定義的一個provider項。1.3版本的Provider.config文件中定義了已經(jīng)實現(xiàn)的16個provider,通過設(shè)置這個文件中的幾個參數(shù)來決定使用哪個數(shù)據(jù)庫提供程序。
·         sqlServer1.0 - Microsoft SQL Server 7.0/2000 provider available with .NET Framework 1.0
·         sqlServer1.1 -Microsoft SQL Server 7.0/2000 provider available with .NET Framework 1.1
·         sqlServer2.0 - Microsoft SQL server 7.0/2000/2005 provider available with .NET Framework 2.0
·         OleDb1.1 - OleDb provider available with .NET Framework 1.1
·         Odbc1.1 - Odbc provider available with .NET Framework 1.1
·         oracle9.2 - Oracle provider V9.2.0.401
·         oracle10.1 - Oracle provider V10.1.0.301
·         oracleClient1.0 - MS Oracle provider V1.0.5 available with .NET Framework 1.1
·         ByteFx - ByteFx MySQL provider V0.7.6.15073
·         MySql - MySQL provider V1.0.4.20163
·         SQLite3 - SQLite.NET provider V0.21.1869.3794
·         Firebird1.7 - Firebird SQL .NET provider V1.7.0.33200
·         PostgreSql0.7 - Npgsql provider V0.7.0.0
·         PostgreSql0.7.1  - Npgsql provider V0.7.1.0
·         iDb2.10 - IBM DB2 iSeries provider V10.0.0.0
·         Informix -- informix NET Provider, 2.81.0.0
提供程序要求安裝相關(guān)類庫,每一個provider 元素都有"enabled" 屬性來控制是否啟用這個providers. 一個provider 可以通過 “default“屬性標(biāo)識為默認(rèn)的提供程序。
(4) database節(jié)點
數(shù)據(jù)庫的信息,包括使用哪些數(shù)據(jù)庫驅(qū)動和數(shù)據(jù)連接字符串的配置。
Database節(jié)點參數(shù)
參數(shù)
描述
provider
數(shù)據(jù)庫訪問所使用的provider.config文件定義的provider
dataSource
特定的數(shù)據(jù)庫連接字符串
(5) typeHandler節(jié)點
定義數(shù)據(jù)庫類型到dotnet數(shù)據(jù)類型的處理,不同的數(shù)據(jù)庫都有一些特殊的數(shù)據(jù)庫字段類型需要特殊處理,就可以通過這個功能實現(xiàn)。比如說Blob字段在不同的數(shù)據(jù)庫中處理不一樣。大家可以去看看Ibatisnet源代碼就清楚這個功能的實現(xiàn)原理,對于我們的設(shè)計會有很大的啟發(fā)
(6) sqlMaps節(jié)點
sqlMap節(jié)點指定了映射文件的位置,配置中可以出現(xiàn)多個sqlMap節(jié)點,以指定項目內(nèi)所包含的所有映射文件。
5. 創(chuàng)建實體類
定義Person的實體類,該對象類將與數(shù)據(jù)庫進(jìn)行映射。
[Serializable]
public class Person
{
private int id;
private string firstName;
private string lastName;
private DateTime? birthDate;
private double? weightInKilograms;
private double? heightInMeters;
public Person() { }
public int Id
{
get { return id; }
set { id = value; }
}
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
public DateTime? BirthDate
{
get { return birthDate; }
set { birthDate = value; }
}
public double? WeightInKilograms
{
get { return weightInKilograms; }
set { weightInKilograms = value; }
}
public double? HeightInMeters
{
get { return heightInMeters; }
set { heightInMeters = value; }
}
}
6. 添加Person的映射文件Person.xml
相對于Nhibernate等ORM實現(xiàn)來說,IBatisnet的映射配置更為直接,下面是配置文件內(nèi)容:
<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="Person" xmlns="http://ibatis.apache.org/mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<!--模塊配置-->
<alias>
<typeAlias alias="Person" type="IBatisNetLib.Person,IBatisNetLib" />
</alias>
<resultMaps>
<resultMap id="SelectAllResult" class="Person">
<result property="Id" column="PER_ID" />
<result property="FirstName" column="PER_FIRST_NAME" />
<result property="LastName" column="PER_LAST_NAME" />
<result property="BirthDate" column="PER_BIRTH_DATE" />
<result property="WeightInKilograms" column="PER_WEIGHT_KG" />
<result property="HeightInMeters" column="PER_HEIGHT_M" />
</resultMap>
</resultMaps>
<!--statement配置-->
<statements>
<select id="Exists" resultClass="int" parameterclass="int">
select count(1) from PERSON
where PER_ID = #value#
</select>
<insert id="InsertPerson"  parameterclass="Person" >
<selectKey property="Id" type="post" resultClass="int">
${selectKey}
</selectKey>
insert into Person
( PER_FIRST_NAME,
PER_LAST_NAME,
PER_BIRTH_DATE,
PER_WEIGHT_KG,
PER_HEIGHT_M)values(#FirstName#,#LastName#,#BirthDate#, #WeightInKilograms#, #HeightInMeters#)
</insert>
<update id="UpdatePerson"
parameterclass="Person">
<![CDATA[ update Person set
PER_FIRST_NAME =#FirstName#,
PER_LAST_NAME =#LastName#,
PER_BIRTH_DATE =#BirthDate#,
PER_WEIGHT_KG=#WeightInKilograms#,
PER_HEIGHT_M=#HeightInMeters#
where
PER_ID = #Id# ]]>
</update>
<delete id="DeletePerson" parameterclass="Person">
delete from Person where PER_ID = #Id#
</delete>
<select id="SelectAllPerson" resultMap="SelectAllResult">
Select *
from PERSON
</select>
<select id="SelectByPersonId" resultMap="SelectAllResult" resultClass="Person" parameterClass="int">
select
PER_ID,
PER_FIRST_NAME,
PER_LAST_NAME,
PER_BIRTH_DATE,
PER_WEIGHT_KG,
PER_HEIGHT_M
from PERSON
where PER_ID = #value#
</select>
</statements>
</sqlMap>
可以看到,映射文件主要分為兩個部分:模塊配置 和 Statement配置。
模塊配置包括:
(1)Type Alias節(jié)點
定義了本映射文件中的別名,以避免過長變量值的反復(fù)書寫,此例中通過typeAlias節(jié)點為類“IBatisNetDemo.Domain.Person”定義了一個別名“Person”,這樣在本配置文件中的其他部分,需要引用“IBatisNetDemo.Domain.Person”類時,只需以其別名替代即可。
(2)cacheModel節(jié)點
定義了本映射文件中使用的Cache機(jī)制:
<cacheModel id="person-cache" implementation="MEMORY" >
<flushInterval hours="24"/>
<flushOnExecute  statement="UpdateAccountViaInlineParameters"/>
<flushOnExecute  statement="UpdateAccountViaParameterMap"/>
<property name="Type" value="Weak"/>
</cacheModel>
這里聲明了一個名為“person-cache”的cacheModel,之后可以在Statement聲明中對其進(jìn)行引用:
<select id="SelectAllPerson" resultMap="SelectAllResult" cacheModel=" person-cache">
select
PER_ID,
PER_FIRST_NAME,
PER_LAST_NAME,
PER_BIRTH_DATE,
PER_WEIGHT_KG,
PER_HEIGHT_M
from PERSON
</select>
這表明對通過id為SelAllPerson的“Select Statement”獲取的數(shù)據(jù),使用CacheModel “person-cache”進(jìn)行緩存。之后如果程序再次用此Satement進(jìn)行數(shù)據(jù)查詢。即直接從緩存中讀取數(shù)據(jù),而不需再去數(shù)據(jù)庫查詢。
CacheModel主要有幾個配置點:
參數(shù)
描述
flushInterval
設(shè)定緩存有效期,如果超過此設(shè)定值,則將此CacheModel緩存清空
CacheSize
本Cachemodel中最大的數(shù)據(jù)對象數(shù)量
flushOnExecute
指定執(zhí)行特定的Statement時,將緩存清空。如UpdatePerson操作將更新數(shù)據(jù)庫中用戶信息,這將導(dǎo)致緩存中的數(shù)據(jù)對象與數(shù)據(jù)庫中的實際數(shù)據(jù)發(fā)生偏差,因此必須將緩存清空以避免臟數(shù)據(jù)的出現(xiàn)。
(3)resultMaps節(jié)點
resultMaps實現(xiàn)dotnet實體到數(shù)據(jù)庫字段的映射配置:
<resultMap id="SelectAllResult" class="Person">
<result property="Id" column="PER_ID" />
<result property="FirstName" column="PER_FIRST_NAME" />
<result property="LastName" column="PER_LAST_NAME" />
<result property="BirthDate" column="PER_BIRTH_DATE" />
<result property="WeightInKilograms" column="PER_WEIGHT_KG" />
<result property="HeightInMeters" column="PER_HEIGHT_M" />
</resultMap>
(4)Statement配置:
⑴ ID
指定了操作ID,之后我們可以在代碼中通過指定操作id 來執(zhí)行此節(jié)點所定義的操作,如:
SqlMap.Update("UpdatePerson", person);
ID設(shè)定使得在一個配置文件中定義兩個同名節(jié)點成為可能(兩個update節(jié)點,以不同id區(qū)分)
⑵ parameterClass
指定了操作所需的參數(shù)類型,此例中update 操作以IBatisNetDemo.Domain.Person類型的對象作為參數(shù),目標(biāo)是將提供的Person實例更新到數(shù)據(jù)庫。
parameterClass="Person"中,user為“IBatisNetDemo.Domain.Person”
類的別名,別名可通過typeAlias節(jié)點指定,如示例配置文件中的:
<typeAlias alias="Person" type="IBatisNetDemo.Domain.Person,IBatisNetDemo" />
⑶ <![CDATA[……]]>
通過<![CDATA[……]]>節(jié)點,可以避免SQL 中與XML 規(guī)范相沖突的字符對XML映射文件的合法性造成影響。
⑷ 執(zhí)行更新操作的SQL,這里的SQL 即實際數(shù)據(jù)庫支持的SQL 語句,將由IBatisNet填入?yún)?shù)后交給數(shù)據(jù)庫執(zhí)行。
⑸ SQL中所需的用戶名參數(shù),“# FirstName #”在運行期會由傳入的Person對象的FirstName屬性填充。
⑹ SQL 中所需的用戶性別參數(shù)“# LastName #”,將在運行期由傳入的user 對象的LastName屬性填充。
⑺ SQL中所需的條件參數(shù)“#id#”,將在運行期由傳入的Person對象的Person屬性填充。
對于這個示例,IBatisNet在運行期會讀取id 為“UpdatePerson”的update節(jié)點的SQL定義,并調(diào)用指定的user對象的對應(yīng)getter方法獲取屬性值,并用此屬性值,對SQL中的參數(shù)進(jìn)行填充后提交數(shù)據(jù)庫執(zhí)行。
Statement配置包含了數(shù)個與Sql Statement相關(guān)的節(jié)點,<statement>元素是一個通用的能夠包容任意類型sql的元素。我們可以用更多細(xì)節(jié)的元素。
這些細(xì)節(jié)元素提供更好的錯誤檢查以及一些更多的功能。(例如,一個插入函數(shù)能夠返回數(shù)據(jù)庫自動生成的key)。以下表格總結(jié)了聲明類型元素以及他們的特性和屬性。
Statement Element
Attributes
Child Elements
Methods
<statement>
id
parameterClass
resultClass
parameterMap
resultMap
cacheModel
xmlResultName (Java only)
All dynamic elements
insert
update
delete
All query methods
<insert>
id
parameterClass
parameterMap
All dynamic elements
<selectKey>
<generate> (.NET only)
insert
update
delete
<update>
id
parameterClass
parameterMap
All dynamic elements
<generate>  (.NET only)
insert
update
delete
<delete>
id
parameterClass
parameterMap
All dynamic elements
<generate>  (.NET only)
insert
update
delete
<select>
id
parameterClass
resultClass
parameterMap
resultMap
cacheModel
All dynamic elements
<generate> (.NET only)
All query methods
<procedure>
id
parameterClass
resultClass
parameterMap
resultMap
xmlResultName (Java only)
All dynamic elements
insert
update
delete
All query methods
其中,statement最為通用,它可以代替其余的所有節(jié)點。除statement之外的節(jié)點對應(yīng)于SQL中的同名操作(procedure對應(yīng)存儲過程)。使用Statement定義所有操作,缺乏直觀性,建議在開發(fā)中根據(jù)操作目的,各自選用對應(yīng)的節(jié)點名加以說明。一方面,使得配置文件更加直觀,另一方面,也可以借助xsd對i節(jié)點聲明進(jìn)行更有針對性的檢查,以避免配置上的失誤。
<statement id=”statementName”
[parameterMap=”nameOfParameterMap”]
[parameterClass=”some.class.Name”]
[resultMap=”nameOfResultMap”]
[resultClass=”some.class.Name”]
[cacheModel=”nameOfCache”]
>
select * from PRODUCT where PRD_ID = [?|#propertyName#]
order by [$simpleDynamic$]
</statement>
其中“[ ]”包圍的部分為可能出現(xiàn)的配置項,各參數(shù)說明見下表。具體的使用方法參見IBatisNet官方文檔。
參數(shù)
描述
parameterMap
參數(shù)映射,需結(jié)合parameterMap節(jié)點對映射關(guān)系加以定義,對于存儲過程之外的statement而言,建議使用parameterClass作為參數(shù)配置方式,一方面避免了參數(shù)映射配置工作,另一方面其性能表現(xiàn)更加出色
parameterClass
參數(shù)類。指定了參數(shù)類型的完整類名(包括命名空間),可以通過別名避免每次書寫冗長的類名
resultMap
結(jié)果映射,需結(jié)合resultMap節(jié)點對映射關(guān)系加以定義
resultClass
結(jié)果類。指定了結(jié)果類型的完整類名(包括命名空間),可以通過別名避免每次書寫冗長的類名
cacheModel
Statement對應(yīng)的Cache模塊
一般而言,對于insert、update、delete、select語句,優(yōu)先采用parameterClass和resultClass.。paremeterMap使用較少,而ResultMap則大多用于存儲過程處理和查詢。存儲過程相對而言比較封閉(很多情況下需要調(diào)用現(xiàn)有的存儲過程),其參數(shù)名和返回的數(shù)據(jù)字段命名往往不符合dotnet編程的命名規(guī)范)。使用resultMap建立字段名同Dotnet對象的屬性之間的映射關(guān)系就非常有效。另一方面,由于通過ResultMap指定了字段名和字段類型,ibatisnet無需再通過ado.net來動態(tài)獲取字段信息,在一定程度上也提升了性能
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
MyBatis For .NET學(xué)習(xí)筆記[2]:配置環(huán)境
IBatis.net ORM初體驗
iBatis2-SqlMap的配置總結(jié)
[原]iBatis.Net(C#)系列一:簡介及運行環(huán)境
BATIS 2.0 開發(fā)指南
Ibatis2.0使用說明(二)——配置篇(2)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服