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.Net | Entity Framework | Dapper | NHibernate |
---|---|---|---|---|
SQL 灵活性 | 高 | 中等 | 高 | 中等 |
自动化 | 低 | 高 | 低 | 高 |
学习曲线 | 中等 | 高 | 低 | 高 |
性能 | 高 | 中等 | 高 | 中等 |
事务支持 | 支持 | 支持 | 支持 | 支持 |
映射能力 | 中等 | 丰富 | 基本 | 丰富 |
适用场景 | 复杂 SQL 查询 | 快速开发和强类型支持 | 高性能需求和简单映射 | 企业级复杂应用 |
通过对比可以看出,iBatis.Net 在处理复杂 SQL 查询和需要精确控制数据库操作的场景下具有显著优势,而在自动化和易用性方面,其他框架如 Entity Framework 和 NHibernate 可能更适合快速开发需求。这些差异使得 iBatis.Net 成为一种在特定项目中不可替代的工具,特别是在灵活性和性能需求较高的环境中。