日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil

發(fā)布時間:2024/9/5 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

基于Dapper二次封裝了一個易用的ORM工具類:SqlDapperUtil,把日常能用到的各種CRUD都進行了簡化封裝,讓普通程序員只需關(guān)注業(yè)務(wù)即可,因為非常簡單,故直接貼源代碼,大家若需使用可以直接復(fù)制到項目中,該SqlDapperUtil已廣泛用于公司項目中。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Dapper; using System.Data; using System.Data.Common; using System.Reflection; using System.IO; using System.Collections.Concurrent; using System.Data.SqlClient;namespace Zuowj.Common {/// <summary>/// 基于Dapper的數(shù)據(jù)操作類封裝的工具類/// Author:左文俊/// Date:2017/12/11/// </summary>public class SqlDapperUtil{private static string dbConnectionStringConfigPath = null;private readonly static ConcurrentDictionary<string, bool> dbConnNamesCacheDic = new ConcurrentDictionary<string, bool>();private string dbConnectionName = null;private string dbConnectionString = null;private string dbProviderName = null;private IDbConnection dbConnection = null;private bool useDbTransaction = false;private IDbTransaction dbTransaction = null;#region 私有方法private IDbConnection GetDbConnection(){bool needCreateNew = false;if (dbConnection == null || string.IsNullOrWhiteSpace(dbConnection.ConnectionString)){needCreateNew = true;}else if (!MemoryCacheUtil.Contains(dbConnectionName)){needCreateNew = true;}if (needCreateNew){dbConnectionString = GetDbConnectionString(dbConnectionName, out dbProviderName);var dbProviderFactory = DbProviderFactories.GetFactory(dbProviderName);dbConnection = dbProviderFactory.CreateConnection();dbConnection.ConnectionString = dbConnectionString;}if (dbConnection.State == ConnectionState.Closed){dbConnection.Open();}return dbConnection;}private string GetDbConnectionString(string dbConnName, out string dbProviderName){//如果指定的連接字符串配置文件路徑,則創(chuàng)建緩存依賴,一旦配置文件更改就失效,再重新讀取string[] connInfos = MemoryCacheUtil.GetOrAddCacheItem(dbConnName, () =>{var connStrSettings = ConfigUtil.GetConnectionStringForConfigPath(dbConnName, SqlDapperUtil.DbConnectionStringConfigPath);string dbProdName = connStrSettings.ProviderName;string dbConnStr = connStrSettings.ConnectionString;//LogUtil.Info(string.Format("SqlDapperUtil.GetDbConnectionString>讀取連接字符串配置節(jié)點[{0}]:{1},ProviderName:{2}", dbConnName, dbConnStr, dbProdName), "SqlDapperUtil.GetDbConnectionString");return new[] { EncryptUtil.Decrypt(dbConnStr), dbProdName };}, SqlDapperUtil.DbConnectionStringConfigPath);dbProviderName = connInfos[1];return connInfos[0];}private T UseDbConnection<T>(Func<IDbConnection, T> queryOrExecSqlFunc){IDbConnection dbConn = null;try{Type modelType = typeof(T);var typeMap = Dapper.SqlMapper.GetTypeMap(modelType);if (typeMap == null || !(typeMap is ColumnAttributeTypeMapper<T>)){Dapper.SqlMapper.SetTypeMap(modelType, new ColumnAttributeTypeMapper<T>());}dbConn = GetDbConnection();if (useDbTransaction && dbTransaction == null){dbTransaction = GetDbTransaction();}return queryOrExecSqlFunc(dbConn);}catch{throw;}finally{if (dbTransaction == null && dbConn != null){CloseDbConnection(dbConn);}}}private void CloseDbConnection(IDbConnection dbConn, bool disposed = false){if (dbConn != null){if (disposed && dbTransaction != null){dbTransaction.Rollback();dbTransaction.Dispose();dbTransaction = null;}if (dbConn.State != ConnectionState.Closed){dbConn.Close();}dbConn.Dispose();dbConn = null;}}/// <summary>/// 獲取一個事務(wù)對象(如果需要確保多條執(zhí)行語句的一致性,必需使用事務(wù))/// </summary>/// <param name="il"></param>/// <returns></returns>private IDbTransaction GetDbTransaction(IsolationLevel il = IsolationLevel.Unspecified){return GetDbConnection().BeginTransaction(il);}private DynamicParameters ToDynamicParameters(Dictionary<string, object> paramDic){return new DynamicParameters(paramDic);}#endregionpublic static string DbConnectionStringConfigPath{get{if (string.IsNullOrEmpty(dbConnectionStringConfigPath))//如果沒有指定配置文件,則取默認的配置文件路徑作為緩存依賴路徑{dbConnectionStringConfigPath = BaseUtil.GetConfigPath();}return dbConnectionStringConfigPath;}set{if (!string.IsNullOrWhiteSpace(value) && !File.Exists(value)){throw new FileNotFoundException("指定的DB連接字符串配置文件不存在:" + value);}//如果配置文件改變,則可能導(dǎo)致連接字符串改變,故必需清除所有連接字符串的緩存以便后續(xù)重新加載字符串if (!string.Equals(dbConnectionStringConfigPath, value, StringComparison.OrdinalIgnoreCase)){foreach (var item in dbConnNamesCacheDic){MemoryCacheUtil.RemoveCacheItem(item.Key);}}dbConnectionStringConfigPath = value;}}public SqlDapperUtil(string connName){dbConnectionName = connName;if (!dbConnNamesCacheDic.ContainsKey(connName)) //如果靜態(tài)緩存中沒有,則加入到靜態(tài)緩存中{dbConnNamesCacheDic[connName] = true;}}/// <summary>/// 使用事務(wù)/// </summary>public void UseDbTransaction(){useDbTransaction = true;}/// <summary>/// 獲取一個值,param可以是SQL參數(shù)也可以是匿名對象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <param name="param"></param>/// <param name="transaction"></param>/// <param name="commandTimeout"></param>/// <param name="commandType"></param>/// <returns></returns>public T GetValue<T>(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null){return UseDbConnection((dbConn) =>{return dbConn.ExecuteScalar<T>(sql, param, dbTransaction, commandTimeout, commandType);});}/// <summary>/// 獲取第一行的所有值,param可以是SQL參數(shù)也可以是匿名對象/// </summary>/// <param name="sql"></param>/// <param name="param"></param>/// <param name="transaction"></param>/// <param name="commandTimeout"></param>/// <param name="commandType"></param>/// <returns></returns>public Dictionary<string, dynamic> GetFirstValues(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null){return UseDbConnection((dbConn) =>{Dictionary<string, dynamic> firstValues = new Dictionary<string, dynamic>();List<string> indexColNameMappings = new List<string>();int rowIndex = 0;using (var reader = dbConn.ExecuteReader(sql, param, dbTransaction, commandTimeout, commandType)){while (reader.Read()){if ((++rowIndex) > 1) break;if (indexColNameMappings.Count == 0){for (int i = 0; i < reader.FieldCount; i++){indexColNameMappings.Add(reader.GetName(i));}}for (int i = 0; i < reader.FieldCount; i++){firstValues[indexColNameMappings[i]] = reader.GetValue(i);}}reader.Close();}return firstValues;});}/// <summary>/// 獲取一個數(shù)據(jù)模型實體類,param可以是SQL參數(shù)也可以是匿名對象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <param name="param"></param>/// <param name="transaction"></param>/// <param name="commandTimeout"></param>/// <param name="commandType"></param>/// <returns></returns>public T GetModel<T>(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null) where T : class{return UseDbConnection((dbConn) =>{return dbConn.QueryFirstOrDefault<T>(sql, param, dbTransaction, commandTimeout, commandType);});}/// <summary>/// 獲取符合條件的所有數(shù)據(jù)模型實體類列表,param可以是SQL參數(shù)也可以是匿名對象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <param name="param"></param>/// <param name="transaction"></param>/// <param name="buffered"></param>/// <param name="commandTimeout"></param>/// <param name="commandType"></param>/// <returns></returns>public List<T> GetModelList<T>(string sql, object param = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null) where T : class{return UseDbConnection((dbConn) =>{return dbConn.Query<T>(sql, param, dbTransaction, buffered, commandTimeout, commandType).ToList();});}/// <summary>/// 獲取符合條件的所有數(shù)據(jù)并根據(jù)動態(tài)構(gòu)建Model類委托來創(chuàng)建合適的返回結(jié)果(適用于臨時性結(jié)果且無對應(yīng)的模型實體類的情況)/// </summary>/// <typeparam name="T"></typeparam>/// <param name="buildModelFunc"></param>/// <param name="sql"></param>/// <param name="param"></param>/// <param name="buffered"></param>/// <param name="commandTimeout"></param>/// <param name="commandType"></param>/// <returns></returns>public T GetDynamicModel<T>(Func<IEnumerable<dynamic>, T> buildModelFunc, string sql, object param = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null){var dynamicResult = UseDbConnection((dbConn) =>{return dbConn.Query(sql, param, dbTransaction, buffered, commandTimeout, commandType);});return buildModelFunc(dynamicResult);}/// <summary>/// 獲取符合條件的所有指定返回結(jié)果對象的列表(復(fù)合對象【如:1對多,1對1】),param可以是SQL參數(shù)也可以是匿名對象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <param name="types"></param>/// <param name="map"></param>/// <param name="param"></param>/// <param name="transaction"></param>/// <param name="buffered"></param>/// <param name="splitOn"></param>/// <param name="commandTimeout"></param>/// <param name="commandType"></param>/// <returns></returns>public List<T> GetMultModelList<T>(string sql, Type[] types, Func<object[], T> map, object param = null, bool buffered = true, string splitOn = "Id", int? commandTimeout = null, CommandType? commandType = null){return UseDbConnection((dbConn) =>{return dbConn.Query<T>(sql, types, map, param, dbTransaction, buffered, splitOn, commandTimeout, commandType).ToList();});}/// <summary>/// 執(zhí)行SQL命令(CRUD),param可以是SQL參數(shù)也可以是要添加的實體類/// </summary>/// <param name="sql"></param>/// <param name="param"></param>/// <param name="transaction"></param>/// <param name="commandTimeout"></param>/// <param name="commandType"></param>/// <returns></returns>public bool ExecuteCommand(string sql, object param = null, int? commandTimeout = null, CommandType? commandType = null){return UseDbConnection((dbConn) =>{int result = dbConn.Execute(sql, param, dbTransaction, commandTimeout, commandType);return (result > 0);});}/// <summary>/// 批量轉(zhuǎn)移數(shù)據(jù)(利用SqlBulkCopy實現(xiàn)快速大批量插入到指定的目的表及SqlDataAdapter的批量刪除)/// </summary>public bool BatchMoveData(string srcSelectSql, string srcTableName, List<SqlParameter> srcPrimarykeyParams, string destConnName, string destTableName){using (SqlDataAdapter srcSqlDataAdapter = new SqlDataAdapter(srcSelectSql, GetDbConnectionString(dbConnectionName, out dbProviderName))){DataTable srcTable = new DataTable();SqlCommand deleteCommand = null;try{srcSqlDataAdapter.AcceptChangesDuringFill = true;srcSqlDataAdapter.AcceptChangesDuringUpdate = false;srcSqlDataAdapter.Fill(srcTable);if (srcTable == null || srcTable.Rows.Count <= 0) return true;string notExistsDestSqlWhere = null;string deleteSrcSqlWhere = null;for (int i = 0; i < srcPrimarykeyParams.Count; i++){string keyColName = srcPrimarykeyParams[i].ParameterName.Replace("@", "");notExistsDestSqlWhere += string.Format(" AND told.{0}=tnew.{0}", keyColName);deleteSrcSqlWhere += string.Format(" AND {0}=@{0}", keyColName);}string dbProviderName2 = null;using (var destConn = new SqlConnection(GetDbConnectionString(destConnName, out dbProviderName2))){destConn.Open();string tempDestTableName = "#temp_" + destTableName;destConn.Execute(string.Format("select top 0 * into {0} from {1}", tempDestTableName, destTableName));string destInsertCols = null;using (var destSqlBulkCopy = new SqlBulkCopy(destConn)){try{destSqlBulkCopy.BulkCopyTimeout = 120;destSqlBulkCopy.DestinationTableName = tempDestTableName;foreach (DataColumn col in srcTable.Columns){destSqlBulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);destInsertCols += "," + col.ColumnName;}destSqlBulkCopy.BatchSize = 1000;destSqlBulkCopy.WriteToServer(srcTable);}catch (Exception ex){//LogUtil.Error("SqlDapperUtil.BatchMoveData.SqlBulkCopy:" + ex.ToString(), "SqlDapperUtil.BatchMoveData");}destInsertCols = destInsertCols.Substring(1);destConn.Execute(string.Format("insert into {1}({0}) select {0} from {2} tnew where not exists(select 1 from {1} told where {3})",destInsertCols, destTableName, tempDestTableName, notExistsDestSqlWhere.Trim().Substring(3)), null, null, 100);}destConn.Close();}deleteCommand = new SqlCommand(string.Format("DELETE FROM {0} WHERE {1}", srcTableName, deleteSrcSqlWhere.Trim().Substring(3)), srcSqlDataAdapter.SelectCommand.Connection);deleteCommand.Parameters.AddRange(srcPrimarykeyParams.ToArray());deleteCommand.UpdatedRowSource = UpdateRowSource.None;deleteCommand.CommandTimeout = 200;srcSqlDataAdapter.DeleteCommand = deleteCommand;foreach (DataRow row in srcTable.Rows){row.Delete();}srcSqlDataAdapter.UpdateBatchSize = 1000;srcSqlDataAdapter.Update(srcTable);srcTable.AcceptChanges();return true;}catch (Exception ex){//LogUtil.Error("SqlDapperUtil.BatchMoveData:" + ex.ToString(), "SqlDapperUtil.BatchMoveData");return false;}finally{if (deleteCommand != null){deleteCommand.Parameters.Clear();}}}}/// <summary>/// 批量復(fù)制數(shù)據(jù)(把源DB中根據(jù)SQL語句查出的結(jié)果批量COPY插入到目的DB的目的表中)/// </summary>public TResult BatchCopyData<TResult>(string srcSelectSql, string destConnName, string destTableName, IDictionary<string, string> colMappings, Func<IDbConnection, TResult> afterCoppyFunc){using (SqlDataAdapter srcSqlDataAdapter = new SqlDataAdapter(srcSelectSql, GetDbConnectionString(dbConnectionName, out dbProviderName))){DataTable srcTable = new DataTable();TResult copyResult = default(TResult);try{srcSqlDataAdapter.AcceptChangesDuringFill = true;srcSqlDataAdapter.AcceptChangesDuringUpdate = false;srcSqlDataAdapter.Fill(srcTable);if (srcTable == null || srcTable.Rows.Count <= 0) return copyResult;string dbProviderName2 = null;using (var destConn = new SqlConnection(GetDbConnectionString(destConnName, out dbProviderName2))){destConn.Open();string tempDestTableName = "#temp_" + destTableName;destConn.Execute(string.Format("select top 0 * into {0} from {1}", tempDestTableName, destTableName));bool bcpResult = false;using (var destSqlBulkCopy = new SqlBulkCopy(destConn)){try{destSqlBulkCopy.BulkCopyTimeout = 120;destSqlBulkCopy.DestinationTableName = tempDestTableName;foreach (var col in colMappings){destSqlBulkCopy.ColumnMappings.Add(col.Key, col.Value);}destSqlBulkCopy.BatchSize = 1000;destSqlBulkCopy.WriteToServer(srcTable);bcpResult = true;}catch (Exception ex){//LogUtil.Error("SqlDapperUtil.BatchMoveData.SqlBulkCopy:" + ex.ToString(), "SqlDapperUtil.BatchMoveData");}}if (bcpResult){copyResult = afterCoppyFunc(destConn);}destConn.Close();}return copyResult;}catch (Exception ex){//LogUtil.Error("SqlDapperUtil.BatchCopyData:" + ex.ToString(), "SqlDapperUtil.BatchCopyData");return copyResult;}}}/// <summary>/// 當(dāng)使用了事務(wù),則最后需要調(diào)用該方法以提交所有操作/// </summary>/// <param name="dbTransaction"></param>public void Commit(){try{if (dbTransaction.Connection != null && dbTransaction.Connection.State != ConnectionState.Closed){dbTransaction.Commit();}}catch{throw;}finally{if (dbTransaction.Connection != null){CloseDbConnection(dbTransaction.Connection);}dbTransaction.Dispose();dbTransaction = null;useDbTransaction = false;if (dbConnection != null){CloseDbConnection(dbConnection);}}}/// <summary>/// 當(dāng)使用了事務(wù),如果報錯或需要中斷執(zhí)行,則需要調(diào)用該方法執(zhí)行回滾操作/// </summary>/// <param name="dbTransaction"></param>public void Rollback(){try{if (dbTransaction.Connection != null && dbTransaction.Connection.State != ConnectionState.Closed){dbTransaction.Rollback();}}catch{throw;}finally{if (dbTransaction.Connection != null){CloseDbConnection(dbTransaction.Connection);}dbTransaction.Dispose();dbTransaction = null;useDbTransaction = false;}}~SqlDapperUtil(){try{CloseDbConnection(dbConnection, true);}catch{ }}} }

ColumnAttributeTypeMapper輔助類相關(guān)代碼如下:(如果不考慮實體類的屬性與表字段不一致的情況,如下映射類可以不需要添加,同時SqlDapperUtil中移除相關(guān)依賴ColumnAttributeTypeMapper邏輯即可)

using Dapper; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks;namespace KYExpress.Common {public class ColumnAttributeTypeMapper<T> : FallbackTypeMapper{public ColumnAttributeTypeMapper(): base(new SqlMapper.ITypeMap[]{new CustomPropertyTypeMap(typeof(T),(type, columnName) =>type.GetProperties().FirstOrDefault(prop =>prop.GetCustomAttributes(false).OfType<ColumnAttribute>().Any(attr => attr.Name == columnName))),new DefaultTypeMap(typeof(T))}){}}[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]public class ColumnAttribute : Attribute{public string Name { get; set; }}public class FallbackTypeMapper : SqlMapper.ITypeMap{private readonly IEnumerable<SqlMapper.ITypeMap> _mappers;public FallbackTypeMapper(IEnumerable<SqlMapper.ITypeMap> mappers){_mappers = mappers;}public ConstructorInfo FindConstructor(string[] names, Type[] types){foreach (var mapper in _mappers){try{ConstructorInfo result = mapper.FindConstructor(names, types);if (result != null){return result;}}catch (NotImplementedException){}}return null;}public SqlMapper.IMemberMap GetConstructorParameter(ConstructorInfo constructor, string columnName){foreach (var mapper in _mappers){try{var result = mapper.GetConstructorParameter(constructor, columnName);if (result != null){return result;}}catch (NotImplementedException){}}return null;}public SqlMapper.IMemberMap GetMember(string columnName){foreach (var mapper in _mappers){try{var result = mapper.GetMember(columnName);if (result != null){return result;}}catch (NotImplementedException){}}return null;}public ConstructorInfo FindExplicitConstructor(){return _mappers.Select(mapper => mapper.FindExplicitConstructor()).FirstOrDefault(result => result != null);}}}

使用示例方法如下:

?1.先來模擬各種查詢數(shù)據(jù)(由于是直接寫模擬SQL輸出,故沒有條件,也便于大家COPY后直接可以測試結(jié)果)

//實例化SqlDapperUtil對象,構(gòu)造函數(shù)是config文件中的connectionStrings的Name名var dapper = new SqlDapperUtil("LmsConnectionString");//查詢1個值DateTime nowTime = dapper.GetValue<DateTime>("select getdate() as nowtime");//查詢1行值,并轉(zhuǎn)換成字典(這對于臨時查詢多個字段而無需定義實體類有用)Dictionary<string, dynamic> rowValues = dapper.GetFirstValues("select 0 as col0,1 as col1,2 as col2");//查詢1行并返回實體類Person person = dapper.GetModel<Person>("select '張三' as Name,22 as Age,'2018-1-1' as BirthDay,'中國廣東深圳' as HomeAddr");//查詢1行表字段與實體類屬性不一致映射Person person2 = dapper.GetModel<Person>("select '張三' as Name,22 as Age,'2018-1-1' as BirthDay,'中國廣東深圳' as HomeAddress");//查詢多行返回實體集合var persons = dapper.GetModelList<Person>(@"select '張三' as Name,22 as Age,'2018-1-1' as BirthDay,'中國廣東深圳' as HomeAddr union allselect '李四' as Name,25 as Age,'2018-10-1' as BirthDay,'中國廣東深圳' as HomeAddress union allselect '王五' as Name,35 as Age,'1982-10-1' as BirthDay,'中國廣東廣州' as HomeAddress");//查詢多行返回1對1關(guān)聯(lián)實體結(jié)果集var personWithCarResult = dapper.GetMultModelList<Person>(@"select t1.*,t2.* from(select '張三' as Name,22 as Age,'2018-1-1' as BirthDay,'中國廣東深圳' as HomeAddr union allselect '李四' as Name,25 as Age,'2018-10-1' as BirthDay,'中國廣東深圳' as HomeAddress union allselect '王五' as Name,35 as Age,'1982-10-1' as BirthDay,'中國廣東廣州' as HomeAddress)as t1 inner join(select '張三' as DriverName,'大眾' as Brand,'2018-8-8' as ManufactureDate union allselect '李四' as DriverName,'奔馳' as Brand,'2018-1-8' as ManufactureDate union allselect '王五' as DriverName,'奧迪' as Brand,'2017-8-8' as ManufactureDate)as t2on t1.Name=t2.DriverName", new[] { typeof(Person), typeof(CarInfo) }, (objs) =>{Person personItem = objs[0] as Person;CarInfo carItem = objs[1] as CarInfo;personItem.Car = carItem;return personItem;}, splitOn: "DriverName");//查詢多行返回1對多關(guān)聯(lián)實體結(jié)果=personWithManyCarsList<Person> personWithManyCars = new List<Person>();dapper.GetMultModelList<Person>(@"select t1.*,t2.* from(select '張三' as Name,22 as Age,'2018-1-1' as BirthDay,'中國廣東深圳' as HomeAddr union allselect '李四' as Name,25 as Age,'2018-10-1' as BirthDay,'中國廣東深圳' as HomeAddress union allselect '王五' as Name,35 as Age,'1982-10-1' as BirthDay,'中國廣東廣州' as HomeAddress)as t1 inner join(select '張三' as DriverName,'大眾' as Brand,'2018-8-8' as ManufactureDate union allselect '張三' as DriverName,'奔馳' as Brand,'2018-1-8' as ManufactureDate union allselect '張三' as DriverName,'奧迪' as Brand,'2017-8-8' as ManufactureDate)as t2on t1.Name=t2.DriverName", new[] { typeof(Person), typeof(CarInfo) }, (objs) =>{Person personItem = objs[0] as Person;CarInfo carItem = objs[1] as CarInfo;Person personItemMain = personWithManyCars.FirstOrDefault(p => p.Name == personItem.Name);if (personItemMain == null){personItem.Cars = new List<CarInfo>();personItemMain = personItem;personWithManyCars.Add(personItemMain);}personItemMain.Cars.Add(carItem);return personItemMain;}, splitOn: "DriverName");

2.下面是演示如何進行增、刪、改以及動態(tài)查詢的情況:

//使用事務(wù)創(chuàng)建多張表,多條SQL語句寫在一起try{dapper.UseDbTransaction();dapper.ExecuteCommand(@"create table T_Person(Name nvarchar(20) primary key,Age int,BirthDay datetime,HomeAddress nvarchar(200));create table T_CarInfo(DriverName nvarchar(20) primary key,Brand nvarchar(50),ManufactureDate datetime)");dapper.Commit();}catch (Exception ex){dapper.Rollback();//記日志}//使用事務(wù)批量插入多張表的多個記錄,多條SQL分多次執(zhí)行(參數(shù)支持批量集合對象傳入,無需循環(huán))try{dapper.UseDbTransaction();dapper.ExecuteCommand(@"insert into T_Person select N'張三' as Name,22 as Age,'2018-1-1' as BirthDay,N'中國廣東深圳' as HomeAddress union all select N'李四' as Name,25 as Age,'2018-10-1' as BirthDay,N'中國廣東深圳' as HomeAddress union all select N'王五' as Name,35 as Age,'1982-10-1' as BirthDay,N'中國廣東廣州' as HomeAddress");var carInfos = dapper.GetModelList<CarInfo>(@" select N'張三' as DriverName,N'大眾' as Brand,'2018-8-8' as ManufactureDate union all select N'李四' as DriverName,N'奔馳' as Brand,'2018-1-8' as ManufactureDate union all select N'王五' as DriverName,N'奧迪' as Brand,'2017-8-8' as ManufactureDate");dapper.ExecuteCommand(@"insert into T_CarInfo(DriverName,Brand,ManufactureDate) Values(@DriverName,@Brand,@ManufactureDate)", carInfos);dapper.Commit();}catch (Exception ex){dapper.Rollback();//記日志}//執(zhí)行刪除,有參數(shù),參數(shù)可以是實體類、匿名對象、字典(如有需要,可以是集合,以支持批量操作)bool deleteResult = dapper.ExecuteCommand("delete from T_CarInfo where DriverName=@DriverName", new { DriverName = "李四" });//構(gòu)建動態(tài)執(zhí)行SQL語句(以下是更新,查詢類似)StringBuilder updateSqlBuilder = new StringBuilder();var updateParams = new Dictionary<string, object>();if (1 == 1){updateSqlBuilder.Append(",Age=@Age");updateParams["Age"] = 20;}if (2 == 2){updateSqlBuilder.Append(",BirthDay=@BirthDay");updateParams["BirthDay"] = Convert.ToDateTime("2010-1-1");}if (3 == 3){updateSqlBuilder.Append(",HomeAddress=@HomeAddress");updateParams["HomeAddress"] = "中國北京天安門";}string updateSql = string.Concat("update T_Person set ", updateSqlBuilder.ToString().TrimStart(','), " where Name=@Name");updateParams["Name"] = "張三";bool updateResult = dapper.ExecuteCommand(updateSql, updateParams);//查詢返回動態(tài)自定義結(jié)果,之所以不直接返回Dynamic就好,是因為可讀性差,故盡可能的在執(zhí)行后就轉(zhuǎn)成指定的類型Tuple<string, int> hasCarInfo = dapper.GetDynamicModel<Tuple<string, int>>((rs) =>{var result = rs.First();return Tuple.Create<string, int>(result.Name, result.CarCount);}, @"select a.Name,count(b.DriverName) as CarCount from T_Person a left join T_CarInfo b on a.Name=b.DriverName where a.Name=@Name group by a.Name", new { Name = "張三" });

3.還有兩個方法:BatchCopyData、BatchMoveData,這是特殊封裝的,不是基于Dapper而是基于原生的Ado.net及BCP,目的是快速大量跨DB跨表COPY數(shù)據(jù)或轉(zhuǎn)移數(shù)據(jù),使用也不復(fù)雜,建議想了解的網(wǎng)友可以查看我以往的文章

以上示例方法用到了兩個類,如下:

class Person{public string Name { get; set; }public int Age { get; set; }public DateTime BirthDay { get; set; }[Column(Name = "HomeAddress")]public string HomeAddr { get; set; }public CarInfo Car { get; set; }public List<CarInfo> Cars { get; set; }}class CarInfo{public string Brand { get; set; }public DateTime ManufactureDate { get; set; }public string DriverName { get; set; }}

SqlDapperUtil類中依賴了之前我封裝的類:如:MemoryCacheUtil(本地內(nèi)存依賴緩存實用工具類)、ConfigUtil(配置文件管理工具類)、EncryptUtil(加密工具類),如果項目中不想引用這些類,可以移除或改成其它方法即可。

?另外說明一下,為了防止和減少因DB連接未及時釋放導(dǎo)致的連接池不足等原因,故默認執(zhí)行所有的CRUD方法都是用完即釋放,但有一種情況不會釋放就是使用了事務(wù),若使用事務(wù),則必需配套使用:UseDbTransaction、Commit、或失敗執(zhí)行Rollback,否則可能導(dǎo)致未能及時釋放對象,當(dāng)然最終當(dāng)SqlDapperUtil實例被回收后事務(wù)若沒有提交或回滾,會強制執(zhí)行回滾操作并釋放事務(wù)及連接對象,防止可能的資源浪費情況。

本來早就想總結(jié)一下這篇文章,但一直由于工作太忙沒有時間,今天利用加班研究.NET CORE的空隙時間完成,請大家支持,有好東西我一定會分享的,雖然不一定高大上,但一定實用且項目中有實戰(zhàn)過的。

轉(zhuǎn)載于:https://www.cnblogs.com/zuowj/p/9570956.html

總結(jié)

以上是生活随笔為你收集整理的基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

四川妇女搡bbbb搡bbbb搡 | 亚洲欧美少妇 | 综合五月婷婷 | 国产成人精品一二三区 | 久久视频网 | 成人wwwxxx视频 | 99精品视频播放 | 日批在线看 | 五月婷丁香 | 国产精品99在线观看 | 日韩深夜在线观看 | 麻豆视频网址 | 久久久高清一区二区三区 | 国产+日韩欧美 | 激情五月六月婷婷 | 欧美激情视频在线免费观看 | 亚洲蜜桃在线 | 日韩精品一区二区三区免费观看 | 天天夜夜狠狠操 | 婷婷六月中文字幕 | av免费在线播放 | 缴情综合网五月天 | 九九99视频| 中文字幕在线播放日韩 | 四川bbb搡bbb爽爽视频 | 操操综合| 六月丁香在线视频 | 国产又粗又猛又黄又爽视频 | 九九久久精品 | 狠狠躁日日躁狂躁夜夜躁 | 国产乱码精品一区二区蜜臀 | 日韩亚洲精品电影 | 天天干天天做 | 天天操天天色天天 | 中文字字幕在线 | 亚洲欧美婷婷六月色综合 | 五月天激情在线 | 在线一二三区 | 日韩国产在线观看 | 少妇高潮冒白浆 | 久久成年人| 国产日产欧美在线观看 | 日韩,中文字幕 | 国产大片免费久久 | 综合铜03| 久久精国产 | av在线一二三区 | 美女视频黄,久久 | 91亚洲国产成人久久精品网站 | 日本公乱妇视频 | 日韩在线观看视频免费 | 久久久国产精品一区二区三区 | 久久国产露脸精品国产 | 91精品区| 亚洲综合在线一区二区三区 | 久草精品在线观看 | 缴情综合网五月天 | 欧美极品少妇xbxb性爽爽视频 | 午夜10000| 国产麻豆视频网站 | 欧美日韩破处 | 国产精品久久精品 | 亚洲电影一区二区 | 亚洲va综合va国产va中文 | 激情图片qvod| 婷婷性综合 | 日日精品| 成人在线一区二区三区 | 色婷婷久久一区二区 | 一本一本久久a久久精品综合妖精 | 日韩精品一区电影 | 国产精品一区免费看8c0m | 国产精品99久久久久人中文网介绍 | 麻豆国产精品va在线观看不卡 | 色狠狠综合 | 91少妇精拍在线播放 | 国产1区在线 | 狠狠色伊人亚洲综合网站野外 | 婷婷九九| 日日日日日| 最近高清中文字幕 | 精品国内自产拍在线观看视频 | 香蕉视频久久 | 亚洲aⅴ久久精品 | 国产成人亚洲精品自产在线 | 在线观看日韩一区 | 午夜精品久久久久久久99 | 天堂激情网 | 久久久久久久久久久福利 | 精品福利视频在线观看 | 亚洲欧洲精品久久 | 激情视频久久 | 91在线视频播放 | 精品99999 | 天天综合视频在线观看 | 狠狠狠色 | 国产在线观看二区 | 97久久精品午夜一区二区 | 色婷婷免费视频 | 日韩久久精品一区二区 | 91免费网 | 色综合久久久 | 久操视频在线免费看 | av在观看 | 夜夜夜夜爽 | 91成人在线视频观看 | 超碰公开在线观看 | 91精品一区二区在线观看 | 国产精品自产拍在线观看网站 | 免费能看的黄色片 | 又黄又爽又刺激视频 | 国产97av | 91在线视频 | 91视频com| av丝袜美腿 | 日韩精品免费一区二区 | 色九九在线 | 在线国产视频观看 | 国产精品一区二区三区观看 | 久久国产一二区 | 国产伦精品一区二区三区四区视频 | 在线观看免费黄色 | 日韩免费一级a毛片在线播放一级 | 久久综合九色综合97婷婷女人 | 婷婷av色综合 | 亚洲成人高清在线 | 爱色av.com | 91激情 | 一区二区三区免费在线观看视频 | 91精品国自产在线偷拍蜜桃 | 亚洲日本va在线观看 | 深爱激情五月婷婷 | 超碰97.com| 黄色av高清 | 精品一区欧美 | 免费美女av| 91色国产| 精品在线观| 欧美日韩在线视频一区二区 | 国产美女黄网站免费 | 亚洲人成在线电影 | 在线看国产一区 | 久久99热精品 | 亚洲午夜精品福利 | 欧美一级免费在线 | 日韩在线不卡视频 | 99热这里只有精品久久 | 久久国语露脸国产精品电影 | 狠狠婷婷 | 亚洲五月激情 | 国产毛片久久 | 日韩欧美在线视频一区二区三区 | 超碰公开在线观看 | 日韩一区二区三区免费视频 | 国产精品久久久久久久久久久杏吧 | 人人射av| 亚洲不卡av一区二区三区 | 中文字幕在线播放av | 免费在线看成人av | 国产欧美综合视频 | 最近高清中文字幕 | 国产一区在线视频 | 99婷婷狠狠成为人免费视频 | 久久久久久久久久久免费av | 亚洲综合最新在线 | 中文字幕在线成人 | 黄色软件在线观看 | 黄色一级免费网站 | 欧美日韩一二三四区 | 亚洲综合激情 | 亚洲综合最新在线 | av在线等 | 超碰人人草| 九九九九精品九九九九 | 毛片网站观看 | 色婷婷狠狠五月综合天色拍 | 色97在线 | 中文字幕 国产视频 | 亚洲春色奇米影视 | 国产精品成人国产乱一区 | 二区三区在线视频 | 男女激情麻豆 | 国产精品一区二区在线看 | 国产精品久久久久久吹潮天美传媒 | 在线观看不卡视频 | 五月天久久婷 | 日韩精品一区二区三区水蜜桃 | 日本在线观看中文字幕 | 中文字幕在线视频精品 | 欧美综合国产 | 久久免费视频2 | 久久私人影院 | 高清av网站 | 丁香婷婷深情五月亚洲 | 亚洲综合最新在线 | 国产成人综合图片 | 久久精品欧美一区二区三区麻豆 | 欧美视频在线观看免费网址 | 欧美在线aa | 九色91视频| 草久久精品 | 91香蕉嫩草 | 黄色的视频网站 | 免费看久久久 | 中文字幕av播放 | 亚洲国产三级在线观看 | 中文区中文字幕免费看 | 国产精品男女视频 | 美女视频又黄又免费 | 欧美老人xxxx18 | 久久久久久影视 | 91精品播放 | 免费a视频在线观看 | 日日天天狠狠 | 日本在线视频一区二区三区 | 六月丁香伊人 | 在线观看国产日韩欧美 | www.天天操| 激情中文字幕 | 国产精品观看在线亚洲人成网 | 五月激情av| 国产精品高清在线 | 免费av大全 | 五月婷婷久久丁香 | 91av视频免费在线观看 | 亚洲最新视频在线 | 在线观看不卡的av | 日韩免费电影一区二区三区 | 黄色国产在线观看 | 日韩av一区二区在线播放 | 欧美日韩精品电影 | 在线 高清 中文字幕 | 久久久网址 | 亚洲va欧美va | 色资源网免费观看视频 | 探花视频在线观看+在线播放 | 午夜美女视频 | 欧美久久九九 | 日韩xxxbbb| 日韩字幕 | www久久| 亚洲精品一区二区18漫画 | 免费大片av| 天天亚洲综合 | 久久视奸| 免费观看www小视频的软件 | www欧美色 | 麻豆国产精品永久免费视频 | 亚洲国产日韩欧美在线 | 亚洲天堂色婷婷 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 丝袜美腿在线视频 | 国产三级香港三韩国三级 | 永久中文字幕 | 亚洲色图激情文学 | 久久99久久99精品免费看小说 | 人人射人人爱 | 久久久精品国产一区二区电影四季 | 日韩免费区 | 免费看国产曰批40分钟 | 欧美人人 | 天天干夜夜爱 | 精品字幕在线 | 欧美一区在线观看视频 | 亚洲国产精品一区二区久久hs | 国产精品九九九 | 成人av资源网 | 久久亚洲电影 | 国产高清福利在线 | 久久超级碰视频 | 亚洲天堂精品视频 | 五月天色丁香 | 欧美色综合 | 国产很黄很色的视频 | 欧美精品一区二区免费 | 91av色| 亚洲欧美日韩一区二区三区在线观看 | 1000部18岁以下禁看视频 | 欧美一级日韩免费不卡 | 91在线观看黄 | 免费在线观看黄色网 | 精品一区二区三区香蕉蜜桃 | 久草在线一免费新视频 | 日韩av进入 | 亚洲欧美综合精品久久成人 | 午夜精品久久久久久久久久久 | 天天夜操 | 黄色网址a | 青草视频在线 | 国产特级毛片aaaaaa高清 | 视频国产在线观看18 | 九九热国产视频 | 日韩精品短视频 | 久草网首页 | 男女激情片在线观看 | 亚洲视频久久久久 | 国产亚洲久一区二区 | 最新av在线播放 | 国产色在线观看 | 免费精品人在线二线三线 | 久久久久久高潮国产精品视 | 91精品久久久久久综合乱菊 | av黄色免费看| 天天综合久久综合 | 久免费 | 久久国产精品99国产精 | 欧美一区二区伦理片 | 中文字幕成人一区 | 亚洲午夜久久久久 | 免费在线观看黄色网 | 国产一区二区三区在线 | 国产精品久久99综合免费观看尤物 | 啪啪免费观看网站 | 亚洲91视频 | 日韩免费网站 | 成人一区二区三区在线观看 | 国内精品久久影院 | 国产成人av网 | 国产91区| 国产中文字幕91 | 亚洲欧美日韩精品久久久 | 久久视频在线观看中文字幕 | 欧美一级激情 | 亚洲高清在线视频 | 日韩视频在线不卡 | 成人av一区二区三区 | 九九色网 | 在线午夜电影神马影院 | 国产日韩一区在线 | 久久蜜臀一区二区三区av | 最新av免费 | 人人澡澡人人 | 麻豆观看 | 五月婷婷综合激情 | 久久伊人精品天天 | 精品久久久成人 | 99人久久精品视频最新地址 | 欧美精品一二 | 亚洲热久久 | 中文字幕在线观看视频免费 | 欧美精品被 | 日韩网站在线 | 国产精品九九久久久久久久 | 国产成人黄色av | 成人97视频一区二区 | 81精品国产乱码久久久久久 | 亚洲不卡在线 | 欧美激情视频在线观看免费 | 香蕉影院在线播放 | 久久免费国产精品1 | 成人福利在线播放 | 干干操操| 中文字幕欧美日韩va免费视频 | 综合色天天 | 麻豆一精品传二传媒短视频 | 成人 国产 在线 | 久久免费99精品久久久久久 | 日本最大色倩网站www | 911精品美国片911久久久 | 久久国产精品影片 | 亚洲三级在线 | 91麻豆精品久久久久久 | 一区二区三区免费在线观看 | 天天躁日日躁狠狠躁 | 天天操比| 国产精品久久久久久久电影 | 日韩欧美在线高清 | 亚洲精品视频久久 | 欧美极品一区二区三区 | 婷婷5月色 | 一区二区三区电影 | 91精品国产综合久久婷婷香蕉 | 91影视成人| 91视频91蝌蚪 | 亚洲成人精品在线 | 日韩丝袜 | 国产日韩欧美在线看 | 欧美另类v | 射久久久 | 免费在线a | 久久狠狠干 | 一区二区三区四区精品视频 | 中文字幕a在线 | 国产精品v a免费视频 | 久久综合九色综合97婷婷女人 | 一区二区三区四区精品 | av官网| 久久久久国产a免费观看rela | 国产综合视频在线观看 | 欧美成人手机版 | 欧美人人 | 99精品在线免费视频 | 一区二区理论片 | 992tv人人草 黄色国产区 | 91av资源网 | 手机av电影在线观看 | 国产网红在线观看 | 新版资源中文在线观看 | 日本aa在线 | 美女在线观看av | 五月天综合激情 | 五月视频| 久久久精品影视 | 久久精品专区 | 久久久亚洲精华液 | 精品黄色视 | 亚洲电影网站 | 国内久久久 | av福利第一导航 | 亚洲国产精品电影在线观看 | 欧美一级片免费播放 | 中文字幕免费高清在线观看 | 国产精品激情 | av观看免费在线 | 久久激情五月丁香伊人 | 日本视频网 | 91九色蝌蚪视频在线 | 精品久久影院 | 欧美极品在线播放 | 成年人视频免费在线播放 | 日韩综合在线观看 | 亚洲九九 | 国产精品videossex国产高清 | 在线天堂中文www视软件 | 九九免费在线观看视频 | 91在线一区 | 一区二区三区四区久久 | 中文在线中文a | 久久久免费精品国产一区二区 | 综合久久久久 | 91传媒91久久久 | 成人免费在线视频 | 精品91| 玖玖精品在线 | 激情电影影院 | 国产福利在线 | 天天色天天操天天爽 | 91精品国自产在线偷拍蜜桃 | 色婷婷在线视频 | 99精品视频在线播放观看 | 99国产情侣在线播放 | 狠狠色丁香久久综合网 | 一区二区精品在线视频 | 国产精品一区一区三区 | 91福利影院在线观看 | 国产精品丝袜久久久久久久不卡 | 午夜av电影| 在线观看一二三区 | 人人要人人澡人人爽人人dvd | 中文字幕丝袜美腿 | 亚洲涩涩涩涩涩涩 | 激情久久小说 | 国产在线高清 | 国产午夜激情视频 | 国产精品久久久久久999 | 久久国产精品99国产 | 久久国产精品一区二区三区 | 国产999在线| 国内视频在线 | 成年人黄色免费看 | h视频日本 | 欧美在线aa | 五月av在线| 中文字幕视频一区二区 | 成人av影视 | 97在线观看 | 午夜视频在线观看一区 | 精品国产资源 | 久久婷婷五月综合色丁香 | a国产精品 | 亚洲综合日韩在线 | 久久精品91久久久久久再现 | 国产精品18videosex性欧美 | 黄色一区二区在线观看 | 最近日本韩国中文字幕 | 亚洲日本在线视频观看 | 在线成人短视频 | 又黄又刺激视频 | www.av在线.com | 日本久久久久久科技有限公司 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 国产精品99久久久久久大便 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 久久国内精品视频 | 国产精品久久久久久久久大全 | 深爱五月激情五月 | 91豆麻精品91久久久久久 | 91精品伦理 | 福利一区二区三区四区 | av在线com| 人人天天夜夜 | 最新精品视频在线 | 久久国产热视频 | 97av视频 | 婷婷国产在线观看 | 九七视频在线观看 | 中文字幕在线观看完整版电影 | 国产中文字幕久久 | www.精选视频.com | 国产不卡在线 | 欧美精品久久天天躁 | 99热最新在线 | 91网页版在线观看 | 精品1区2区3区 | 麻豆传媒视频在线播放 | 播五月综合 | 在线观看中文字幕视频 | 五月婷婷视频 | 亚州精品在线视频 | 久久久九色精品国产一区二区三区 | 日韩高清一区 | 综合色婷婷 | 国产精品k频道 | 国产亚洲一级高清 | 天天色影院 | 婷婷六月丁 | 在线国产一区二区三区 | 国产精品一区二区免费看 | 国产剧情一区二区 | 色综合婷婷久久 | a级免费观看 | 国产精品免费不卡 | 国产精品永久久久久久久久久 | 天天操夜夜操夜夜操 | www夜夜操com | 五月天婷亚洲天综合网精品偷 | 天堂va欧美va亚洲va老司机 | 91在线操 | 99综合电影在线视频 | 亚洲成人午夜在线 | 久久精品国产亚洲a | 国产专区欧美专区 | 成人h在线观看 | 欧亚日韩精品一区二区在线 | 久久精品国产第一区二区三区 | 日本一区二区免费在线观看 | 久久国产精品久久久久 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 中文字幕在线观看1 | 在线免费av观看 | 日韩专区一区二区 | 久久精品免费播放 | 午夜色站| 国产精品一区二区久久精品 | 国产伦精品一区二区三区在线 | 国产精品久久久 | 亚洲天天 | 亚洲天堂精品视频在线观看 | 91看片黄色 | 色综合亚洲精品激情狠狠 | 视频二区在线视频 | 久久精品国产第一区二区三区 | 国产美女精品视频免费观看 | 成全在线视频免费观看 | 91丨九色丨丝袜 | 91桃色在线免费观看 | 欧洲激情综合 | 久久精品在线 | 丁香五月网久久综合 | 日韩欧美精品一区二区 | 99热国内精品 | 亚洲影院国产 | 一区二区三区四区免费视频 | 18岁免费看片| 亚洲一级电影视频 | 国产免费久久久久 | 国产精品美女久久久久久久 | 日本在线观看一区二区三区 | 超碰在线最新地址 | 中文字幕一区2区3区 | 亚洲砖区区免费 | 在线观看中文av | 欧美污在线观看 | 精品亚洲网| av电影在线观看完整版一区二区 | 国产香蕉av | 亚洲一区免费在线 | 国产一区二区在线免费播放 | 精品免费视频 | 成人免费观看视频大全 | 日韩videos | av免费成人| 国产一区视频在线 | 日韩视频1 | 欧美精品一区二区在线播放 | 波多野结衣电影一区 | 久久情网| 亚洲精品在线电影 | 久草在线视频首页 | 国产黄色观看 | 国产精品电影在线 | 992tv在线观看 | 国产 日韩 欧美 中文 在线播放 | 精品美女久久 | 国产91在线观 | 国产香蕉av | 国产精品视频久久久 | 欧美日韩国产免费视频 | 日韩免费高清 | av在线永久免费观看 | 国产精品久久综合 | av观看在线观看 | 天天五月天色 | 夜夜夜草| 久久九九久久精品 | 色婷婷午夜 | 久久精品老司机 | 精品视频99 | 国产午夜精品一区 | 6080yy精品一区二区三区 | 久久99精品国产99久久6尤 | 国产午夜三级一二三区 | 91免费在线 | 在线观看理论 | 日日精品| 99精品在线直播 | 欧美日韩在线视频一区 | 日韩动漫免费观看高清完整版在线观看 | 国精产品999国精产品视频 | 色婷婷亚洲婷婷 | 五月天色站 | 国产精品久久久久永久免费看 | av在线a| 欧美性生活免费看 | 亚洲狠狠操 | 天天操天天摸天天爽 | 免费视频三区 | 成人国产电影在线观看 | 中文永久字幕 | 午夜国产福利视频 | 婷婷天天色 | 婷婷久久综合九色综合 | 丁香六月av | 亚洲一本视频 | 成人午夜电影在线观看 | 国产成人一区二区三区影院在线 | 亚洲午夜av久久乱码 | 欧美日韩3p | www视频免费在线观看 | 特级黄录像视频 | 久久99国产视频 | 永久精品视频 | 极品嫩模被强到高潮呻吟91 | 国产高清一区二区 | 97超碰人 | 992tv又爽又黄的免费视频 | 西西444www大胆高清视频 | 亚洲在线免费视频 | jizzjizzjizz亚洲| 欧美日韩精品在线播放 | 一级精品视频在线观看宜春院 | 久久久这里有精品 | 欧美精品xxx | 免费99| 天天操天天舔天天爽 | 国产破处在线播放 | 久久精品免费播放 | 五月婷婷深开心 | 亚洲国产精久久久久久久 | 午夜av免费 | 日韩丝袜视频 | 亚洲日本一区二区在线 | 一二三精品视频 | 激情网站 | 成人久久精品 | 日韩免费视频播放 | 三级黄色片子 | 亚洲国产精品久久久 | 日韩av在线资源 | 亚洲视频一区二区三区在线观看 | 国产亚洲精品成人av久久影院 | 天天色欧美 | 伊人久久av | 爱干视频 | 高潮久久久久久 | 麻豆传媒视频在线免费观看 | 最近中文字幕国语免费av | 久草在线视频资源 | 91网址在线 | 日韩电影中文 | 日韩一区二区三区免费电影 | 中文字幕精品www乱入免费视频 | 国产精品专区在线 | 五月婷婷狠狠 | 怡红院久久 | 国产精品美女免费 | 久久久久久久久久久久久久av | av电影 一区二区 | 青青啪| 亚洲3级 | 免费三级骚 | 黄色特级毛片 | www蜜桃视频 | 伊人欧美| 中文字幕 第二区 | 天天射天天爱天天干 | 精品国产亚洲在线 | 日韩免费一区 | 日韩大片在线免费观看 | 欧美黄网站 | 国产三级午夜理伦三级 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 九九激情视频 | 亚洲黄色免费在线 | 久久国产精品系列 | 天天综合久久 | 欧美激情片在线观看 | av福利第一导航 | 欧美性成人 | 亚洲蜜桃av | 国产精品高清在线观看 | 日韩在线观看免费 | 91av在| 麻豆精品视频在线 | 中文在线字幕免费观看 | 曰韩精品| 成人久久综合 | 国产成人综合精品 | 久久午夜网 | 久草9视频| 欧美激情精品久久久久久变态 | 国产精品久久久999 国产91九色视频 | 草免费视频 | 欧美日韩观看 | 91亚洲视频在线观看 | 久草免费电影 | 国产精品每日更新 | 美女免费视频一区 | 国产精品视频在线观看 | 国产在线色 | 91av观看| 欧美99精品| 国产精品久久久久久久7电影 | 探花视频免费在线观看 | 国产在线播放观看 | 久久综合久久八八 | 成年人免费在线播放 | 亚洲欧美国产精品 | 欧美一级大片在线观看 | 一级欧美一级日韩 | 在线亚洲播放 | 国模视频一区二区三区 | 欧美日本啪啪无遮挡网站 | 91在线国产观看 | 超碰成人av | 久久免费视频6 | 成人黄色毛片视频 | 日韩电影精品 | 521色香蕉网站在线观看 | 在线免费黄色片 | 久草新在线 | 成人黄色片在线播放 | 91成人网在线观看 | 国产精品手机看片 | 中文字幕在线播出 | 欧美天堂视频在线 | 日韩在线观看一区 | 亚洲综合色丁香婷婷六月图片 | 亚洲黄色av网址 | 亚洲精品美女久久久久网站 | 国产精品福利一区 | 中国一级片在线观看 | 国产日韩欧美在线免费观看 | 免费看国产视频 | 亚洲成人资源网 | 亚洲天堂自拍视频 | 五月综合在线观看 | 久99久在线 | 2019av在线视频 | 亚洲首页| 天天激情天天干 | 色视频在线 | 久久精品国产久精国产 | 99久热在线精品视频观看 | 免费国产一区二区 | 亚洲第一中文网 | 国产剧情av在线播放 | 手机在线小视频 | 天天射天天添 | 天天av天天| 福利视频精品 | 二区中文字幕 | 日韩大陆欧美高清视频区 | 国产一区二区免费看 | 最新午夜| 成人午夜av电影 | 久久久久久久久亚洲精品 | 超碰人人99 | 91天天视频 | 国产91亚洲精品 | 91视频最新网址 | 一本一本久久a久久精品综合小说 | 国产精品一区电影 | 国产伦理剧 | a亚洲视频 | 国产在线一区二区 | 深爱激情五月网 | 三级黄色网址 | 少妇啪啪av入口 | 91福利国产在线观看 | 91精品视频在线看 | 免费韩国av | 欧美片网站yy | 91丨九色丨国产在线观看 | 66av99精品福利视频在线 | 欧美日韩精品免费观看视频 | 人人添人人澡人人澡人人人爽 | 在线成人免费电影 | 日韩精品2区| 亚洲爽爽网 | 在线电影av| 久久短视频 | 美女视频黄是免费的 | 天天干夜夜干 | 国产精品久久久久久久久蜜臀 | 最新真实国产在线视频 | 亚洲动漫在线观看 | 日韩在线激情 | 激情欧美一区二区免费视频 | 中文字幕免费高清av | 黄色小说视频在线 | 欧美亚洲免费在线一区 | 欧美日韩在线视频免费 | 波多野结衣电影一区二区 | 国产九色视频在线观看 | 免费在线精品视频 | 中文字幕在线免费看 | 伊人色综合久久天天 | 久久黄色小说视频 | 国色天香永久免费 | 日韩高清精品一区二区 | 99国产精品视频免费观看一公开 | 国产精品视频你懂的 | 精品久操| 欧美精品在线免费 | 国产剧情一区在线 | 视频国产在线观看18 | 国产精品亚洲综合久久 | 亚洲日韩中文字幕在线播放 | 超碰97人 | 国产成人一区二区三区免费看 | 国产999精品久久久久久绿帽 | 亚洲欧美精品一区 | 久久线视频 | 夜添久久精品亚洲国产精品 | avove黑丝| 国产精品ssss在线亚洲 | 亚洲国产精品小视频 | 色婷婷激情综合 | 91麻豆精品久久久久久 | 国产午夜精品av一区二区 | 九九九九免费视频 | 中文字幕色在线视频 | 天天摸天天操天天舔 | 日韩免费一区 | 国产精品免费久久 | 久久久精品欧美 | 麻豆视频成人 | 国产一级片在线播放 | 99r在线播放 | 中文字幕视频一区 | 四虎亚洲精品 | 日韩国产精品久久久久久亚洲 | 日本不卡一区二区三区在线观看 | 国产日产亚洲精华av | 亚洲成人999 | 欧美另类高清 | 在线免费性生活片 | 国产精品毛片一区 | 91精品国产91久久久久久三级 | 精品国产免费看 | 国产精品美女免费 | 久草久草在线 | 成人福利在线 | 182午夜在线观看 | 99久久精品无免国产免费 | 国产精品久久久一区二区三区网站 | 国产欧美久久久精品影院 | 国产一区二区影院 | 国产精品美女久久久免费 | 中文字幕中文中文字幕 | 特级黄录像视频 | 国产精品视频线看 | 人人爱夜夜操 | 国际精品网 | 99综合电影在线视频 | 国产黄色片在线 | 在线观看精品国产 | 久久草草影视免费网 | 久久久久久蜜av免费网站 | 欧美成人猛片 | 久久视频一区 | 国产一级黄色免费看 | 久久久久国产a免费观看rela | 精品在线观看一区二区三区 | 日本精品一区二区在线观看 | 欧美坐爱视频 | 国产99久久99热这里精品5 | 精品亚洲视频在线观看 | 九九免费精品 | 日日操天天爽 | 99婷婷狠狠成为人免费视频 | 亚洲一级久久 | av电影免费在线播放 | 麻豆久久精品 | 一级黄色大片在线观看 | 狠狠色丁香久久婷婷综合_中 | 四虎影视国产精品免费久久 | 国产97在线播放 | 久久久免费 | 一区二区三区四区精品视频 | 日韩欧美网址 | 一区免费在线 | 日韩免费三级 | 在线免费观看视频一区二区三区 | 在线观看免费中文字幕 | 国产一级淫片在线观看 | 亚洲国产中文在线观看 | 国产精品区二区三区日本 | 99色免费| 视频99爱 | 视频成人永久免费视频 | 国产精品区免费视频 | 国产视频综合在线 | 亚洲黄色免费在线 | av在线8| 91精品一区二区在线观看 | 黄色福利网站 | 久久久精品亚洲 | 久久免费视频网 | av一区二区在线观看中文字幕 | 东方av免费在线观看 | 成人av网站在线播放 | 欧美人体xx | 久久婷婷五月综合色丁香 | 欧美性受极品xxxx喷水 | 色网站国产精品 | 人人爱天天操 | 国产成人久久av977小说 | 国产精品资源 | 91看片在线免费观看 | 成人av资源 | 亚洲国产日韩欧美 | 激情五月播播久久久精品 | 国产在线观看你懂的 | 五月婷婷在线观看 | 天天射天天干天天 | adn—256中文在线观看 | 国产视频久久久久 | 97视频免费看 | 久久综合婷婷综合 | 中文字幕在线观看视频一区二区三区 | 日韩中文字幕91 | 天天做日日爱夜夜爽 | 九九国产视频 | 国产黄色精品在线观看 | 在线观看亚洲视频 | 国产无遮挡又黄又爽在线观看 | 精品久久久久久久久久久久 | 男女日麻批 | 久久免费精品 | 久久深夜福利免费观看 | 九九热免费在线观看 | 色综合久久久久综合体 | 国产美女精品视频 | 射射射综合网 | 国产精品自产拍在线观看中文 | av免费看av| 综合色婷婷 | 国产主播大尺度精品福利免费 | 91精品久久久久久综合乱菊 | 免费福利片2019潦草影视午夜 | 久影院| 少妇18xxxx性xxxx片 | 黄色亚洲大片免费在线观看 | av中文字幕在线免费观看 | 久久99久久99精品免观看粉嫩 | 91视频链接 | 日韩亚洲国产中文字幕 | 久久精品欧美视频 | 国产精品久久久一区二区三区网站 | 日韩高清一 | 综合国产视频 | 9999精品视频 | 中字幕视频在线永久在线观看免费 | 成年人在线免费看片 | 久久久国产精品一区二区三区 | 久久毛片视频 | 亚洲精品成人免费 | 久热爱 | 亚洲国产小视频在线观看 | 在线观看国产中文字幕 | 国产小视频精品 | www.色婷婷 | 国产91精品看黄网站在线观看动漫 | 国产欧美日韩精品一区二区免费 | 免费福利视频网站 | 伊人久在线 |