zoukankan      html  css  js  c++  java
  • 跟初学者学习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: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,写错应用程序集的名字,或者命名空间不统一。

    好了……就写到这儿吧……自己也是一个菜鸟,写它只是为了巩固一下自己学到的知识(上一个项目中刚用的,属于短平快的学习方式),肯定有很多不对的地方,欢迎大家指正………………

    源码下载地址:http://download.csdn.net/detail/woaixiaozhi/5822555

  • 相关阅读:
    Redis-cluster集群【第二篇】:redis持久化
    Redis-cluster集群【第一篇】:redis安装及redis数据类型
    django2.0 官方中文文档地址
    jenkins设置CSRF 协议(CRUMB值设置)
    elasticsearch-dump 迁移es数据 (elasticdump)
    大独裁者最后演讲台词
    面向对象的弊端是什么(转)
    IntelliJ IDEA 破解
    Django 2.0.1 官方文档翻译:接下来读什么(page 14)
    Django 2.0.1 官方文档翻译: 高级教程:如何编写可重用的app (page 13)
  • 原文地址:https://www.cnblogs.com/woaixiaozhi/p/3209719.html
Copyright © 2011-2022 走看看