跟初學者學習IbatisNet第一篇


    寫在前面的話:我自己也是一個初學者,寫這個專題只是為了對學過知識的鞏固,如果有什么不對的地方,歡迎大家指正……………………

    第一篇就簡單介紹一下什么是IbatisNet,然后寫一個簡單的Demo,在后面再詳細介紹IbatisNet的工作原理和IbatisNet的優缺點。為什么按照這個順序呢?舉個簡單的例子來說,我現在給你一輛自行車,你不可能一上來就開始分析它是怎么運動的吧,你得首先會騎它,等你會騎了你才會發現這個車子怎么好,怎么不好。這樣你才有資格說它有什么優點,有什么缺點,好了, 不廢話了,首先介紹一下什么是IbatisNet:

   應該有很多人都聽說過Ibatis吧,沒錯IbatisNet就是Ibatis在.net上的一個移植版本,所以它們倆基本是差不多的。所以IbatisNet自然也是一個輕量級的ORM框架,於是我們又想起來了hibnate和Nhibnate,它們也是一個輕量級的ORM實體框架(關於IbatisNet和Nhibnate的優缺點我就不介紹了,如果想了解可以看這篇博客ibatis VS hibernate 經典論述http://www.cnblogs.com/tjsquall/archive/2009/06/23/1508977.html)不過嚴格的來說IbatisNet並不是一種很正統的ORM解決方案。因為它不像NHibernate那樣,具備全自動的數據操作,包括查詢,插入,更新,刪除,也沒有像它那樣,與數據庫的約束關系有緊密的聯系。IbatisNet為我們提供了一種更為靈活的方便的可控的方式去實現類似與ORM的解決方案,在這里我們需要自己寫全部的Sql語句,這樣有好處也有壞處,好處是:

  1,允許sql以最自然的方式書寫,沒有字符串拼接,沒有參數設置,沒有結果獲取。對應用程序的代碼沒有任何的影響。

  2,支持對存儲過程的直接調用,業務邏輯從數據庫中分離出來,程序有更強的移植性。

  3,IbatisNet有許多o/rm工具一樣的特性,高速緩存,運行時生成代碼,延遲加載等。(貌似不是寫sql語句的好處…………)

  4,IbatisNet支持動態sql來處理查詢。

最大的缺點就是我們還需要編寫大量的sql語句,但是值得感到高興的是,我們只需要提供這些SQL語句,和為它提供它所需的參數外,接下來的事情就無需我們參與了。這也是iBatis最核心的功能,它會根據具體傳進來的參數值,動態生成一條可執行的SQL語句並且為這些SQL參數提供不同的具體值。然后根據配置好的數據訪問驅動,自動為DbCommand添加DbParameter,自動執行SQL語句,使用IDataReader返回出數據集,生成並返回一個或多個強類型數據類對象。好了,介紹就先介紹到這兒吧,下面直接來個Demo吧,估計還是看着代碼爽…………

 一,  准備工作

 軟件下載

下載地址:http://code.google.com/p/mybatisnet/downloads/list?can=1

二,開始編碼

  1, 首先我們要引用IbatisNet的兩個DLL文件(創建項目和創建數據庫我就不說了)他們分別是:

 

  2,添加IbatisNet默認的配置文件sqlmap.config和database.config和providers.config

   首先簡單介紹一下database.config

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <settings>
 3   <!-- 用戶的數據庫連接在這里設置-->
 4   <add key="userid" value="sa" />
 5   <add key="password" value="805072" />
 6   <add key="database" value="ibatisdata" />
 7   <add key="datasource" value="." />
 8   <add key="selectKey" value="select @@IDENTITY as value" />
 9   <add key="directory" value="Maps" />
10   <add key="useStatementNamespaces" value="false" />
11   <add key="provider" value="sqlServer2.0" />
12 </settings>
代碼

 

  這個配置文件主要是配置數據庫的連接,它是以鍵值對的形式存在。

  再來簡單介紹一下providers.config

  1 <?xml version="1.0" encoding="utf-8"?>
  2 <providers 
  3 xmlns="http://ibatis.apache.org/providers" 
  4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  5 
  6 <clear/>
  7 <provider 
  8     name="sqlServer1.0" 
  9     description="Microsoft SQL Server 7.0/2000, provider V1.0.3300.0 in framework .NET V1.0" 
 10     enabled="true" 
 11     assemblyName="System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionClass="System.Data.SqlClient.SqlConnection" 
 12     commandClass="System.Data.SqlClient.SqlCommand" 
 13     parameterClass="System.Data.SqlClient.SqlParameter" 
 14     parameterDbTypeClass="System.Data.SqlDbType" 
 15     parameterDbTypeProperty="SqlDbType" 
 16     dataAdapterClass="System.Data.SqlClient.SqlDataAdapter" 
 17     commandBuilderClass="System.Data.SqlClient.SqlCommandBuilder" 
 18     usePositionalParameters="false" 
 19     useParameterPrefixInSql="true" 
 20     useParameterPrefixInParameter="true" 
 21     parameterPrefix="@"/>
 22 <provider 
 23     name="sqlServer1.1" 
 24     description="Microsoft SQL Server 7.0/2000, provider V1.0.5000.0 in framework .NET V1.1" 
 25     enabled="true"
 26     default="true" 
 27     assemblyName="System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionClass="System.Data.SqlClient.SqlConnection" 
 28     commandClass="System.Data.SqlClient.SqlCommand" 
 29     parameterClass="System.Data.SqlClient.SqlParameter" 
 30     parameterDbTypeClass="System.Data.SqlDbType" 
 31     parameterDbTypeProperty="SqlDbType" 
 32     dataAdapterClass="System.Data.SqlClient.SqlDataAdapter" 
 33     commandBuilderClass="System.Data.SqlClient.SqlCommandBuilder" 
 34     usePositionalParameters="false" 
 35     useParameterPrefixInSql="true" 
 36     useParameterPrefixInParameter="true" 
 37     parameterPrefix="@"/>
 38 <provider
 39         name="sqlServer2.0"
 40         enabled="true"
 41         description="Microsoft SQL Server 2005, provider V2.0.50215.0 in framework .NET V2.0" 
 42         assemblyName="System.Data, Version=2.0.50215.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
 43         connectionClass="System.Data.SqlClient.SqlConnection" 
 44         commandClass="System.Data.SqlClient.SqlCommand"
 45         parameterClass="System.Data.SqlClient.SqlParameter"
 46         parameterDbTypeClass="System.Data.SqlDbType"
 47         parameterDbTypeProperty="SqlDbType"
 48         dataAdapterClass="System.Data.SqlClient.SqlDataAdapter"
 49         commandBuilderClass=" System.Data.SqlClient.SqlCommandBuilder"
 50         usePositionalParameters = "false"
 51         useParameterPrefixInSql = "true"
 52         useParameterPrefixInParameter = "true"    
 53         parameterPrefix="@"
 54         />    
 55 <provider name="OleDb1.1" 
 56     description="OleDb, provider V1.0.5000.0 in framework .NET V1.1" 
 57     enabled="true"
 58     assemblyName="System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionClass="System.Data.OleDb.OleDbConnection" 
 59     commandClass="System.Data.OleDb.OleDbCommand" 
 60     parameterClass="System.Data.OleDb.OleDbParameter" 
 61     parameterDbTypeClass="System.Data.OleDb.OleDbType" 
 62     parameterDbTypeProperty="OleDbType" 
 63     dataAdapterClass="System.Data.OleDb.OleDbDataAdapter" 
 64     commandBuilderClass="System.Data.OleDb.OleDbCommandBuilder" 
 65     usePositionalParameters="true" 
 66     useParameterPrefixInSql="false" 
 67     useParameterPrefixInParameter="false" 
 68     parameterPrefix=""/>
 69 <provider 
 70     name="Odbc1.1" 
 71     description="Odbc, provider V1.0.5000.0 in framework .NET V1.1" 
 72     enabled="true" 
 73     assemblyName="System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionClass="System.Data.Odbc.OdbcConnection" 
 74     commandClass="System.Data.Odbc.OdbcCommand" 
 75     parameterClass="System.Data.Odbc.OdbcParameter" 
 76     parameterDbTypeClass="System.Data.Odbc.OdbcType" 
 77     parameterDbTypeProperty="OdbcType" 
 78     dataAdapterClass="System.Data.Odbc.OdbcDataAdapter" 
 79     commandBuilderClass="System.Data.Odbc.OdbcCommandBuilder" 
 80     usePositionalParameters="true" 
 81     useParameterPrefixInSql="false" 
 82     useParameterPrefixInParameter="false" 
 83     parameterPrefix="@"/>
 84 <provider 
 85     name="oracle9.2" 
 86     description="Oracle, Oracle provider V9.2.0.401" 
 87     enabled="false" 
 88     assemblyName="Oracle.DataAccess, Version=9.2.0.401, Culture=neutral, PublicKeyToken=89b483f429c47342" connectionClass="Oracle.DataAccess.Client.OracleConnection" 
 89     commandClass="Oracle.DataAccess.Client.OracleCommand" 
 90     parameterClass="Oracle.DataAccess.Client.OracleParameter" 
 91     parameterDbTypeClass="Oracle.DataAccess.Client.OracleDbType" 
 92     parameterDbTypeProperty="OracleDbType" 
 93     dataAdapterClass="Oracle.DataAccess.Client.OracleDataAdapter" 
 94     commandBuilderClass="Oracle.DataAccess.Client.OracleCommandBuilder" 
 95     usePositionalParameters="false"
 96     useParameterPrefixInSql="true" 
 97     useParameterPrefixInParameter="false" 
 98     parameterPrefix=":" 
 99     useDeriveParameters="false"/>
100 <provider 
101     name="oracle10.1" 
102     description="Oracle, oracle provider V10.1.0.301"
103     enabled="false" 
104     assemblyName="Oracle.DataAccess, Version=10.1.0.301, Culture=neutral, PublicKeyToken=89b483f429c47342" connectionClass="Oracle.DataAccess.Client.OracleConnection" 
105     commandClass="Oracle.DataAccess.Client.OracleCommand" 
106     parameterClass="Oracle.DataAccess.Client.OracleParameter" 
107     parameterDbTypeClass="Oracle.DataAccess.Client.OracleDbType" 
108     parameterDbTypeProperty="OracleDbType" 
109     dataAdapterClass="Oracle.DataAccess.Client.OracleDataAdapter" 
110     commandBuilderClass="Oracle.DataAccess.Client.OracleCommandBuilder" 
111     usePositionalParameters="true" 
112     useParameterPrefixInSql="true"
113     useParameterPrefixInParameter="true" 
114     parameterPrefix=":" 
115     useDeriveParameters="false"/>
116 <provider 
117     name="oracleClient1.0" 
118     description="Oracle, Microsoft provider V1.0.5000.0" 
119     enabled="false" 
120     assemblyName="System.Data.OracleClient, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionClass="System.Data.OracleClient.OracleConnection" 
121     commandClass="System.Data.OracleClient.OracleCommand" 
122     parameterClass="System.Data.OracleClient.OracleParameter" 
123     parameterDbTypeClass="System.Data.OracleClient.OracleType" 
124     parameterDbTypeProperty="OracleType" 
125     dataAdapterClass="System.Data.OracleClient.OracleDataAdapter" 
126     commandBuilderClass="System.Data.OracleClient.OracleCommandBuilder" 
127     usePositionalParameters="false" 
128     useParameterPrefixInSql="true" 
129     useParameterPrefixInParameter="false" 
130     parameterPrefix=":"/>
131 <provider 
132     name="ByteFx" 
133     description="MySQL, ByteFx provider V0.7.6.15073" 
134     enabled="false" 
135     assemblyName="ByteFX.MySqlClient, Version=0.7.6.15073, Culture=neutral, PublicKeyToken=f2fef6fed1732fc1" connectionClass="ByteFX.Data.MySqlClient.MySqlConnection" 
136     commandClass="ByteFX.Data.MySqlClient.MySqlCommand" 
137     parameterClass="ByteFX.Data.MySqlClient.MySqlParameter" 
138     parameterDbTypeClass="ByteFX.Data.MySqlClient.MySqlDbType" 
139     parameterDbTypeProperty="MySqlDbType" 
140     dataAdapterClass="ByteFX.Data.MySqlClient.MySqlDataAdapter" 
141     commandBuilderClass="ByteFX.Data.MySqlClient.MySqlCommandBuilder" 
142     usePositionalParameters="false" 
143     useParameterPrefixInSql="true" 
144     useParameterPrefixInParameter="true" 
145     parameterPrefix="@"/>
146 <provider 
147     name="MySql" 
148     description="MySQL, MySQL provider V1.0.5.13785" 
149     enabled="false" 
150     assemblyName="MySql.Data, Version=1.0.5.13785, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionClass="MySql.Data.MySqlClient.MySqlConnection" 
151     commandClass="MySql.Data.MySqlClient.MySqlCommand" 
152     parameterClass="MySql.Data.MySqlClient.MySqlParameter" 
153     parameterDbTypeClass="MySql.Data.MySqlClient.MySqlDbType" 
154     parameterDbTypeProperty="MySqlDbType" 
155     dataAdapterClass="MySql.Data.MySqlClient.MySqlDataAdapter" 
156     commandBuilderClass="MySql.Data.MySqlClient.MySqlCommandBuilder" 
157     usePositionalParameters="false" 
158     useParameterPrefixInSql="true" 
159     useParameterPrefixInParameter="true" 
160     parameterPrefix="?"/>
161 <provider name="SQLite3"
162     description="SQLite, SQLite.NET provider V0.21.1869.3794"
163     enabled="false"
164     assemblyName="SQLite.NET, Version=0.21.1869.3794, Culture=neutral, PublicKeyToken=c273bd375e695f9c" 
165     connectionClass="Finisar.SQLite.SQLiteConnection"
166     commandClass="Finisar.SQLite.SQLiteCommand"
167     parameterClass="Finisar.SQLite.SQLiteParameter"
168     parameterDbTypeClass="System.Data.DbType, System.Data"
169     parameterDbTypeProperty="DbType"
170     dataAdapterClass="Finisar.SQLite.SQLiteDataAdapter"
171     commandBuilderClass="Finisar.SQLite.SQLiteCommandBuilder"
172     usePositionalParameters="false"
173     useParameterPrefixInSql="true"
174     useParameterPrefixInParameter="true"
175     parameterPrefix="@"
176     setDbParameterPrecision="false"
177     setDbParameterScale="false"/>
178 <provider
179     name="Firebird1.7" 
180     description="Firebird, Firebird SQL .NET provider V1.7.0.33200" 
181     enabled="false" 
182     assemblyName="FirebirdSql.Data.Firebird, Version=1.7.0.33200, Culture=neutral, PublicKeyToken=fa843d180294369d" connectionClass="FirebirdSql.Data.Firebird.FbConnection" 
183     commandClass="FirebirdSql.Data.Firebird.FbCommand" 
184     parameterClass="FirebirdSql.Data.Firebird.FbParameter" 
185     parameterDbTypeClass="FirebirdSql.Data.Firebird.FbDbType" 
186     parameterDbTypeProperty="FbDbType" 
187     dataAdapterClass="FirebirdSql.Data.Firebird.FbDataAdapter" 
188     commandBuilderClass="FirebirdSql.Data.Firebird.FbCommandBuilder" 
189     usePositionalParameters="false" 
190     useParameterPrefixInSql="true" 
191     useParameterPrefixInParameter="true" 
192     parameterPrefix="@"/>
193 <provider
194     name="PostgreSql0.7" 
195     description="PostgreSql, Npgsql provider V0.7.0.0" 
196     enabled="false" 
197     assemblyName="Npgsql, Version=0.7.0.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" 
198     connectionClass="Npgsql.NpgsqlConnection" 
199     commandClass="Npgsql.NpgsqlCommand" 
200     parameterClass="Npgsql.NpgsqlParameter" 
201     parameterDbTypeClass="NpgsqlTypes.NpgsqlDbType" 
202     parameterDbTypeProperty="NpgsqlDbType" 
203     dataAdapterClass="Npgsql.NpgsqlDataAdapter" 
204     commandBuilderClass="Npgsql.NpgsqlCommandBuilder" 
205     usePositionalParameters="false" 
206     useParameterPrefixInSql="true" 
207     useParameterPrefixInParameter="true" 
208     parameterPrefix=":"/>
209 <provider
210     name="PostgreSql0.7.1" 
211     description="PostgreSql, Npgsql provider V0.7.1.0" 
212     enabled="false" 
213     assemblyName="Npgsql, Version=0.7.1.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" 
214     connectionClass="Npgsql.NpgsqlConnection" 
215     commandClass="Npgsql.NpgsqlCommand" 
216     parameterClass="Npgsql.NpgsqlParameter" 
217     parameterDbTypeClass="NpgsqlTypes.NpgsqlDbType" 
218     parameterDbTypeProperty="NpgsqlDbType" 
219     dataAdapterClass="Npgsql.NpgsqlDataAdapter" 
220     commandBuilderClass="Npgsql.NpgsqlCommandBuilder" 
221     usePositionalParameters="false" 
222     useParameterPrefixInSql="true" 
223     useParameterPrefixInParameter="true" 
224     parameterPrefix=":"/>    
225 <provider 
226     name="iDb2.10" 
227     description="IBM DB2 Provider, V 10.0" 
228     enabled="false" 
229     assemblyName="IBM.Data.DB2.iSeries, Version=10.0.0.0,Culture=neutral, PublicKeyToken=9cdb2ebfb1f93a26, Custom=null" connectionClass="IBM.Data.DB2.iSeries.iDB2Connection" 
230     commandClass="IBM.Data.DB2.iSeries.iDB2Command" 
231     parameterClass="IBM.Data.DB2.iSeries.iDB2Parameter" 
232     parameterDbTypeClass="IBM.Data.DB2.iSeries.iDB2DbType" 
233     parameterDbTypeProperty="iDB2DbType" 
234     dataAdapterClass="IBM.Data.DB2.iSeries.iDB2DataAdapter" 
235     commandBuilderClass="IBM.Data.DB2.iSeries.iDB2CommandBuilder" 
236     usePositionalParameters="true" 
237     useParameterPrefixInSql="false" 
238     useParameterPrefixInParameter="false" 
239     parameterPrefix=""/>
240 <provider 
241     name="Informix" 
242     description="Informix NET Provider, 2.81.0.0" 
243     enabled="false" 
244     assemblyName="IBM.Data.Informix, Version=2.81.0.0, Culture=neutral, PublicKeyToken=7c307b91aa13d208" 
245     connectionClass="IBM.Data.Informix.IfxConnection" 
246     commandClass="IBM.Data.Informix.IfxCommand" 
247     parameterClass="IBM.Data.Informix.IfxParameter" 
248     parameterDbTypeClass="IBM.Data.Informix.IfxType" 
249     parameterDbTypeProperty="IfxType" 
250     dataAdapterClass="IBM.Data.Informix.IfxDataAdapter" 
251     commandBuilderClass="IBM.Data.Informix.IfxCommandBuilder" 
252     usePositionalParameters = "true" 
253     useParameterPrefixInSql = "false" 
254     useParameterPrefixInParameter = "false" 
255     useDeriveParameters="false" 
256     />
257 </providers>
數據庫驅動代碼

 

  該文件必須存在,並且不能改變它的文件名,該文件描述了如何連接數據庫,無須配置。

  sqlmap.config配置文件簡介:

 

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
 3     <properties embedded="database.config,SqlMaps"/>
 4     <settings>
 5         <setting useStatementNamespaces="${useStatementNamespaces}"/>
 6         <setting cacheModelsEnabled="true"/>
 7         <setting validateSqlMap="false"/>
 8     </settings>
 9     <!-- 加載數據庫驅動 -->
10     <providers embedded="providers.config,SqlMaps"/>
11     <database>
12         <provider name="${provider}"/>
13         <!--<dataSource name="iBatisNet" connectionString="data source=${datasource};database=${database};user id=${userid};password=${password};connection reset=false;connection lifetime=5; min pool size=1; max pool size=50"/>-->
14       <dataSource name="iBatisNet" connectionString="data source=.;database=ibatisdata;user id=sa;password=805072;connection reset=false;connection lifetime=5; min pool size=1; max pool size=50"/>
15     </database>
16 
17     <sqlMaps>
18         <!-- 所有的xml文件-->
19         <sqlMap embedded="Map.Classes.xml,SqlMaps"/>
20     </sqlMaps>
21 </sqlMapConfig>
代碼

 

  主要介紹一下這個配置文件的節點:

  1,properties節點:

       可以根據需要配置一些常量屬性。如果這些屬性有很多的話可以單獨寫一個文件里面,再通過resource(或url, embedded分別是引用url和編譯在程序中的資源文件)屬性引用  進來。

resource

指定the properties文件從application的根目錄進行加載

resource="properties.config"

url

指定the properties文件從文件的絕對路徑進行加載

url="c:\Web\MyApp\Resources\properties.config"

或者

url="file://c:\Web\MyApp\Resources\properties.config"

embedded

指定文件可以作為程序集的資源文件進行加載'

embedded=" database.config,SqlMaps”

   2,settings節點:

cacheModelsEnabled

是否啟用sqlMap上的緩存機制

Example: cacheModelsEnabled=”true”

Default: true (enabled)

useStatementNamespaces

是否使用Satement命名空間,這里的命名空間指的是映射文件中sqlMap節點的namespace屬性,如上例中針對Person表的映射文件sqlMap節點

<sqlMap namespace="Person" xmlns="http://ibatis.apache.org/mapping"

xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance> 這里,指定了此sqlMap節點下定義的操作均叢屬於“Person”命名空間在useStatementNamespaces=”true”的情況下,Statement調用需追加命名空間,如:sqlMap.Update(“Person.UpdatePerson”,person);否則直接通過Statement名稱調用即可,如sqlMap.Update(“UpdatePerson”,person);但請注意此時需要保證所有映射文件中,statement定義無重名

Example: useStatementNamespaces=”false”

Default: false (disabled)

validateSqlMap

是配置要不要啟示SqlMapConfig.xsd schema驗證映射文件.

Example: validateSqlMap=”false”

Default: false (disabled)

   3,provider節點:

      配置數據驅動提供類配置文件的路徑和文件名,通過resource(或url, embedded分別是引用url和編譯在程序中的資源文件)屬性引用進來,參數的含義同properties。
      ADO.NET是通過數據訪問提供程序(Provider)訪問數據庫。IBatisNet使用的是插件式結構來使用這些數據庫提供程序,每一個Provider對應於providers.config文件中   定義的一個provider項。1.3版本的Provider.config文件中定義了已經實現的16個provider(如上圖),通過設置這個文件中的幾個參數來決定使用哪個數據庫提供程序。

   4,database節點 :

    主要指定數據庫驅動,和數據庫連接字符串

<database>

<provider name="${provider}"/>
        <dataSource name="iBatisNet" connectionString="data source=${datasource};database=${database};user id=${userid};password=${password};connection reset=false;connection lifetime=5; min pool size=1; max pool size=50"/>

</database>

   5,sqlMaps節點 :
        sqlMap節點指定了映射文件的位置,配置中可以出現多個sqlMap節點,以指定項目內所包含的所有映射文件。

 

  1,創建實體(要養成一個良好的編碼習慣,代碼一定要加上注釋)

 

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace Model
 7 {
 8     [Serializable]
 9     public class Calsses : Entity
10     {
11         private int id;
12         /// <summary>
13         /// 班級編號
14         /// </summary>
15         public int Id
16         {
17             get { return id; }
18             set { id = value; }
19         }
20         private string name;
21         /// <summary>
22         /// 班級名稱
23         /// </summary>
24         public string Name
25         {
26             get { return name; }
27             set { name = value; }
28         }
29         private string description;
30         /// <summary>
31         /// 班級描述
32         /// </summary>
33         public string Description
34         {
35             get { return description; }
36             set { description = value; }
37         }
38     }
39 }
代碼

 

 2,XML配置文件解釋

這里見簡單介紹一下常用的配置(至少我常用配置(菜鳥級程序員)),具體其他的配置在后面再講。

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <sqlMap namespace="Classes" xmlns="http://ibatis.apache.org/mapping"
 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
 4 <!--配置你的實體類的別名,一般的都是一個實體類對應一個xml-->
 5   <alias>
 6     <typeAlias alias="classes" type="Model.Calsses,Model" />
 7   </alias>
 8 
 9   <!--找到你的實體類與數據庫字段的對應關系,如果數據庫字段與實體類一樣 這個可以省略不要-->
10   <resultMaps>
11     <resultMap id="SelectAllResult" class="classes">
12       <result property="Id" column="calsses_id" />
13       <result property="Name" column="classes_name" />
14       <result property="Description" column="classes_description" />
15     </resultMap>
16   </resultMaps>
17   <statements>
18     <!--查詢操作 id是你在操作類(也就是我的項目中的service類)中要用到的,resultMap表示返回結果的類型-->
19     <select id="SelectAllClasses" resultMap="SelectAllResult">
20       select  calsses_id as Id,
21       classes_name as Name,
22       classes_description as Description
23       from calsses
24     </select>
25     <!--查詢操作 id是你在操作類(也就是我的項目中的service類)中要用到的,resultMap表示返回結果的類型,parameterClass傳過來參數的類型,要注意傳過來的參數名要跟下面的字段可以一樣也可以不一樣。-->
26     <select id="SelectByClassesId" resultClass="classes" parameterClass="int">
27       select
28       calsses_id as Id,
29       classes_name as Name,
30       classes_description as Description
31       from calsses
32       where calsses_id = #calsses_id#
33     </select>
34     <!--添加操作 id是你在操作類(也就是我的項目中的service類)中要用到的,parameterClass傳過來參數的類型,這里是實體類。注意下面的selectKey,如果你的id是自增的它會自動把值賦給id-->
35     <insert id="InsertClasses" parameterClass="classes">
36       <selectKey property="Id" type="post" resultClass="int">
37         ${selectKey}
38       </selectKey>
39       insert into calsses(classes_name,classes_description) values(#Name#,#Description#)
40     </insert>
41     <!--修改操作 id是你在操作類(也就是我的項目中的service類)中要用到的,parameterClass傳過來參數的類型,這里是實體類。-->
42     <update id="UpdateClasses" parameterClass="classes">
43       update calsses set classes_name=#Name#,
44       classes_description=#Description#
45       where calsses_id=#Id#
46     </update>
47     <!--刪除操作 id是你在操作類(也就是我的項目中的service類)中要用到的,parameterClass傳過來參數的類型-->
48     <delete id="DeleteClasses" parameterClass="int">
49       delete calsses
50       where calsses_id = #calsses_id#
51     </delete>
52   </statements>
53 </sqlMap>
代碼

 3,簡單看一下IbatisNet的ISqlMapper

       在IbatisNet中,我們把所有的配置和映射都放在XML文件里(當然,這未必是一定需要的),但是,XML文件不是可執行的,所以,如果我們要在我們的c#代碼里使用IbatisNet的映射,就必須通過一個類來加載、分析、使用它。

      所以在IbatisNet中,提供給了我們很多的API來做這些事情,配置以及映射文件的加載和監視是在 創建SqlMapper實例的時候進行的,而所有的數據映射的工作以及我們對數據庫的操作,是需要在SqlMapper實例上調用方法來完成 的,SqlMapper實例具有多線程並且長期活動的性質,在IbatisNet外界,可以隨處使用這樣的方法來調用得到SqlMapper實例ISqlMapper mapper=Mapper.Instance();在我們第一次調用Mapper.Instance()的時候,DomSqlMapBuilder對象會通過解析SqlMap.config(默認路徑和命名)文件來出創建SqlMapper實例,在 以后的調用中,則會使用緩存中的mapper對象,那么,如果我們在應用程序運行期間,修改了我們的映射文檔,結果是怎樣的呢。如果我們使用Mapper.Instance()的方法來得到mapper對象,則在這個過程中,默認使用了DomSqlMapBuilder.ConfigureAndWatch的方法來監視配置文件的狀況,如果期間出現了改動,SqlMapper對象會被安全的重新載入,當然,如果你不喜歡IbatisNet替你做這件事情,則可以通過ISqlMapper mapper=builder.Configure()來獲取sqlMapper實例。

iBatis提供了多種方法對SqlMapper.Config文檔的內容進行加載,前面我們講過默認情況下SqlMapper.Config的存放位置,那么如果我們不是放在了默認位置或者不是默認的文件名該怎么辦呢?在默認情況下,我們可以使用這樣的方法得到SqlMapper實例 ISqlMapper mapper=builder.Configure(),其實這個Configure可以接受一個參數,他可以是String類型,FilePath對象,Uri對象XmlDocument對象,甚至是Stream類型 比如:

String str=”file://F:/databse.config”;

builder.Configure(str);

我就采用傳參數的方式:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using IBatisNet.DataMapper;
 6 using System.Reflection;
 7 using System.IO;
 8 using IBatisNet.DataMapper.Configuration;
 9 
10 namespace SqlMaps
11 {
12   public class MyIbatisNet
13     {
14       public static ISqlMapper SqlMap;
15       private static readonly object syncObj = new object();
16       static MyIbatisNet() 
17       {
18           if (SqlMap == null) 
19           {
20               lock (syncObj) 
21               {
22                   if (SqlMap == null)
23                   {
24                       Assembly assembly = Assembly.Load("SqlMaps");
25                       Stream stream = assembly.GetManifestResourceStream("SqlMaps.sqlmap.config");
26                       DomSqlMapBuilder builder = new DomSqlMapBuilder();
27                       SqlMap = builder.Configure(stream);
28                   }
29               }
30           }
31       }
32     }
33 }
代碼

 

這是一個簡單的單例模式。通過反射找到那個配置文件然后傳給builder.Configure();

4,簡單看一下操作類是如何來執行增刪改查的。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using Model;
 6 
 7 namespace BLLService
 8 {
 9     public class ClassesService : BaseBLLService
10     {
11 
12         /// <summary>
13         /// 2013-07-26
14         /// 獲取全部班級信息
15         /// </summary>
16         /// <returns>班級實體集合</returns>
17         public IList<Calsses> GetAllClasses()
18         {
19             return SqlMap.QueryForList<Calsses>("SelectAllClasses", null);
20         }
21         /// <summary>
22         /// 2013-07-26
23         /// 查詢班級實體
24         /// </summary>
25         /// <param name="calsses_id">班級編號</param>
26        /// <returns>班級實體</returns>
27         public Calsses GetClassesByid(int calsses_id)
28         {
29             return (Calsses)SqlMap.QueryForObject("SelectByClassesId", calsses_id);
30         }
31         /// <summary>
32         /// 2013-07-26
33         /// 添加班級信息
34         /// </summary>
35         /// <param name="calssses">班級實體</param>
36         public void AddClaases(Calsses calssses)
37         {
38             SqlMap.Insert("InsertClasses", calssses);
39         }
40         /// <summary>
41         /// 2013-07-26
42         /// 修改班級信息
43         /// </summary>
44         /// <param name="calsses">班級實體</param>
45         public void UpdateClasses(Calsses calsses)
46         {
47             SqlMap.Update("UpdateClasses",calsses);
48         }
49         /// <summary>
50         /// 2013-07-26
51         /// 刪除班級信息
52         /// </summary>
53         /// <param name="calslesid">班級編號</param>
54         public void DeleteClasses(int calslesid)
55         {
56             SqlMap.Delete("DeleteClasses", calslesid);
57         }
58     }
59 }
代碼

 

這里主要簡單的提供了幾個簡單的方法,對於一些其它的方法的調用將在后面講。第一篇就簡單的介紹的這里,主要是為了讓初學者可以快速的用起來。下面有一個簡單的Demo可以下載,供初學者參考使用…………

注意的一些細節(作為初學者可能會碰到的問題)

1,配置沒有設置為嵌入的資源,導致找不到文件

2,寫錯應用程序集的名字,或者命名空間不統一。

好了……就寫到這兒吧……自己也是一個菜鳥,寫它只是為了鞏固一下自己學到的知識(上一個項目中剛用的,屬於短平快的學習方式),肯定有很多不對的地方,歡迎大家指正………………

源碼下載地址:http://download.csdn.net/detail/woaixiaozhi/5822555

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM