使用 Dapper 进行简单增删改查示例
首先根据数据库表定义实体对象, 这个工作完全可以使用T4、Nvelocity或者RazorEngine 写一个代码生成器根据数据库表对象自动生成数据库表实体对象。这里我自己根据表写了一个对象
[Table("UserRole")]
public class UserRoleDbEntity:DbEntityModelBase
{
[Description("用户编号,来自用户表")]
public int UserId
{
get;
set;
}
[Description("角色编号,来自于角色表")]
public int RoleId
{
get;
set;
}
/// <summary>
/// 备注:AuthorityEnum.AuthorityValue 的取值范围是根据 AuthorityEnum位运算 或 与 的结果集;不可随意赋值
/// </summary>
[Description("权限值")]
public int AuthorityValue
{
get;
set;
}
/// <summary>
/// 根据 AuthorityEnum 枚举值生成的描述
/// </summary>
[Description("权限描述")]
public string AuthorityDescription
{
get;
set;
}
}
/// <summary>
/// 所有DbEntityModel项目中的实体必须继承DbEntityModelBase或其子类,使用supperType模式控制共有子类的行为或者状态,此项目中的类根据数据库基本表或者视图保持基本一致
/// </summary>
public abstract class DbEntityModelBase
{
[Description("Guid标识")]
public string GuidMark
{
get;
set;
}
[Description("自增Id列")]
public int Id
{
get;
set;
}
[Description("排序,倒序")]
public int Sort
{
get;
set;
}
}在DAL层就可以使用实体对象传参 或者作为返回值
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OnlineExercise.DbAccess;
using Dapper;
using System.Configuration;
using System.Data;
using MySql.Data;
using MySql.Data.MySqlClient;
using OnlineExercise.DbEntityModel;
using OnlineExercise.Log;
using OnlineExercise.Infrastructrue;
namespace OnlineExercise.DbAccess.SysAdminModule
{
public class UserRoleDB:DalBase<UserRoleDB>
{
public int AddUserRole(UserRoleDbEntity model)
{
int affecgtRow = 0;
string sql = @"INSERT INTO `userrole`
(`GuidMark`,
`UserId`,
`RoleId`,
`AuthorityValue`,
`AuthorityDescription`)
VALUES (@GuidMark,
@UserId,
@RoleId,
@AuthorityValue,
@AuthorityDescription);";
using (IDbConnection conn = new MySqlConnection(GlobalVariablesManager.G_Strconn))
{
affecgtRow = conn.Execute(sql, model);
}
return affecgtRow;
}
public int UpdateUserRoleByRoleIdAndUserId(UserRoleDbEntity model)
{
int affecgtRow = 0;
string sql = @"UPDATE `userrole`
SET `AuthorityValue` = @AuthorityValue,
`AuthorityDescription` = @AuthorityDescription
WHERE `UserId` = @UserId
AND `RoleId` = @RoleId;";
using (IDbConnection conn = new MySqlConnection(GlobalVariablesManager.G_Strconn))
{
affecgtRow = conn.Execute(sql, model);
}
return affecgtRow;
}
public int UpdateUserRoleByRoleId(UserRoleDbEntity model)
{
int affecgtRow = 0;
string sql = @"UPDATE `userrole`
SET `AuthorityValue` = @AuthorityValue,
`AuthorityDescription` = @AuthorityDescription
WHERE `RoleId` = @RoleId;";
using (IDbConnection conn = new MySqlConnection(GlobalVariablesManager.G_Strconn))
{
affecgtRow = conn.Execute(sql, model);
}
return affecgtRow;
}
public int UpdateUserRoleByUserId(UserRoleDbEntity model)
{
int affecgtRow = 0;
string sql = @"UPDATE `userrole`
SET `AuthorityValue` = @AuthorityValue,
`AuthorityDescription` = @AuthorityDescription
WHERE `UserId` = @UserId;";
using (IDbConnection conn = new MySqlConnection(GlobalVariablesManager.G_Strconn))
{
affecgtRow = conn.Execute(sql, model);
}
return affecgtRow;
}
public List<UserRoleDbEntity> GetUserRoleListByRoleId(UserRoleDbEntity model)
{
List<UserRoleDbEntity> modelList = null;
string sql = @"SELECT
`Id`,
`GuidMark`,
`sort`,
`UserId`,
`RoleId`,
`AuthorityValue`,
`AuthorityDescription`
FROM `userrole`
WHERE RoleId=@RoleId;";
using (IDbConnection conn = new MySqlConnection(GlobalVariablesManager.G_Strconn))
{
modelList = conn.Query<UserRoleDbEntity>(sql, model).ToList<UserRoleDbEntity>();
}
return modelList;
}
public List<UserRoleDbEntity> GetUserRoleListByUserId(string userId)
{
List<UserRoleDbEntity> modelList = null;
string sql = @"SELECT
`Id`,
`GuidMark`,
`sort`,
`UserId`,
`RoleId`,
`AuthorityValue`,
`AuthorityDescription`
FROM `userrole`
WHERE UserId=@UserId;";
using (IDbConnection conn = new MySqlConnection(GlobalVariablesManager.G_Strconn))
{
modelList = conn.Query<UserRoleDbEntity>(sql, new { UserId =userId}).ToList<UserRoleDbEntity>();
}
return modelList;
}
public List<UserRoleDbEntity> GetUserRoleListByRoleIdAndUserId(UserRoleDbEntity model)
{
List<UserRoleDbEntity> modelList = null;
string sql = @"SELECT
`Id`,
`GuidMark`,
`sort`,
`UserId`,
`RoleId`,
`AuthorityValue`,
`AuthorityDescription`
FROM `userrole`
WHERE RoleId=@RoleId and UserId=@UserId;";
using (IDbConnection conn = new MySqlConnection(GlobalVariablesManager.G_Strconn))
{
modelList = conn.Query<UserRoleDbEntity>(sql, model).ToList<UserRoleDbEntity>();
}
return modelList;
}
public int DeleteUserRoleByUserId(string userId)
{
int affecgtRow = 0;
string sql = @"DELETE
FROM `userrole`
WHERE `UserId` = @UserId";
using (IDbConnection conn = new MySqlConnection(GlobalVariablesManager.G_Strconn))
{
affecgtRow = conn.Execute(sql, new { UserId = userId });
}
return affecgtRow;
}
public int DeleteUserRoleByRoleId(string roleId)
{
int affecgtRow = 0;
string sql = @"DELETE
FROM `userrole`
WHERE `RoleId` = @RoleId;";
using (IDbConnection conn = new MySqlConnection(GlobalVariablesManager.G_Strconn))
{
affecgtRow = conn.Execute(sql, new { RoleId = roleId });
}
return affecgtRow;
}
public DataTable GetRoleInfoByUserId(string userId)
{
DataTable dt = null;
string sql = @"SELECT b.*,a.userid,c.name as userName FROM userrole AS a
INNER JOIN role AS b ON a.roleid=b.id
INNER JOIN USER AS c ON c.id=a.userid
WHERE a.userid=@userid;";
using (IDbConnection conn = new MySqlConnection(GlobalVariablesManager.G_Strconn))
{
IDataReader reader = conn.ExecuteReader(sql, new { userid=userId });
dt = CoreUtil.DataReader2Table(reader);
reader.Dispose();
}
return dt;
}
}
}
Dapper的优势
1、 Dapper是一个轻型的ORM类
2、 Dapper语法简单,如果你喜欢写原始的sql,你一定喜欢Dapper。同时团队人员也很容易上手
3、 Dapper 速度快,速度接近ADO.NET访问数据库的效率。
4、 据库切换方便
public int UpdateUserRoleByRoleId(UserRoleDbEntity model)
{
int affecgtRow = 0;
string sql = @"UPDATE `userrole`
SET `AuthorityValue` = @AuthorityValue,
`AuthorityDescription` = @AuthorityDescription
WHERE `RoleId` = @RoleId;";
using (IDbConnection conn = new MySqlConnection(GlobalVariablesManager.G_Strconn))
{
affecgtRow = conn.Execute(sql, model);
}
return affecgtRow;
}这里mysql如果要切换为Sql Server ,只要修改链接 MySqlConnection---》SqlConnection。
Dapper更多特性
动态dynamic绑定
var rows = connection.Query("select 1 A, 2 B union all select 3, 4");
((int)rows[0].A)
.IsEqualTo(1);
((int)rows[0].B)
.IsEqualTo(2);
((int)rows[1].A)
.IsEqualTo(3);
((int)rows[1].B)
.IsEqualTo(4);批量插入
connection.Execute(@"insert MyTable(colA, colB) values (@a, @b)", new[] { new { a=1, b=1 }, new { a=2, b=2 }, new { a=3, b=3 } } )
.IsEqualTo(3);
// 3 rows inserted: "1,1", "2,2" and "3,3"多表关联
var sql =
@"select * from #Posts p
left join #Users u on u.Id = p.OwnerId
Order by p.Id";
var data = connection.Query<Post, User, Post>(sql, (post, user) => { post.Owner = user; return post;});
var post = data.First();
post.Content.IsEqualTo("Sams Post1");
post.Id.IsEqualTo(1);
post.Owner.Name.IsEqualTo("Sam");
post.Owner.Id.IsEqualTo(99);多结果查询
var sql =
@"
select * from Customers where CustomerId = @id
select * from Orders where CustomerId = @id
select * from Returns where CustomerId = @id";
using (var multi = connection.QueryMultiple(sql, new {id=selectedId}))
{
var customer = multi.Read<Customer>().Single();
var orders = multi.Read<Order>().ToList();
var returns = multi.Read<Return>().ToList();
...
}存储过程
var user = cnn.Query<User>("spGetUser", new {Id = 1},
commandType: CommandType.StoredProcedure).SingleOrDefault();
// 你还可以获取存储过程out参数的输出值或者返回值
var p = new DynamicParameters();
p.Add("@a", 11);
p.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);
p.Add("@c", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);
cnn.Execute("spMagicProc", p, commandType: CommandType.StoredProcedure);
int b = p.Get<int>("@b");
int c = p.Get<int>("@c");参数自动绑定
new {A = 1, B = "b"} // A will be mapped to the param @A, B to the param @B