The .NE version is also moving to the V3 and you can even more find this
next version in
 http://svn.apache.org/repos/asf/ibatis/trunk/cs/V2/
Don't care to the V2 directory name it will surely be changed to V3.

This version only targets .NET framework >= 2.*
The main change are:
- use Castle.DynamicProxy V2
- Configuration element can be register in any order.
- Configuration can be made by code (alias, typeHandler, resultMap,
parameterMap)
- External resource now follow the .NET standard access used by Spring,
Castle as
  <sqlMaps>
        <sqlMap uri="file://../../${directory}/Mapping1.xml"/>
        <sqlMap
uri="assembly://Apache.Ibatis.DataMapper.SqlClient.Test/Maps/Mapping2.xml"/>
        <sqlMap uri="file://../../Maps/Mapping3.xml"/>
        <sqlMap uri="file://../../Maps/Mapping4.xml"/>
        <sqlMap
uri="assembly://Apache.Ibatis.DataMapper.SqlClient.Test/Maps/Mapping5.xml"/>
  </sqlMaps>
- Configuration API change following iBATIS 3.0 Whiteboard
http://opensource.atlassian.com/confluence/oss/display/IBATIS/iBATIS+3.0+Whiteboard
- iBATIS session access via ISessionFactory

Example:
/// <summary>
    /// This module will register the resultMaps under the convention
namespace Account
    /// </summary>
    public class AccountModule : Module
    {

        public override void Load()
        {
            RegisterAlias<Account>();

            RegisterTypeHandler<bool,
OuiNonBoolTypeHandlerCallback>("Varchar");

            RegisterResultMap<Account>("account-result-nullable-email")
                .MappingMember("Id").ToColumnName("Account_ID")

.MappingMember("FirstName").ToColumnName("Account_FirstName")
                .MappingMember("LastName").ToColumnName("Account_LastName")

.MappingMember("EmailAddress").ToColumnName("Account_Email");

            RegisterParameterMap<Account>("insert-params")
                .MappingMember("Id").ToColumn("Account_ID")
                .MappingMember("FirstName").ToColumn("Account_FirstName")
                .MappingMember("LastName").ToColumn("Account_LastName")

.MappingMember("EmailAddress").ToColumn("Account_Email").UsingNullValue("
[EMAIL PROTECTED]")

.MappingMember("BannerOption").ToColumn("Account_Banner_Option").UsingDbType("Varchar").UsingType("bool")

.MappingMember("CartOption").ToColumn("Account_Cart_Option").WithTypeHandler<HundredsTypeHandlerCallback>();

            RegisterResultMap<Account>("account-result-constructor")
                .UsingConstructor

.MappingArgument("identifiant").ToColumnName("Account_ID")

.MappingArgument("firstName").ToColumnName("Account_FirstName")

.MappingArgument("lastName").ToColumnName("Account_LastName")

.MappingMember("EmailAddress").ToColumnName("Account_Email").UsingNullValue("
[EMAIL PROTECTED]")

.MappingMember("BannerOption").ToColumnName("Account_Banner_Option").UsingDbType("Varchar").UsingType("bool")

.MappingMember("CartOption").ToColumnName("Account_Cart_Option").WithTypeHandler<HundredsTypeHandlerCallback>();

            RegisterResultMap<Account>("account-result-joined-document")
                .MappingMember("id").ToColumnName("Account_ID")

.MappingMember("FirstName").ToColumnName("Account_FirstName")
                .MappingMember("LastName").ToColumnName("Account_LastName")

.MappingMember("EmailAddress").ToColumnName("Account_Email").UsingNullValue("
[EMAIL PROTECTED]")

.MappingMember("BannerOption").ToColumnName("Account_Banner_Option").UsingDbType("Varchar").UsingType("bool")

.MappingMember("CartOption").ToColumnName("Account_Cart_Option").WithTypeHandler<HundredsTypeHandlerCallback>()

.MappingMember("Document").UsingResultMap("Document.document");

        }
    }

    /// <summary>
    /// This module will register the resultMaps under the specified
namespace Document
    /// </summary>
    public class DocumentModule : Module
    {
        public DocumentModule()
            : base("Document")
        { }

        public override void Load()
        {
            RegisterAlias<DocumentCollection>("DocumentCollection");

            RegisterResultMap<Document>("baseDocument")
                .MappingMember("Id").ToColumnName("Document_ID")
                .MappingMember("Title").ToColumnName("Document_Title");


RegisterResultMap<Newspaper>("newspaper").Extends("baseDocument")
                .MappingMember("City").ToColumnName("Document_City");

            RegisterResultMap<Document>("document").Extends("baseDocument")
                .MappingMember("Test").ToColumnName("Document_Title")
                .WithDiscriminator<string>("Document_Type")
                .UsingResultMap("Document.book").ForValue("Book")
                .UsingResultMap("newspaper").ForValue("Newspaper");


RegisterResultMap<Document>("document-custom-handler").Extends("baseDocument")
                .WithDiscriminator<string>("Document_Type")
                .WithTypeHandler<CustomInheritance>()
                .UsingResultMap("book").ForValue("Book")
                .UsingResultMap("newspaper").ForValue("Newspaper");

            RegisterResultMap<Book>("book").Extends("document")

.MappingMember("PageNumber").ToColumnName("Document_PageNumber");
        }
    }

and you configure the stuff like that

                string resource = "SqlMap_StatementOnly.config";
                IConfigurationEngine engine = new
DefaultConfigurationEngine();
                engine.RegisterInterpreter(new
XmlConfigurationInterpreter(resource));
                engine.RegisterModule(new AccountModule());
                engine.RegisterModule(new DocumentModule());

                IMapperFactory mapperFactory = engine.BuildMapperFactory();

                dataMapper =
((IDataMapperAccessor)mapperFactory).DataMapper;
                ISessionFactory sessionFactory =
engine.ModelStore.SessionFactory;

                dataMapper.Insert("InsertAccountViaParameterMap", account);

It's not implemented Annotation support nor the auto-generated interface as
presented in the Whiteboard for now.

I used it with success :-)
See unit test for others uses.

-- 
Cheers,
Gilles

Reply via email to