C#进阶-iBatis.Net操作数据库教程

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>

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>

二、BaseDAL 工具类的设计与实现

为了简化数据库操作,我们可以通过一个工具类来封装常用的数据库操作方法。以下是一个基于 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;
        }

    }
}

三、BaseDAL 工具类的使用示例

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

1. 插入数据

User newUser = new User { Name = "John Doe", Age = 30 };
int newUserId = BaseDAL.Insert("InsertUser", newUser);

2. 更新数据

User existingUser = BaseDAL.Get<User>("GetUserById", userId);
existingUser.Name = "Jane Doe";
BaseDAL.Update("UpdateUser", existingUser);

3. 删除数据

int result = BaseDAL.Delete("DeleteUser", userId);

4. 查询数据

User user = BaseDAL.Get<User>("GetUserById", userId);
IList<User> users = BaseDAL.QueryForList<User>("GetAllUsers");

四、事务操作

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);
}

五、iBatis.Net操作总结

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

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

特性iBatis.NetEntity FrameworkDapperNHibernate
SQL 灵活性中等中等
自动化
学习曲线中等
性能中等中等
事务支持支持支持支持支持
映射能力中等丰富基本丰富
适用场景复杂 SQL 查询快速开发和强类型支持高性能需求和简单映射企业级复杂应用

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

此条目发表在Backend, C#分类目录,贴了, , 标签。将固定链接加入收藏夹。

发表回复