写在前面的话:我自己也是一个初学者,写这个专题只是为了对学过知识的巩固,如果有什么不对的地方,欢迎大家指正……………………
第一篇就简单介绍一下什么是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
<?xml version="1.0" encoding="utf-8" ?>
<settings>
<!-- 用户的数据库连接在这里设置-->
<add key="userid" value="sa" />
<add key="password" value="805072" />
<add key="database" value="ibatisdata" />
<add key="datasource" value="." />
<add key="selectKey" value="select @@IDENTITY as value" />
<add key="directory" value="Maps" />
<add key="useStatementNamespaces" value="false" />
<add key="provider" value="sqlServer2.0" />
</settings>
这个配置文件主要是配置数据库的连接,它是以键值对的形式存在。
再来简单介绍一下providers.config
<?xml version="1.0" encoding="utf-8"?>
<providers
xmlns="http://ibatis.apache.org/providers"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<clear/>
<provider
name="sqlServer1.0"
description="Microsoft SQL Server 7.0/2000, provider V1.0.3300.0 in framework .NET V1.0"
enabled="true"
assemblyName="System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionClass="System.Data.SqlClient.SqlConnection"
commandClass="System.Data.SqlClient.SqlCommand"
parameterClass="System.Data.SqlClient.SqlParameter"
parameterDbTypeClass="System.Data.SqlDbType"
parameterDbTypeProperty="SqlDbType"
dataAdapterClass="System.Data.SqlClient.SqlDataAdapter"
commandBuilderClass="System.Data.SqlClient.SqlCommandBuilder"
usePositionalParameters="false"
useParameterPrefixInSql="true"
useParameterPrefixInParameter="true"
parameterPrefix="@"/>
<provider
name="sqlServer1.1"
description="Microsoft SQL Server 7.0/2000, provider V1.0.5000.0 in framework .NET V1.1"
enabled="true"
default="true"
assemblyName="System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionClass="System.Data.SqlClient.SqlConnection"
commandClass="System.Data.SqlClient.SqlCommand"
parameterClass="System.Data.SqlClient.SqlParameter"
parameterDbTypeClass="System.Data.SqlDbType"
parameterDbTypeProperty="SqlDbType"
dataAdapterClass="System.Data.SqlClient.SqlDataAdapter"
commandBuilderClass="System.Data.SqlClient.SqlCommandBuilder"
usePositionalParameters="false"
useParameterPrefixInSql="true"
useParameterPrefixInParameter="true"
parameterPrefix="@"/>
<provider
name="sqlServer2.0"
enabled="true"
description="Microsoft SQL Server 2005, provider V2.0.50215.0 in framework .NET V2.0"
assemblyName="System.Data, Version=2.0.50215.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
connectionClass="System.Data.SqlClient.SqlConnection"
commandClass="System.Data.SqlClient.SqlCommand"
parameterClass="System.Data.SqlClient.SqlParameter"
parameterDbTypeClass="System.Data.SqlDbType"
parameterDbTypeProperty="SqlDbType"
dataAdapterClass="System.Data.SqlClient.SqlDataAdapter"
commandBuilderClass=" System.Data.SqlClient.SqlCommandBuilder"
usePositionalParameters = "false"
useParameterPrefixInSql = "true"
useParameterPrefixInParameter = "true"
parameterPrefix="@"
/>
<provider name="OleDb1.1"
description="OleDb, provider V1.0.5000.0 in framework .NET V1.1"
enabled="true"
assemblyName="System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionClass="System.Data.OleDb.OleDbConnection"
commandClass="System.Data.OleDb.OleDbCommand"
parameterClass="System.Data.OleDb.OleDbParameter"
parameterDbTypeClass="System.Data.OleDb.OleDbType"
parameterDbTypeProperty="OleDbType"
dataAdapterClass="System.Data.OleDb.OleDbDataAdapter"
commandBuilderClass="System.Data.OleDb.OleDbCommandBuilder"
usePositionalParameters="true"
useParameterPrefixInSql="false"
useParameterPrefixInParameter="false"
parameterPrefix=""/>
<provider
name="Odbc1.1"
description="Odbc, provider V1.0.5000.0 in framework .NET V1.1"
enabled="true"
assemblyName="System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionClass="System.Data.Odbc.OdbcConnection"
commandClass="System.Data.Odbc.OdbcCommand"
parameterClass="System.Data.Odbc.OdbcParameter"
parameterDbTypeClass="System.Data.Odbc.OdbcType"
parameterDbTypeProperty="OdbcType"
dataAdapterClass="System.Data.Odbc.OdbcDataAdapter"
commandBuilderClass="System.Data.Odbc.OdbcCommandBuilder"
usePositionalParameters="true"
useParameterPrefixInSql="false"
useParameterPrefixInParameter="false"
parameterPrefix="@"/>
<provider
name="oracle9.2"
description="Oracle, Oracle provider V9.2.0.401"
enabled="false"
assemblyName="Oracle.DataAccess, Version=9.2.0.401, Culture=neutral, PublicKeyToken=89b483f429c47342" connectionClass="Oracle.DataAccess.Client.OracleConnection"
commandClass="Oracle.DataAccess.Client.OracleCommand"
parameterClass="Oracle.DataAccess.Client.OracleParameter"
parameterDbTypeClass="Oracle.DataAccess.Client.OracleDbType"
parameterDbTypeProperty="OracleDbType"
dataAdapterClass="Oracle.DataAccess.Client.OracleDataAdapter"
commandBuilderClass="Oracle.DataAccess.Client.OracleCommandBuilder"
usePositionalParameters="false"
useParameterPrefixInSql="true"
useParameterPrefixInParameter="false"
parameterPrefix=":"
useDeriveParameters="false"/>
<provider
name="oracle10.1"
description="Oracle, oracle provider V10.1.0.301"
enabled="false"
assemblyName="Oracle.DataAccess, Version=10.1.0.301, Culture=neutral, PublicKeyToken=89b483f429c47342" connectionClass="Oracle.DataAccess.Client.OracleConnection"
commandClass="Oracle.DataAccess.Client.OracleCommand"
parameterClass="Oracle.DataAccess.Client.OracleParameter"
parameterDbTypeClass="Oracle.DataAccess.Client.OracleDbType"
parameterDbTypeProperty="OracleDbType"
dataAdapterClass="Oracle.DataAccess.Client.OracleDataAdapter"
commandBuilderClass="Oracle.DataAccess.Client.OracleCommandBuilder"
usePositionalParameters="true"
useParameterPrefixInSql="true"
useParameterPrefixInParameter="true"
parameterPrefix=":"
useDeriveParameters="false"/>
<provider
name="oracleClient1.0"
description="Oracle, Microsoft provider V1.0.5000.0"
enabled="false"
assemblyName="System.Data.OracleClient, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" connectionClass="System.Data.OracleClient.OracleConnection"
commandClass="System.Data.OracleClient.OracleCommand"
parameterClass="System.Data.OracleClient.OracleParameter"
parameterDbTypeClass="System.Data.OracleClient.OracleType"
parameterDbTypeProperty="OracleType"
dataAdapterClass="System.Data.OracleClient.OracleDataAdapter"
commandBuilderClass="System.Data.OracleClient.OracleCommandBuilder"
usePositionalParameters="false"
useParameterPrefixInSql="true"
useParameterPrefixInParameter="false"
parameterPrefix=":"/>
<provider
name="ByteFx"
description="MySQL, ByteFx provider V0.7.6.15073"
enabled="false"
assemblyName="ByteFX.MySqlClient, Version=0.7.6.15073, Culture=neutral, PublicKeyToken=f2fef6fed1732fc1" connectionClass="ByteFX.Data.MySqlClient.MySqlConnection"
commandClass="ByteFX.Data.MySqlClient.MySqlCommand"
parameterClass="ByteFX.Data.MySqlClient.MySqlParameter"
parameterDbTypeClass="ByteFX.Data.MySqlClient.MySqlDbType"
parameterDbTypeProperty="MySqlDbType"
dataAdapterClass="ByteFX.Data.MySqlClient.MySqlDataAdapter"
commandBuilderClass="ByteFX.Data.MySqlClient.MySqlCommandBuilder"
usePositionalParameters="false"
useParameterPrefixInSql="true"
useParameterPrefixInParameter="true"
parameterPrefix="@"/>
<provider
name="MySql"
description="MySQL, MySQL provider V1.0.5.13785"
enabled="false"
assemblyName="MySql.Data, Version=1.0.5.13785, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionClass="MySql.Data.MySqlClient.MySqlConnection"
commandClass="MySql.Data.MySqlClient.MySqlCommand"
parameterClass="MySql.Data.MySqlClient.MySqlParameter"
parameterDbTypeClass="MySql.Data.MySqlClient.MySqlDbType"
parameterDbTypeProperty="MySqlDbType"
dataAdapterClass="MySql.Data.MySqlClient.MySqlDataAdapter"
commandBuilderClass="MySql.Data.MySqlClient.MySqlCommandBuilder"
usePositionalParameters="false"
useParameterPrefixInSql="true"
useParameterPrefixInParameter="true"
parameterPrefix="?"/>
<provider name="SQLite3"
description="SQLite, SQLite.NET provider V0.21.1869.3794"
enabled="false"
assemblyName="SQLite.NET, Version=0.21.1869.3794, Culture=neutral, PublicKeyToken=c273bd375e695f9c"
connectionClass="Finisar.SQLite.SQLiteConnection"
commandClass="Finisar.SQLite.SQLiteCommand"
parameterClass="Finisar.SQLite.SQLiteParameter"
parameterDbTypeClass="System.Data.DbType, System.Data"
parameterDbTypeProperty="DbType"
dataAdapterClass="Finisar.SQLite.SQLiteDataAdapter"
commandBuilderClass="Finisar.SQLite.SQLiteCommandBuilder"
usePositionalParameters="false"
useParameterPrefixInSql="true"
useParameterPrefixInParameter="true"
parameterPrefix="@"
setDbParameterPrecision="false"
setDbParameterScale="false"/>
<provider
name="Firebird1.7"
description="Firebird, Firebird SQL .NET provider V1.7.0.33200"
enabled="false"
assemblyName="FirebirdSql.Data.Firebird, Version=1.7.0.33200, Culture=neutral, PublicKeyToken=fa843d180294369d" connectionClass="FirebirdSql.Data.Firebird.FbConnection"
commandClass="FirebirdSql.Data.Firebird.FbCommand"
parameterClass="FirebirdSql.Data.Firebird.FbParameter"
parameterDbTypeClass="FirebirdSql.Data.Firebird.FbDbType"
parameterDbTypeProperty="FbDbType"
dataAdapterClass="FirebirdSql.Data.Firebird.FbDataAdapter"
commandBuilderClass="FirebirdSql.Data.Firebird.FbCommandBuilder"
usePositionalParameters="false"
useParameterPrefixInSql="true"
useParameterPrefixInParameter="true"
parameterPrefix="@"/>
<provider
name="PostgreSql0.7"
description="PostgreSql, Npgsql provider V0.7.0.0"
enabled="false"
assemblyName="Npgsql, Version=0.7.0.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"
connectionClass="Npgsql.NpgsqlConnection"
commandClass="Npgsql.NpgsqlCommand"
parameterClass="Npgsql.NpgsqlParameter"
parameterDbTypeClass="NpgsqlTypes.NpgsqlDbType"
parameterDbTypeProperty="NpgsqlDbType"
dataAdapterClass="Npgsql.NpgsqlDataAdapter"
commandBuilderClass="Npgsql.NpgsqlCommandBuilder"
usePositionalParameters="false"
useParameterPrefixInSql="true"
useParameterPrefixInParameter="true"
parameterPrefix=":"/>
<provider
name="PostgreSql0.7.1"
description="PostgreSql, Npgsql provider V0.7.1.0"
enabled="false"
assemblyName="Npgsql, Version=0.7.1.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"
connectionClass="Npgsql.NpgsqlConnection"
commandClass="Npgsql.NpgsqlCommand"
parameterClass="Npgsql.NpgsqlParameter"
parameterDbTypeClass="NpgsqlTypes.NpgsqlDbType"
parameterDbTypeProperty="NpgsqlDbType"
dataAdapterClass="Npgsql.NpgsqlDataAdapter"
commandBuilderClass="Npgsql.NpgsqlCommandBuilder"
usePositionalParameters="false"
useParameterPrefixInSql="true"
useParameterPrefixInParameter="true"
parameterPrefix=":"/>
<provider
name="iDb2.10"
description="IBM DB2 Provider, V 10.0"
enabled="false"
assemblyName="IBM.Data.DB2.iSeries, Version=10.0.0.0,Culture=neutral, PublicKeyToken=9cdb2ebfb1f93a26, Custom=null" connectionClass="IBM.Data.DB2.iSeries.iDB2Connection"
commandClass="IBM.Data.DB2.iSeries.iDB2Command"
parameterClass="IBM.Data.DB2.iSeries.iDB2Parameter"
parameterDbTypeClass="IBM.Data.DB2.iSeries.iDB2DbType"
parameterDbTypeProperty="iDB2DbType"
dataAdapterClass="IBM.Data.DB2.iSeries.iDB2DataAdapter"
commandBuilderClass="IBM.Data.DB2.iSeries.iDB2CommandBuilder"
usePositionalParameters="true"
useParameterPrefixInSql="false"
useParameterPrefixInParameter="false"
parameterPrefix=""/>
<provider
name="Informix"
description="Informix NET Provider, 2.81.0.0"
enabled="false"
assemblyName="IBM.Data.Informix, Version=2.81.0.0, Culture=neutral, PublicKeyToken=7c307b91aa13d208"
connectionClass="IBM.Data.Informix.IfxConnection"
commandClass="IBM.Data.Informix.IfxCommand"
parameterClass="IBM.Data.Informix.IfxParameter"
parameterDbTypeClass="IBM.Data.Informix.IfxType"
parameterDbTypeProperty="IfxType"
dataAdapterClass="IBM.Data.Informix.IfxDataAdapter"
commandBuilderClass="IBM.Data.Informix.IfxCommandBuilder"
usePositionalParameters = "true"
useParameterPrefixInSql = "false"
useParameterPrefixInParameter = "false"
useDeriveParameters="false"
/>
</providers>
数据库驱动代码
该文件必须存在,并且不能改变它的文件名,该文件描述了如何连接数据库,无须配置。
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 embedded="database.config,SqlMaps"/>
<settings>
<setting useStatementNamespaces="${useStatementNamespaces}"/>
<setting cacheModelsEnabled="true"/>
<setting validateSqlMap="false"/>
</settings>
<!-- 加载数据库驱动 -->
<providers embedded="providers.config,SqlMaps"/>
<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"/>-->
<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"/>
</database>
<sqlMaps>
<!-- 所有的xml文件-->
<sqlMap embedded="Map.Classes.xml,SqlMaps"/>
</sqlMaps>
</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,创建实体(要养成一个良好的编码习惯,代码一定要加上注释)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Model
{
[Serializable]
public class Calsses : Entity
{
private int id;
/// <summary>
/// 班级编号
/// </summary>
public int Id
{
get { return id; }
set { id = value; }
}
private string name;
/// <summary>
/// 班级名称
/// </summary>
public string Name
{
get { return name; }
set { name = value; }
}
private string description;
/// <summary>
/// 班级描述
/// </summary>
public string Description
{
get { return description; }
set { description = value; }
}
}
}
2,XML配置文件解释
这里见简单介绍一下常用的配置(至少我常用配置(菜鸟级程序员)),具体其他的配置在后面再讲。
<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="Classes" xmlns="http://ibatis.apache.org/mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<!--配置你的实体类的别名,一般的都是一个实体类对应一个xml-->
<alias>
<typeAlias alias="classes" type="Model.Calsses,Model" />
</alias>
<!--找到你的实体类与数据库字段的对应关系,如果数据库字段与实体类一样 这个可以省略不要-->
<resultMaps>
<resultMap id="SelectAllResult" class="classes">
<result property="Id" column="calsses_id" />
<result property="Name" column="classes_name" />
<result property="Description" column="classes_description" />
</resultMap>
</resultMaps>
<statements>
<!--查询操作 id是你在操作类(也就是我的项目中的service类)中要用到的,resultMap表示返回结果的类型-->
<select id="SelectAllClasses" resultMap="SelectAllResult">
select calsses_id as Id,
classes_name as Name,
classes_description as Description
from calsses
</select>
<!--查询操作 id是你在操作类(也就是我的项目中的service类)中要用到的,resultMap表示返回结果的类型,parameterClass传过来参数的类型,要注意传过来的参数名要跟下面的字段可以一样也可以不一样。-->
<select id="SelectByClassesId" resultClass="classes" parameterClass="int">
select
calsses_id as Id,
classes_name as Name,
classes_description as Description
from calsses
where calsses_id = #calsses_id#
</select>
<!--添加操作 id是你在操作类(也就是我的项目中的service类)中要用到的,parameterClass传过来参数的类型,这里是实体类。注意下面的selectKey,如果你的id是自增的它会自动把值赋给id-->
<insert id="InsertClasses" parameterClass="classes">
<selectKey property="Id" type="post" resultClass="int">
${selectKey}
</selectKey>
insert into calsses(classes_name,classes_description) values(#Name#,#Description#)
</insert>
<!--修改操作 id是你在操作类(也就是我的项目中的service类)中要用到的,parameterClass传过来参数的类型,这里是实体类。-->
<update id="UpdateClasses" parameterClass="classes">
update calsses set classes_name=#Name#,
classes_description=#Description#
where calsses_id=#Id#
</update>
<!--删除操作 id是你在操作类(也就是我的项目中的service类)中要用到的,parameterClass传过来参数的类型-->
<delete id="DeleteClasses" parameterClass="int">
delete calsses
where calsses_id = #calsses_id#
</delete>
</statements>
</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);
我就采用传参数的方式:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IBatisNet.DataMapper;
using System.Reflection;
using System.IO;
using IBatisNet.DataMapper.Configuration;
namespace SqlMaps
{
public class MyIbatisNet
{
public static ISqlMapper SqlMap;
private static readonly object syncObj = new object();
static MyIbatisNet()
{
if (SqlMap == null)
{
lock (syncObj)
{
if (SqlMap == null)
{
Assembly assembly = Assembly.Load("SqlMaps");
Stream stream = assembly.GetManifestResourceStream("SqlMaps.sqlmap.config");
DomSqlMapBuilder builder = new DomSqlMapBuilder();
SqlMap = builder.Configure(stream);
}
}
}
}
}
}
这是一个简单的单例模式。通过反射找到那个配置文件然后传给builder.Configure();
4,简单看一下操作类是如何来执行增删改查的。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;
namespace BLLService
{
public class ClassesService : BaseBLLService
{
/// <summary>
/// 2013-07-26
/// 获取全部班级信息
/// </summary>
/// <returns>班级实体集合</returns>
public IList<Calsses> GetAllClasses()
{
return SqlMap.QueryForList<Calsses>("SelectAllClasses", null);
}
/// <summary>
/// 2013-07-26
/// 查询班级实体
/// </summary>
/// <param name="calsses_id">班级编号</param>
/// <returns>班级实体</returns>
public Calsses GetClassesByid(int calsses_id)
{
return (Calsses)SqlMap.QueryForObject("SelectByClassesId", calsses_id);
}
/// <summary>
/// 2013-07-26
/// 添加班级信息
/// </summary>
/// <param name="calssses">班级实体</param>
public void AddClaases(Calsses calssses)
{
SqlMap.Insert("InsertClasses", calssses);
}
/// <summary>
/// 2013-07-26
/// 修改班级信息
/// </summary>
/// <param name="calsses">班级实体</param>
public void UpdateClasses(Calsses calsses)
{
SqlMap.Update("UpdateClasses",calsses);
}
/// <summary>
/// 2013-07-26
/// 删除班级信息
/// </summary>
/// <param name="calslesid">班级编号</param>
public void DeleteClasses(int calslesid)
{
SqlMap.Delete("DeleteClasses", calslesid);
}
}
}
这里主要简单的提供了几个简单的方法,对于一些其它的方法的调用将在后面讲。第一篇就简单的介绍的这里,主要是为了让初学者可以快速的用起来。下面有一个简单的Demo可以下载,供初学者参考使用…………
注意的一些细节(作为初学者可能会碰到的问题)
1,配置没有设置为嵌入的资源,导致找不到文件
2,写错应用程序集的名字,或者命名空间不统一。
好了……就写到这儿吧……自己也是一个菜鸟,写它只是为了巩固一下自己学到的知识(上一个项目中刚用的,属于短平快的学习方式),肯定有很多不对的地方,欢迎大家指正………………
Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有