iBatis.Net 是一个轻量级的 ORM 框架,它允许开发者通过直接编写 SQL 查询来操作数据库,并将查询结果映射到对象模型中。与其他 ORM 框架相比,iBatis.Net 提供了更大的 SQL 灵活性,同时保留了与数据库的紧密控制。本文将通过实际的代码示例,详细介绍如何在 .NET 环境中使用 iBatis.Net 进行数据库操作。


一、iBatis.Net 基本配置

要使用 iBatis.Net 进行数据库操作,首先需要进行基本的配置,包括数据库连接配置和 SQL 映射文件的编写。

1. 配置数据库连接

创建一个名为 SqlMap.config 的文件,用于配置数据库连接信息。

<?xml version="1.0" encoding="utf-8" ?>
<sqlMapConfig xmlns="http://ibatis.apache.org/dataMapper">
  <database>
    <provider type="System.Data.SqlClient"/>
    <dataSource connectionString="Data Source=YourServer;Initial Catalog=YourDatabase;Integrated Security=True;" />
  </database>
</sqlMapConfig>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

2. 定义 SQL 映射文件

接下来,创建 SQL 映射文件 User.xml,用于定义与 User 表相关的 SQL 操作。

<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="User" xmlns="http://ibatis.apache.org/dataMapper">
  <select id="GetUserById" parameterClass="int" resultClass="User">
    SELECT Id, Name, Age FROM Users WHERE Id = #value#
  </select>
  <insert id="InsertUser" parameterClass="User">
    INSERT INTO Users (Name, Age) VALUES (#Name#, #Age#)
  </insert>
  <update id="UpdateUser" parameterClass="User">
    UPDATE Users SET Name = #Name#, Age = #Age# WHERE Id = #Id#
  </update>
  <delete id="DeleteUser" parameterClass="int">
    DELETE FROM Users WHERE Id = #value#
  </delete>
</sqlMap>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

二、工具类的设计与实现

为了简化数据库操作,我们可以通过一个工具类来封装常用的数据库操作方法。以下是一个基于 iBatis.Net 的 BaseDAL 类的实现,提供了增、删、改、查等常见的数据库操作方法。

using IBatisNet.DataMapper;
using IBatisNet.DataMapper.MappedStatements;
using IBatisNet.DataMapper.Scope;
using IBatisNet.DataMapper.SessionStore;
using log4net;
using System;
using System.Collections.Generic;

namespace CarRental.DAL
{
    public enum IBatisActionType
    {
        Insert = 0,
        Update,
        Delete
    }

    public class ActionItem
    {
        public string IBatisSqlIdName { get; set; }
        public object DataObj { get; set; }
    }

    public class BaseDAL
    {
        static ILog log = LogManager.GetLogger(typeof(BaseDAL));

        public static void InitSqlMapper()
        {
            ISqlMapper iSqlMapper = Mapper.Instance();
            if (iSqlMapper != null)
            {
                iSqlMapper.SessionStore = new HybridWebThreadSessionStore(iSqlMapper.Id);
            }
        }

        public static ISqlMapper GetSqlMapper()
        {
            return Mapper.Instance();
        }

        public static int Insert<T>(string statementName, T t)
        {
            ISqlMapper iSqlMapper = Mapper.Instance();
            if (iSqlMapper != null)
            {
                return (int)iSqlMapper.Insert(statementName, t);
            }
            return 0;
        }

        public static int Update<T>(string statementName, T t)
        {
            ISqlMapper iSqlMapper = Mapper.Instance();
            if (iSqlMapper != null)
            {
                return iSqlMapper.Update(statementName, t);
            }
            return 0;
        }

        public static int Delete(string statementName, int primaryKeyId)
        {
            ISqlMapper iSqlMapper = Mapper.Instance();
            if (iSqlMapper != null)
            {
                return iSqlMapper.Delete(statementName, primaryKeyId);
            }
            return 0;
        }

        public static T Get<T>(string statementName, int primaryKeyId) where T : class
        {
            ISqlMapper iSqlMapper = Mapper.Instance();
            if (iSqlMapper != null)
            {
                return iSqlMapper.QueryForObject<T>(statementName, primaryKeyId);
            }
            return null;
        }

        public static IList<T> QueryForList<T>(string statementName, object parameterObject = null)
        {
            ISqlMapper iSqlMapper = Mapper.Instance();
            if (iSqlMapper != null)
            {
                return iSqlMapper.QueryForList<T>(statementName, parameterObject);
            }
            return null;
        }

        // 更多封装方法...
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.

三、BaseDAL 的使用示例

通过封装好的 BaseDAL 类,可以非常方便地进行数据库操作,下面是如何调用这些方法的示例。

1. 插入数据
User newUser = new User { Name = "John Doe", Age = 30 };
int newUserId = BaseDAL.Insert("InsertUser", newUser);
  • 1.
  • 2.
2. 更新数据
User existingUser = BaseDAL.Get<User>("GetUserById", userId);
existingUser.Name = "Jane Doe";
BaseDAL.Update("UpdateUser", existingUser);
  • 1.
  • 2.
  • 3.
3. 删除数据
int result = BaseDAL.Delete("DeleteUser", userId);
  • 1.
4. 查询数据
User user = BaseDAL.Get<User>("GetUserById", userId);
IList<User> users = BaseDAL.QueryForList<User>("GetAllUsers");
  • 1.
  • 2.

四、事务操作

iBatis.Net 还支持事务操作,可以确保一组数据库操作要么全部成功,要么全部失败。BaseDAL 类提供了 DoActionWithTransaction 方法,可以在事务中执行一系列数据库操作。

以下是一个使用 BaseDAL 类进行事务操作的完整示例。在这个示例中,首先插入一条新的汽车类型数据,然后使用新插入的汽车类型 ID 继续插入一条对应的价格规则数据。整个操作被包裹在一个事务中,以确保数据一致性。

try
{
    // 开始事务
    BaseDAL.GetSqlMapper().BeginTransaction();

    // 创建一个新的汽车类型对象
    var carType = new
    {
        name = "SUV",
        description = "Sport Utility Vehicle"
    };

    // 插入新的汽车类型数据,并获取新记录的ID
    int carTypeId = BaseDAL.Insert("InserNewCarTypeIntoTCar", carType);

    // 创建一个价格规则对象,并将新插入的汽车类型ID赋值给它
    var priceRule = new
    {
        car_type_id = carTypeId,
        base_price = 500,
        per_km_price = 10
    };

    // 插入价格规则
    BaseDAL.InsertWithNoResult("InserNewCarTypeIntoTPriceRule", priceRule);

    // 提交事务
    BaseDAL.GetSqlMapper().CommitTransaction();

    Console.WriteLine("事务提交成功,汽车类型和价格规则已插入数据库。");
}
catch (Exception ex)
{
    // 如果发生错误,回滚事务
    BaseDAL.GetSqlMapper().RollBackTransaction();
    Console.WriteLine("事务回滚,操作未完成。错误信息: " + ex.Message);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.

五、iBatis.Net操作总结

iBatis.Net 是一个轻量级且灵活的 ORM 框架,特别适用于需要直接控制 SQL 语句的场景。通过本文的介绍,iBatis.Net 的基本配置、常用数据库操作,以及事务管理等内容得到了详细的展示。结合使用 BaseDAL 类,开发者可以有效地简化与数据库交互的代码,同时保持对 SQL 操作的完全控制。iBatis.Net 提供了更高的 SQL 灵活性,能够在需要复杂查询和自定义 SQL 的项目中发挥重要作用。

iBatis.Net 在常用 ORM 框架中具有非常突出的表现,以下是 iBatis.Net 与其他流行的 ORM 框架的对比:

特性

iBatis.Net

Entity Framework

Dapper

NHibernate

SQL 灵活性


中等

中等

自动化





学习曲线

中等




性能


中等


中等

事务支持

支持

支持

支持

支持

映射能力

中等

丰富

基本

丰富

适用场景

复杂 SQL 查询

快速开发和强类型支持

高性能需求和简单映射

企业级复杂应用

通过对比可以看出,iBatis.Net 在处理复杂 SQL 查询和需要精确控制数据库操作的场景下具有显著优势,而在自动化和易用性方面,其他框架如 Entity Framework 和 NHibernate 可能更适合快速开发需求。这些差异使得 iBatis.Net 成为一种在特定项目中不可替代的工具,特别是在灵活性和性能需求较高的环境中。