網站首頁 編程語言 正文
上一篇引入了Dapper框架,估計大家都會用了。但是很多都被封裝,想探究原理的小伙伴就很失望了。那么今天的SqlSugar就說說大概思路。簡單版和ABP的關聯比較少,未來我還會寫一期切合ABP框架的,小伙伴稍等下。
一 新建類庫
為了代碼清晰,我新建了一個類庫。引入了SqlSugar的框架包,2個倉儲類,1個DbContext
聲明實體
[SugarTable("BasBloodLevel")]
public class BasBloodLevel
{
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
public string Code { get; set; }
}
二 基本倉儲
先實現基本倉儲IBaseRepository 與BaseRepository
/// <summary>
/// 基類接口,其他接口繼承該接口
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public interface IBaseRepository<TEntity> where TEntity : class
{
/// <summary>
/// 根據ID查詢
/// </summary>
/// <param name="objId"></param>
/// <returns></returns>
Task<TEntity> QueryByID(object objId);
/// <summary>
/// 添加
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
Task<bool> Add(TEntity model);
/// <summary>
/// 修改
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
Task<bool> Update(TEntity model);
/// <summary>
/// 刪除
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
Task<bool> DeleteByIds(object[] ids);
}
/// <summary>
/// 基類實現
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public class BaseRepository<TEntity> : DbContext<TEntity>, IBaseRepository<TEntity> where TEntity : class, new()
{
/// <summary>
/// 寫入實體數據
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public async Task<bool> Add(TEntity model)
{
//這里需要注意的是,如果使用了Task.Run()就會導致 sql語句日志無法記錄改成下面的
//var i = await Task.Run(() => Db.Insertable(model).ExecuteCommand());
var i = await Db.Insertable(model).ExecuteCommandAsync();
return i > 0;
}
/// <summary>
/// 根據ID刪除
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
public async Task<bool> DeleteByIds(object[] ids)
{
var i = await Db.Deleteable<TEntity>().In(ids).ExecuteCommandAsync();
return i > 0;
}
/// <summary>
/// 根據ID查詢一條數據
/// </summary>
/// <param name="objId"></param>
/// <returns></returns>
public async Task<TEntity> QueryByID(object objId)
{
return await Db.Queryable<TEntity>().InSingleAsync(objId);
}
/// <summary>
/// 更新實體數據
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public async Task<bool> Update(TEntity model)
{
//這種方式會以主鍵為條件
var i = await Db.Updateable(model).ExecuteCommandAsync();
return i > 0;
}
}
三 實現SqlSugar的DB
此處的ConnectionString 地址,我們可以直接讀取 ABP框架的配置文件,但是為了方便我直接寫死了
public class DbContext<T> where T : class, new()
{
public DbContext()
{
Db = new SqlSugarClient(new ConnectionConfig()
{
//數據庫地址我們可以直接讀取 ABP框架的配置文件,但是為了方便我直接寫死了
ConnectionString = "Server=****; Database=****; Uid=sa; Pwd=****;MultipleActiveResultSets=true;",
DbType = DbType.SqlServer,
InitKeyType = InitKeyType.Attribute,//從特性讀取主鍵和自增列信息
IsAutoCloseConnection = true,//開啟自動釋放模式
});
//調式代碼 用來打印SQL
Db.Aop.OnLogExecuting = (sql, pars) =>
{
Console.WriteLine(sql + "\r\n" +
Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
Console.WriteLine();
};
}
//注意:不能寫成靜態的
public SqlSugarClient Db;//用來處理事務多表查詢和復雜的操作
public SimpleClient<T> CurrentDb { get { return new SimpleClient<T>(Db); } }//用來操作當前表的數據
public SimpleClient<BasBloodLevel> BasBloodLevelDb { get { return new SimpleClient<BasBloodLevel>(Db); } }//用來處理User表的常用操作
}
四 實現依賴注入
這樣我們就能全局使用了
[DependsOn(typeof(AbpZeroCoreModule))]
public class Module : AbpModule
{
public override void Initialize()
{
IocManager.Register(typeof(IBaseRepository<>), typeof(BaseRepository<>), DependencyLifeStyle.Singleton);
//依賴注入程序集
IocManager.RegisterAssemblyByConvention(typeof(Module).GetAssembly());
}
}
既然要實現依賴注入,那肯定要初始化這個類觸發注入了。我選擇在EF層里加,這樣可以不影響原有的EF層初始化
五 應用層使用
直接引用對應的IBaseRepository倉儲
public class BasBloodBreedAppService : BloodTestLibSystemAppServiceBase,IApplicationService
{
private IBaseRepository<BasBloodLevel> _baseRepository { get; set; }
public BasBloodBreedAppService(IBaseRepository<BasBloodLevel> baseRepository) {
_baseRepository = baseRepository;
}
public async Task<BasBloodLevel> GetBase() {
var ce=await _baseRepository.QueryByID(1);
return ce;
}
}
證明一下我是成功的
此刻引入SqlSugar就完成了。但是他確實了很ABP很多好用的操作。
原文鏈接:https://blog.csdn.net/wangwengrui40/article/details/122747742
相關推薦
- 2022-06-26 shell腳本語言之if條件判斷語句實例詳解_linux shell
- 2022-06-21 C++超詳細講解友元的使用_C 語言
- 2022-12-14 Android?Studio?gradle配置packagingOptions打包so庫重復_And
- 2022-10-24 React中的生命周期和子組件_React
- 2022-03-19 強制去除Unity自動添加的Android隱私權限_Android
- 2021-12-18 linux下安裝redis圖文詳細步驟_Redis
- 2022-06-02 jquery實現界面點擊按鈕彈出懸浮框_jquery
- 2022-06-08 Python使用PyYAML庫讀寫yaml文件的方法_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支