using Dapper;
using Microsoft.Extensions.Configuration;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using System.Threading.Tasks;
namespace MyCommon.Repositories
{
public interface IDbRepository
{
/// <summary>
/// 查询数据
/// </summary>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
Task<IEnumerable<dynamic>> QueryAsync(string sql, object param = null);
/// <summary>
/// 查询数据
/// </summary>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
IEnumerable<dynamic> QueryDynamic(string sql, object param = null);
/// <summary>
/// 查询数据集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
IEnumerable<T> Query<T>(string sql, object param = null);
/// <summary>
/// 查询一条数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
T QueryFirstOrDefault<T>(string sql, object param = null);
/// <summary>
/// 查询数据是否存在
/// </summary>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
bool QueryAny(string sql, object param = null);
/// <summary>
/// 执行非查询操作
/// </summary>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
int Execute(string sql, object param = null);
/// <summary>
///
/// </summary>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
object ExecuteScalar(string sql, object param = null);
}
/// <summary>
///
/// </summary>
public class DbRepository : IDbRepository
{
private readonly IConfiguration _configuration;
/// <summary>
/// 数据库从库连接字符串
/// </summary>
public IDbConnection _dbConnectionSlave { get { return new MySqlConnection(_configuration["ConnectionStrings:SlaveConnectionRead"]); } }
/// <summary>
/// 数据库主库连接字符串
/// </summary>
public IDbConnection _dbConnectionMaster { get { return new MySqlConnection(_configuration["ConnectionStrings:MasterConnection"]); } }
/// <summary>
///
/// </summary>
/// <param name="configuration"></param>
public DbRepository(IConfiguration configuration)
{
_configuration = configuration;
}
/// <summary>
/// 异步查询数据
/// </summary>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
public async Task<IEnumerable<dynamic>> QueryAsync(string sql, object param = null)
{
using (_dbConnectionSlave)
{
return await _dbConnectionSlave.QueryAsync(sql, param);
}
}
/// <summary>
/// 查询数据
/// </summary>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
public IEnumerable<dynamic> QueryDynamic(string sql, object param = null)
{
using (_dbConnectionSlave)
{
return _dbConnectionSlave.Query(sql, param);
}
}
/// <summary>
/// 查询数据集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
public IEnumerable<T> Query<T>(string sql, object param = null)
{
using (_dbConnectionSlave)
{
return _dbConnectionSlave.Query<T>(sql, param);
}
}
/// <summary>
/// 查询一条数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
public T QueryFirstOrDefault<T>(string sql, object param = null)
{
using (_dbConnectionSlave)
{
return _dbConnectionSlave.QueryFirstOrDefault<T>(sql, param);
}
}
/// <summary>
/// 查询数据是否存在
/// </summary>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
public bool QueryAny(string sql, object param = null)
{
using (_dbConnectionSlave)
{
return _dbConnectionSlave.ExecuteScalar(sql, param) != null;
}
}
/// <summary>
/// 执行非查询操作
/// </summary>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
public int Execute(string sql, object param = null)
{
using (_dbConnectionMaster)
{
return _dbConnectionMaster.Execute(sql, param);
}
}
/// <summary>
///
/// </summary>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
public object ExecuteScalar(string sql, object param = null)
{
using (_dbConnectionSlave)
{
return _dbConnectionSlave.ExecuteScalar(sql, param);
}
}
}
}