写在前面的话:我自己也是一个初学者,写这个专题只是为了对学过知识的巩固,如果有什么不对的地方,欢迎大家指正……………………
第一篇就简单介绍一下什么是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:WebMyAppResourcesproperties.config" 或者 url="file://c:WebMyAppResourcesproperties.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,写错应用程序集的名字,或者命名空间不统一。
好了……就写到这儿吧……自己也是一个菜鸟,写它只是为了巩固一下自己学到的知识(上一个项目中刚用的,属于短平快的学习方式),肯定有很多不对的地方,欢迎大家指正………………