筆者所在企業准備要用iBatis.Net來做數據訪問,於是有了這篇隨筆。
在示例中,為了方便起見,前台的數據綁定采用數據源。通過這篇隨筆,可以讓還未接觸iBatis.Net又計劃學習它的人有一個快速的了解和上手!
首先介紹Solution的架構,一共分四個項目:
Web :前台應用;
BLL :業務處理層,如果嫌麻煩,可以再進一步抽象出來,然後將代碼放置Web層的aspx.cs裡面;
Model :這個就不多說了,地球人都知道(數據實體類)
SqlMaps:資源類,把配置文件和sql mapper文件全部打包起來。
二個文件夾:
Include :iBatis.Net架構的dll文件
Log :放置log文件的文件夾,在web.config裡配置:
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="../Log/log.txt"/>
在這裡,主要介紹的就是SqlMaps項目.
SqlMaps項目文件介紹:
sqlmap.config:iBatis.Net架構最最重要的配置文件,裡面主要有properties,Provider,Database,sqlMaps配置,這個不用多介紹,一看便知。另外,這篇隨筆幫助大家入門,如果想要詳細理解每個參數的意義,建議去看iBatis.Net的幫助手冊。
database.config :顧名思義,數據庫連接的配置文件,這個文件是准們為sqlmap.config裡的properties准備的,你可以改成其他的名稱也可以,甚至可以不要。見sqlmap.config裡的配置:
<properties embedded="database.config,Service.SqlMaps"/>
providers.config:iBastis.Net自帶的,不需要修改。
MapSqlClientPerson.xml:這個就是傳說中的sql Mapper文件,其位置配置在sqlmap.config裡:
<sqlMaps>
<!-- user via embedded-->
<sqlMap embedded="Map.SqlClient.Person.xml,Service.SqlMaps"/>
</sqlMaps>
它支持:
存儲過程
Inline SQL
動態SQL
ORM
5.CodeMyBatis.cs:專門用來初始化IBatisNet.DataMapper.ISqlMapper的處理類(因為它跟配置有關,所以也打包起來)。在這裡,加入了支持輸出DataTable和DataSet。另外,當輸出為DataTable或者DataSet時,Person.xml裡的resultMaps就不起作用,所以sql語句就要這麼配置:
<select id="SelectAllPerson2" resultMap="SelectAllResult">
select
PER_ID AS Id,
PER_FIRST_NAME AS FirstName,
PER_LAST_NAME AS LastName,
PER_BIRTH_DATE AS BirthDate,
PER_WEIGHT_KG AS WeightInKilograms,
PER_HEIGHT_M AS HeightInMeters
from PERSON
<dynamic prepend="WHERE">
<isParameterPresent>
PER_FIRST_NAME LIKE #FirstName#+'%'
</isParameterPresent>
</dynamic>
</select>
建議實體類的屬性和數據庫表欄位保持一致,這樣大家都省心!
6.Script :示例中用到的表和數據的sql語句。
二,BLL的結構:
1. IBll.cs:方便調用ISqlMapper,把它作成一個基類,當然大家可以據此繼續抽象擴展。
代碼如下:
using System.IO;
using System.Reflection;
using IBatisNet.DataMapper;
using IBatisNet.DataMapper.Configuration;
using Service.SqlMaps;
namespace Service.BLL
{
public class IBll
{
protected static ISqlMapper SqlMap = MyBatis.SqlMap;
}
}
2. PersonService.cs:示例的業務類,這裡沒什麼業務,主要就是封裝一下對iBatis.Net的操作。部分代碼如下:
public class PersonService : IBll
{
public PersonService()
{
}
public IList<Person> GetAllPerson()
{
return SqlMap.QueryForList<Person>("SelectAllPerson", null);
}
public DataTable GetAllPerson2()
{
int recCount = 0;
DataTable dt = MyBatis.QueryForDataTable("SelectAllPerson2", new Person { FirstName = "kilo" },10,1,out recCount);
return dt;
}
public DataTable GetAllPerson3()
{
return MyBatis.QueryForDataTable("SelectAllPerson2", new Person { FirstName = "kilo" });
}
}
三.應用場景(摘抄自俺的同事Ryan):
1.在一些特定的環境下,一站式的解決方案未必有效
系統的部分或全部數據來自現有數據庫,處於安全考慮,只對開發團隊提供幾條Select SQL(或存儲過程)以獲取所需數據,具體的表結構不予公開。
開發規范中要求,所有牽涉到業務邏輯部分的數據庫操作,必須在數據庫層由存儲過程實現。(銀行大多有這樣的限制)
系統數據處理量巨大,性能要求極為苛刻,這往往意味著我們必須通過經過高度優化的SQL語句(或存儲過程)才能達到系統性能設計指標。
2.iBATIS之於小型、簡單系統:非常適用
iBATIS自己就很小並且簡單
iBATIS不會對現存應用的設計或者數據庫結構強加任何影響
iBATIS非常適合於有成長趨勢的系統
3.iBATIS之於大型、企業級系統:為之而設計
iBATIS的某些特性使得它能夠高效地處理大型數據集
iBATIS允許你用多種方式建立從對象到數據庫的映射關系
MySpace已應用
4.使用於任何類型的關系數據庫:
應用數據庫
企業數據庫
私有數據庫
遺留數據庫
簡單性
性能
明確分工
可移植性:Java、.Net或者其他
開源
5.何時不該使用iBATIS
當你能永遠擁有完全控制權
當你的應用需要完全動態的SQL
當你並沒有使用關系數據庫時
當iBATIS不起作用時
PS1:這個Demo最原始的代碼是從csdn上下載的,還扣了俺5分(很心痛),原來是1.3.0版,筆者把它升級,並對架構進行調整,代碼也進行了精簡.再次感謝一下原作者!
PS2:本來自己前陣子做的架構也是類似iBatis.Net的風格,並且在數據輸出這塊增加了很多種方式。不過這個架構都是自己在家裡完成的。所以不拿來應用到公司的項目上,只應用於自己或朋友的接的項目上!
運行環境:Vs2008 + [SqlServer2k | SqlServer2005]
本文配套源碼