跟初学者学习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文件(创建项目和创建数据库我就不说了)他们分别是:
aaarticlea/png;base64,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" alt="" />
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="" />
<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,写错应用程序集的名字,或者命名空间不统一。
好了……就写到这儿吧……自己也是一个菜鸟,写它只是为了巩固一下自己学到的知识(上一个项目中刚用的,属于短平快的学习方式),肯定有很多不对的地方,欢迎大家指正………………
源码下载地址:http://download.csdn.net/detail/woaixiaozhi/5822555
跟初学者学习IbatisNet第一篇的更多相关文章
- 跟初学者学习IbatisNet第二篇
在上一篇里面我们知道了什么是IbatisNet,并且知道了如何用IbatisNet进行简单的增删改查的操作,在这一篇文章里面我们主要介绍一下IbatisNet操作存储过程. 我们一般把存储过程分为两种 ...
- RabbitMQ学习总结 第一篇:理论篇
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- 学习KnockOut第一篇之Hello World
学习KnockOut第一篇之Hello World 笔者刚开始学习KnockOut.写的内容就相当于一个学习笔记.且在此处向官网致敬,比较喜欢他们家的Live Example版块,里面有jsFiddl ...
- ActionBarSherlock学习笔记 第一篇——部署
ActionBarSherlock学习笔记 第一篇--部署 ActionBarSherlock是JakeWharton编写的一个开源框架,使用这个框架,可以实现在所有的Android ...
- 小白学习VUE第一篇文章---如何看懂网上搜索到的VUE代码或文章---使用VUE的三种模式:
小白学习VUE第一篇文章---如何看懂网上搜索到的VUE代码或文章---使用VUE的三种模式: 直接引用VUE; 将vue.js下载到本地后本目录下使用; 安装Node环境下使用; ant-desig ...
- 前端学习 linux —— 第一篇
前端学习 linux - 第一篇 本文主要介绍"linux 发行版本"."cpu 架构"."Linux 目录结构"."vi 和 v ...
- 我们一起学习WCF 第一篇初识WCF(附源码供对照学习)
前言:去年由于工作需要我学习了wcf的相关知识,初期对wcf的作用以及为何用怎么样都是一知半解,也许现在也不是非常的清晰.但是通过项目对wcf的运用在脑海里面也算有了初步的模型.今天我就把我从开始wc ...
- PHP学习记录第一篇:Ubuntu14.04下LAMP环境的搭建
最近一段时间会学习一下PHP全栈开发,将会写一系列的文章来总结学习的过程,以自勉. 第一篇记录一下LAMP环境的安装 0. 安装Apache Web服务器 安装之前先更新一下系统 sudo apt-g ...
- ASP.NET Core 学习笔记 第一篇 ASP.NET Core初探
前言 因为工作原因博客断断续续更新,其实在很早以前就有想法做一套关于ASP.NET CORE整体学习度路线,整体来说国内的环境的.NET生态环境还是相对比较严峻的,但是干一行爱一行,还是希望更多人加入 ...
随机推荐
- 洛谷1387(基础二维dp)
题目很简单,数据也很小,但是思路不妨借鉴:dp[i][j]代表以(i,j)为右下角的最长正方形边长. 类比一维里面设“以XX为结尾的最XXX(所求)”. 另外define不要乱用!尤其这种min套mi ...
- POJ244Set Operation(bitset用法)
Bryce1010模板 /* 题意:给出n个集合(n<=1000),每个集合中最多有10000个数, 每个数的范围为1~10000,给出q次询问(q<=200000), 每次给出两个数u, ...
- 记忆化搜索(DFS+DP) URAL 1501 Sense of Beauty
题目传送门 /* 题意:给了两堆牌,每次从首部取出一张牌,按颜色分配到两个新堆,分配过程两新堆的总数差不大于1 记忆化搜索(DFS+DP):我们思考如果我们将连续的两个操作看成一个集体操作,那么这个操 ...
- 关于发布WP 8.1应用信息不匹配问题的解决办法
错误提示: 与此更新关联的程序包标识符与已上传程序包中的标识符不匹配: The package identity associated with this update doesn't match ...
- struct和union
struct的小秘密 C语言中的struct可以看做变量的集合,struct的问题: 空结构体占用多大内存? 例子1:空结构体的大小 #include<stdio.h> struct ST ...
- const和volatile
const是只读变量 const修饰的变量是只读的,其本质还是变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在全局数据区分配空间 const只在编译期有用,在运行期无用 con ...
- android 防止bitmap 内存溢出
在android开发过程中经常会处理网络图片发送内存溢出,那么怎么解决这种问题? 思路: 下载到本地 通过网络获取和文件下载存放到手机中目录 代码: // 获取网络 public InputStrea ...
- 安卓自定义View教程目录
基础篇 安卓自定义View基础 - 坐标系 安卓自定义View基础 - 角度弧度 安卓自定义View基础 - 颜色 进阶篇 安卓自定义View进阶 - 分类和流程 安卓自定义View进阶 - Canv ...
- K-means算法Java实现
public class KMeansCluster { private int k;//簇的个数 private int num = 100000;//迭代次数 ...
- 【HEVC帧间预测论文】P1.9 Coding Tree Depth Estimation for Complexity Reduction of HEVC
Coding Tree Depth Estimation for Complexity Reduction of HEVC <HEVC标准介绍.HEVC帧间预测论文笔记>系列博客,目录见: ...