Dapper动态参数:DynamicParameters灵活操作数据库

Dapper动态参数:DynamicParameters灵活操作数据库

【免费下载链接】Dapper Dapper - a simple object mapper for .Net 【免费下载链接】Dapper 项目地址: https://gitcode.com/gh_mirrors/da/Dapper

你是否还在为.NET数据库操作中的参数管理感到困扰?手动创建参数数组繁琐易错,存储过程的输入输出参数处理复杂,不同数据库类型转换麻烦?Dapper的DynamicParameters组件能帮你轻松解决这些问题,让参数操作变得灵活高效。读完本文,你将掌握DynamicParameters的核心用法,包括基本参数添加、模板对象绑定、输入输出参数处理以及高级特性应用,让数据库操作代码更简洁、更易维护。

什么是DynamicParameters

DynamicParameters是Dapper提供的一个灵活的参数容器,实现了SqlMapper.IDynamicParameters接口,允许以动态方式添加和管理数据库参数。它支持多种参数添加方式,包括直接添加、通过匿名对象添加、通过模板对象添加,以及处理输入输出参数等复杂场景。与传统的IDbDataParameter数组相比,DynamicParameters大大简化了参数管理的代码,提高了开发效率。

DynamicParameters的核心实现位于Dapper/DynamicParameters.cs文件中,主要包含参数存储、参数添加、参数绑定到命令等功能。

基本用法:添加和使用参数

直接添加参数

DynamicParameters提供了Add方法,可以直接添加参数,指定参数名称、值、数据库类型、方向等属性。

var parameters = new DynamicParameters();
parameters.Add("Id", 1, DbType.Int32, ParameterDirection.Input);
parameters.Add("Name", "John Doe", DbType.String, ParameterDirection.Input, 50);

var user = connection.QueryFirstOrDefault<User>("SELECT * FROM Users WHERE Id = @Id AND Name = @Name", parameters);

在上面的代码中,我们创建了一个DynamicParameters实例,添加了两个输入参数IdName,然后将其传递给Dapper的QueryFirstOrDefault方法执行查询。

使用匿名对象添加参数

除了直接调用Add方法,DynamicParameters还支持通过匿名对象快速添加参数。在创建DynamicParameters实例时,可以传入一个匿名对象作为模板,DynamicParameters会自动将匿名对象的属性转换为参数。

var parameters = new DynamicParameters(new { Id = 1, Name = "John Doe" });
var user = connection.QueryFirstOrDefault<User>("SELECT * FROM Users WHERE Id = @Id AND Name = @Name", parameters);

这种方式更加简洁,适用于简单的参数场景。DynamicParameters会自动处理参数名称和值,无需手动指定数据库类型和方向,Dapper会根据值的类型自动推断。

使用AddDynamicParams方法

DynamicParameters还提供了AddDynamicParams方法,可以将一个对象的属性添加为参数。这个对象可以是匿名对象、普通类实例,甚至是另一个DynamicParameters实例。

var user = new User { Id = 1, Name = "John Doe" };
var parameters = new DynamicParameters();
parameters.AddDynamicParams(user);
parameters.Add("Age", 30); // 可以额外添加参数

var result = connection.Execute("UPDATE Users SET Name = @Name, Age = @Age WHERE Id = @Id", parameters);

在这个例子中,我们首先创建了一个User对象,然后使用AddDynamicParams方法将其属性添加为参数,之后又添加了一个额外的Age参数。这种方式适用于需要将现有对象的属性作为参数,同时还需要添加其他参数的场景。

高级特性:输入输出参数和存储过程

处理输出参数

DynamicParameters的一个强大功能是支持输出参数,这在调用存储过程时非常有用。可以通过Add方法指定参数方向为ParameterDirection.OutputParameterDirection.InputOutput,然后在执行命令后通过Get方法获取输出参数的值。

var parameters = new DynamicParameters();
parameters.Add("UserId", 1, DbType.Int32, ParameterDirection.Input);
parameters.Add("UserName", dbType: DbType.String, direction: ParameterDirection.Output, size: 50);

connection.Execute("GetUserName", parameters, commandType: CommandType.StoredProcedure);
var userName = parameters.Get<string>("UserName");

在上面的代码中,我们调用了一个名为GetUserName的存储过程,传入了输入参数UserId,并定义了输出参数UserName。执行后,通过parameters.Get<string>("UserName")获取输出参数的值。

使用Output方法自动绑定输出参数

DynamicParameters还提供了Output方法,可以更方便地处理输出参数,并自动将输出值绑定到对象的属性。

var user = new User { Id = 1 };
var parameters = new DynamicParameters();
parameters.Add("UserId", user.Id, DbType.Int32, ParameterDirection.Input);
parameters.Output(user, u => u.Name); // 自动绑定输出参数到user.Name

connection.Execute("GetUserName", parameters, commandType: CommandType.StoredProcedure);
// user.Name 现在包含输出参数的值

这种方式更加简洁,避免了手动调用Get方法,提高了代码的可读性和可维护性。Output方法会自动创建一个与属性名称对应的输出参数,并在执行后将参数值赋给对象的属性。

模板对象绑定

DynamicParameters支持通过模板对象添加参数,这是一种非常灵活的方式。模板对象可以是任何类的实例,DynamicParameters会将对象的属性转换为参数。这种方式特别适用于将实体对象的属性作为查询或命令的参数。

使用构造函数传入模板

在创建DynamicParameters实例时,可以传入一个模板对象:

var user = new User { Id = 1, Name = "John Doe" };
var parameters = new DynamicParameters(user);
var result = connection.Query<User>("SELECT * FROM Users WHERE Id = @Id AND Name = @Name", parameters);

通过AddDynamicParams添加模板

也可以使用AddDynamicParams方法添加模板对象:

var parameters = new DynamicParameters();
parameters.AddDynamicParams(new { Id = 1, Name = "John Doe" });
parameters.AddDynamicParams(new { Age = 30 }); // 可以添加多个模板对象

当添加多个模板对象时,如果存在同名参数,后面添加的参数会覆盖前面的参数。

模板对象的参数添加是在AddParameters方法中处理的,通过反射生成参数并绑定到命令对象。具体实现可以参考Dapper/DynamicParameters.cs中的AddParameters方法。

参数缓存和性能优化

DynamicParameters内部使用了参数缓存机制,通过paramReaderCache字典缓存参数生成器,避免重复反射模板对象类型,提高性能。

lock (paramReaderCache)
{
    if (!paramReaderCache.TryGetValue(newIdent, out appender!))
    {
        appender = SqlMapper.CreateParamInfoGenerator(newIdent, true, RemoveUnused, literals);
        paramReaderCache[newIdent] = appender;
    }
}

这段代码位于Dapper/DynamicParameters.cs,当使用模板对象添加参数时,会为每个模板类型生成一个参数生成器,并缓存起来,下次使用相同类型的模板时直接从缓存获取,避免重复生成,提高性能。

此外,DynamicParameters还提供了RemoveUnused属性,当设置为true时,会只添加命令文本中实际使用的参数,减少不必要的参数传递,提高执行效率。

总结与最佳实践

DynamicParameters是Dapper中非常强大和灵活的参数管理工具,它简化了参数添加和管理的代码,支持多种参数添加方式,包括直接添加、匿名对象、模板对象等,同时处理输入输出参数等复杂场景。

最佳实践

  1. 优先使用模板对象:对于实体对象,优先使用模板对象方式添加参数,减少重复代码。
  2. 合理使用输出参数:调用存储过程时,使用Output方法自动绑定输出参数到对象属性,提高代码可读性。
  3. 注意参数名称匹配:参数名称应与SQL语句中的参数占位符匹配(不区分大小写,但建议保持一致)。
  4. 设置合适的参数类型和大小:对于字符串等类型,指定合适的大小可以提高性能,避免默认大小过大。
  5. 利用参数缓存:对于频繁使用的模板对象,参数缓存会自动生效,无需额外处理。

通过合理使用DynamicParameters,可以大大简化数据库操作的参数管理代码,提高开发效率和代码质量。更多详细实现可以参考Dapper/DynamicParameters.cs文件。

希望本文对你理解和使用Dapper的DynamicParameters有所帮助。如果你有任何问题或建议,欢迎在评论区留言讨论。别忘了点赞、收藏、关注,获取更多Dapper使用技巧和最佳实践!

【免费下载链接】Dapper Dapper - a simple object mapper for .Net 【免费下载链接】Dapper 项目地址: https://gitcode.com/gh_mirrors/da/Dapper

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值