自由、创新、研究、探索……

Linux/Windows Mono/DotNet [ Open Source .NET Development/ 使用开源工具进行DotNet软件开发]
posts - 516, comments - 1981, trackbacks - 142, articles - 55
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

准备工作

1.       下载ibatis软件包(http://ibatis.apache.org/dotnetdownloads.html)。

2.       创建测试数据库,并在数据库中创建一个Person 表,其中包含三个字段:

Name              Type            Size

PER_ID            Long Integer      4   not null

PER_FIRST_NAME    nvarchar         40  not null

PER_LAST_NAME     nvarchar           40  not null

PER_BIRTH_DATE    DateTime         8

PER_WEIGHT_KG     float            8

PER_HEIGHT_M      float            8

3. 为了在开发过程更加直观,我们需要将ibatisnet日志打开以便观察ibatinets运作的细节。

ibatisnet采用IBatisNet.Common.Logging.Log4Net,就是使用Log4Net纪录日志的包装。在Web.config中增加下面的配置内容:

<configSections>

         <sectionGroup name="iBATIS">

              <section name="logging" type="IBatisNet.Common.Logging.ConfigurationSectionHandler, IBatisNet.Common" />

         </sectionGroup>

         <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

</configSections>

<iBATIS>

         <logging>                       

              <logFactoryAdapter type="IBatisNet.Common.Logging.Impl.Log4NetLoggerFA, IBatisNet.Common.Logging.Log4Net">

                   <arg key="configType" value="inline" />

                   <arg key ="showLogName" value="true" />

                   <arg key ="showDataTime" value="true" />

                   <arg key ="level" value="ALL" />

                   <arg key ="dateTimeFormat" value="yyyy/MM/dd HH:mm:ss:SSS" />

              </logFactoryAdapter>                

         </logging>

     </iBATIS>

     <!-- This section contains the log4net configuration settings -->

     <log4net>

         <!-- Define some output appenders -->

         <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">

              <param name="File" value="log.txt" />

              <param name="AppendToFile" value="true" />

              <param name="MaxSizeRollBackups" value="2" />

              <param name="MaximumFileSize" value="100KB" />

              <param name="RollingStyle" value="Size" />

              <param name="StaticLogFileName" value="true" />

              <layout type="log4net.Layout.PatternLayout">

                   <param name="Header" value="[Header]\r\n" />

                   <param name="Footer" value="[Footer]\r\n" />

                   <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />

              </layout>

         </appender>

                   <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">

              <layout type="log4net.Layout.PatternLayout">

                   <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%X{auth}&gt; - %m%n" />

              </layout>

         </appender>       

         <!-- Set root logger level to ERROR and its appenders -->

         <root>

              <level value="DEBUG" />

              <appender-ref ref="RollingLogFileAppender" />

              <appender-ref ref="ConsoleAppender" />

         </root>

        

         <!-- Print only messages of level DEBUG or above in the packages -->

         <logger name="IBatisNet.DataMapper.Configuration.Cache.CacheModel">

              <level value="DEBUG" />

         </logger>

         <logger name="IBatisNet.DataMapper.Configuration.Statements.PreparedStatementFactory">

              <level value="DEBUG" />

         </logger>

         <logger name="IBatisNet.DataMapper.LazyLoadList">

              <level value="DEBUG" />

         </logger>

         <logger name="IBatisNet.DataAccess.DaoSession">

              <level value="DEBUG" />

         </logger>

         <logger name="IBatisNet.DataMapper.SqlMapSession">

              <level value="DEBUG" />

         </logger>

         <logger name="IBatisNet.Common.Transaction.TransactionScope">

              <level value="DEBUG" />

         </logger>

         <logger name="IBatisNet.DataAccess.Configuration.DaoProxy">

              <level value="DEBUG" />

         </logger>

     </log4net>

        

 

构建IBatisNet基础代码

IBatisNet 基础代码包括:

1IBatisNet 实例配置

一个典型的配置文件如下(具体配置项目的含义见后):

<?xml version="1.0" encoding="utf-8"?>

<sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >

 

  <!-- Rem : If used via a DataAccess context, properties tag will be ignored

  <properties resource="../../database.config"/> -->

  <properties embedded="database.config, IBatisNetDemo"/>

  <settings>

    <setting useStatementNamespaces="${useStatementNamespaces}"/>

    <setting cacheModelsEnabled="true"/>

    <setting validateSqlMap="false"/>

  </settings>

 

  <!-- Optional if resource -->

  <providers embedded="providers.config,IBatisNetDemo"/>

  <!-- ==== SqlClient configuration =========   -->

  <!-- Rem : If used via a DataAccess context, database tag will be ignored -->

  <database>

    <!-- Optional ( default ) -->

    <provider name="sqlServer1.1"/>

    <dataSource name="iBatisNet" connectionString="data source=localhost;database=Northwind;user id=sa;password=;connection reset=false;connection lifetime=5; min pool size=1; max pool size=50"/>

  </database>

 

  <sqlMaps>

    <!-- user via embedded-->

    <sqlMap embedded="Map.SqlClient.Person.xml,IBatisNetDemo"/>

  </sqlMaps>

</sqlMapConfig>

2. PO(Plain Ordinary Object)

下面是我们用作示例的一个PO:

[Serializable]

    public class Person

    {

        private int id;

        private string firstName;

        private string lastName;

        private DateTime? birthDate;

        private double? weightInKilograms;

        private double? heightInMeters;

 

        public Person() { }

 

        public int Id

        {

            get { return id; }

            set { id = value; }

        }

 

        public string FirstName

        {

            get { return firstName; }

            set { firstName = value; }

        }

 

        public string LastName

        {

            get { return lastName; }

            set { lastName = value; }

        }

 

        public DateTime? BirthDate

        {

            get { return birthDate; }

            set { birthDate = value; }

        }

 

        public double? WeightInKilograms

        {

            get { return weightInKilograms; }

            set { weightInKilograms = value; }

        }

 

        public double? HeightInMeters

        {

            get { return heightInMeters; }

            set { heightInMeters = value; }

        }

}

3.映射文件

Hibernate 不同。因为需要人工编写SQL 代码,IBatisNet 的映射文件一般采

用手动编写(通过Copy/Paste,手工编写映射文件也并没想象中的麻烦)。

针对上面PO 的映射代码如下:

<?xml version="1.0" encoding="utf-8" ?>

 

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

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >

 

  <alias>

    <typeAlias alias="Person" type="IBatisNetDemo.Domain.Person,IBatisNetDemo" />

  </alias>

 

  <resultMaps>

    <resultMap id="SelectAllResult" class="Person">

      <result property="Id" column="PER_ID" />

      <result property="FirstName" column="PER_FIRST_NAME" />

      <result property="LastName" column="PER_LAST_NAME" />

      <result property="BirthDate" column="PER_BIRTH_DATE" />

      <result property="WeightInKilograms" column="PER_WEIGHT_KG" />

      <result property="HeightInMeters" column="PER_HEIGHT_M" />

    </resultMap>

  </resultMaps>

 

  <statements>

    <select id="SelectAllPerson" resultMap="SelectAllResult">

      select

      PER_ID,

      PER_FIRST_NAME,

      PER_LAST_NAME,

      PER_BIRTH_DATE,

      PER_WEIGHT_KG,

      PER_HEIGHT_M

      from PERSON

    </select>

 

    <select id="SelectByPersonId" resultClass="Person" parameterClass="int">

      select

      PER_ID,

      PER_FIRST_NAME,

      PER_LAST_NAME,

      PER_BIRTH_DATE,

      PER_WEIGHT_KG,

      PER_HEIGHT_M