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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

轻量级ORM

發布時間:2025/7/14 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 轻量级ORM 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? 不知道可能稱的上是ORM,其實就是一個DBHelper??吹骄W上不少人寫自己的ORM,但我覺得都不太好。

? ? 我這個ORM,學習成本非常低,常用的方法僅有幾個,在使用的過程中,你不需要有太多要注意的地方,也不會有“我怎樣實現連表查詢”的疑問。反射犧牲一些性能,但是降低了實現和使用的復雜度。

? ? 支持Oracle、MSSQL、MySQL、SQLite四種數據庫,并配有Model生成器。

Model層的設計:

? ? Models目錄中的類及其屬性和數據庫中的表和字段是完全對應的,Models全部由生成器生成,并且不允許手動修改。ExtModels目錄中的類是擴展類,主要用于查詢與顯示,比如表中存的是code,但你需要關聯查詢另一張表中的name,就可以在這個擴展類中擴展一個用于顯示的name字段。Models和ExtModels目錄的中類都是partial修飾。

? ? 例(由于是SQLite數據庫,所以生成的Model沒有注釋,其它三種數據庫有注釋):

Model:

using System; using System.Collections.Generic; using System.Linq;namespace Models {/// <summary>/// /// </summary> [Serializable]public partial class BS_Template{/// <summary>/// /// </summary> [IsId][IsDBField]public string id { get; set; }/// <summary>/// /// </summary> [IsDBField]public string typeCode { get; set; }/// <summary>/// /// </summary> [IsDBField]public string type { get; set; }/// <summary>/// /// </summary> [IsDBField]public string code { get; set; }/// <summary>/// /// </summary> [IsDBField]public string name { get; set; }/// <summary>/// /// </summary> [IsDBField]public string path { get; set; }/// <summary>/// /// </summary> [IsDBField]public string folder { get; set; }/// <summary>/// /// </summary> [IsDBField]public string remarks { get; set; }} } View Code

ExtModel:

using System; using System.Collections.Generic; using System.Linq;namespace Models {/// <summary>/// /// </summary>public partial class BS_Template{//暫沒有擴展字段 } } View Code

?

DBHelper代碼:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Data; using System.Data.Common; using System.Data.Objects.DataClasses; using System.Data.OracleClient; using System.Data.SqlClient; using System.Data.SQLite; using System.Reflection; using System.Text; using Models; using MySql.Data.MySqlClient;namespace DBUtil {/// <summary>/// 數據庫操作類/// 2016年09月09日/// </summary>public class DBHelper{#region 變量/// <summary>/// 數據庫類型/// </summary>private static string m_DBType = ConfigurationManager.AppSettings["DBType"];/// <summary>/// 數據庫類型/// </summary>private static bool m_AutoIncrement = ConfigurationManager.AppSettings["AutoIncrement"].ToLower() == "true" ? true : false;/// <summary>/// 數據庫連接字符串/// </summary>private static string m_ConnectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString();/// <summary>/// 事務/// </summary> [ThreadStatic]private static DbTransaction m_Tran;/// <summary>/// 帶參數的SQL插入和修改語句中,參數前面的符號/// </summary>private static string m_ParameterMark = GetParameterMark();#endregion#region 構造函數/// <summary>/// 數據庫操作類/// </summary>public DBHelper(){}#endregion#region 生成變量#region 生成 IDbCommand/// <summary>/// 生成 IDbCommand/// </summary>private DbCommand GetCommand(){DbCommand command = null;switch (m_DBType){case "oracle":command = new OracleCommand();break;case "mssql":command = new SqlCommand();break;case "mysql":command = new MySqlCommand();break;case "sqlite":command = new SQLiteCommand();break;}return command;}/// <summary>/// 生成 IDbCommand/// </summary>private DbCommand GetCommand(string sql, DbConnection conn){DbCommand command = null;switch (m_DBType){case "oracle":command = new OracleCommand(sql);command.Connection = conn;break;case "mssql":command = new SqlCommand(sql);command.Connection = conn;break;case "mysql":command = new MySqlCommand(sql);command.Connection = conn;break;case "sqlite":command = new SQLiteCommand(sql);command.Connection = conn;break;}return command;}#endregion#region 生成 IDbConnection/// <summary>/// 生成 IDbConnection/// </summary>private static DbConnection GetConnection(){DbConnection conn = null;switch (m_DBType){case "oracle":conn = new OracleConnection(m_ConnectionString);break;case "mssql":conn = new SqlConnection(m_ConnectionString);break;case "mysql":conn = new MySqlConnection(m_ConnectionString);break;case "sqlite":conn = new SQLiteConnection(m_ConnectionString);break;}return conn;}#endregion#region 生成 IDbDataAdapter/// <summary>/// 生成 IDbDataAdapter/// </summary>private DbDataAdapter GetDataAdapter(DbCommand cmd){DbDataAdapter dataAdapter = null;switch (m_DBType){case "oracle":dataAdapter = new OracleDataAdapter();dataAdapter.SelectCommand = cmd;break;case "mssql":dataAdapter = new SqlDataAdapter();dataAdapter.SelectCommand = cmd;break;case "mysql":dataAdapter = new MySqlDataAdapter();dataAdapter.SelectCommand = cmd;break;case "sqlite":dataAdapter = new SQLiteDataAdapter();dataAdapter.SelectCommand = cmd;break;}return dataAdapter;}#endregion#region 生成 m_ParameterMark/// <summary>/// 生成 m_ParameterMark/// </summary>private static string GetParameterMark(){switch (m_DBType){case "oracle":return ":";case "mssql":return "@";case "mysql":return "@";case "sqlite":return ":";}return ":";}#endregion#region 生成 DbParameter/// <summary>/// 生成 DbParameter/// </summary>private DbParameter GetDbParameter(string name, object value){DbParameter dbParameter = null;switch (m_DBType){case "oracle":dbParameter = new OracleParameter(name, value);break;case "mssql":dbParameter = new SqlParameter(name, value);break;case "mysql":dbParameter = new MySqlParameter(name, value);break;case "sqlite":dbParameter = new SQLiteParameter(name, value);break;}return dbParameter;}#endregion#endregion#region 基礎方法#region 執行簡單SQL語句#region Existspublic bool Exists(string sqlString){using (DbConnection conn = GetConnection()){using (DbCommand cmd = GetCommand(sqlString, conn)){try{conn.Open();object obj = cmd.ExecuteScalar();if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))){return false;}else{return true;}}catch (Exception ex){throw ex;}finally{cmd.Dispose();conn.Close();}}}}#endregion#region 執行SQL語句,返回影響的記錄數/// <summary>/// 執行SQL語句,返回影響的記錄數/// </summary>/// <param name="sqlString">SQL語句</param>/// <returns>影響的記錄數</returns>public int ExecuteSql(string sqlString){DbConnection conn = m_Tran == null ? GetConnection() : m_Tran.Connection;using (DbCommand cmd = GetCommand(sqlString, conn)){try{if (conn.State != ConnectionState.Open) conn.Open();if (m_Tran != null) cmd.Transaction = m_Tran;int rows = cmd.ExecuteNonQuery();return rows;}catch (Exception ex){throw new Exception(ex.Message);}finally{cmd.Dispose();if (m_Tran == null) conn.Close();}}}#endregion#region 執行一條計算查詢結果語句,返回查詢結果/// <summary>/// 執行一條計算查詢結果語句,返回查詢結果(object)/// </summary>/// <param name="sqlString">計算查詢結果語句</param>/// <returns>查詢結果(object)</returns>public object GetSingle(string sqlString){using (DbConnection conn = GetConnection()){using (DbCommand cmd = GetCommand(sqlString, conn)){try{if (conn.State != ConnectionState.Open) conn.Open();object obj = cmd.ExecuteScalar();if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))){return null;}else{return obj;}}catch (Exception ex){throw ex;}finally{cmd.Dispose();}}}}#endregion#region 執行查詢語句,返回IDataReader/// <summary>/// 執行查詢語句,返回IDataReader ( 注意:調用該方法后,一定要對IDataReader進行Close )/// </summary>/// <param name="sqlString">查詢語句</param>/// <returns>IDataReader</returns>public DbDataReader ExecuteReader(string sqlString){DbConnection conn = GetConnection();DbCommand cmd = GetCommand(sqlString, conn);try{if (conn.State != ConnectionState.Open) conn.Open();DbDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);return myReader;}catch (Exception ex){throw ex;}}#endregion#region 執行查詢語句,返回DataSet/// <summary>/// 執行查詢語句,返回DataSet/// </summary>/// <param name="sqlString">查詢語句</param>/// <returns>DataSet</returns>public DataSet Query(string sqlString){using (DbConnection conn = GetConnection()){DataSet ds = new DataSet();try{conn.Open();using (DbCommand cmd = GetCommand(sqlString, conn)){DbDataAdapter adapter = GetDataAdapter(cmd);adapter.Fill(ds, "ds");}}catch (Exception ex){throw ex;}finally{conn.Close();}return ds;}}#endregion#endregion#region 執行帶參數的SQL語句#region 執行SQL語句,返回影響的記錄數/// <summary>/// 執行SQL語句,返回影響的記錄數/// </summary>/// <param name="SQLString">SQL語句</param>/// <returns>影響的記錄數</returns>public int ExecuteSql(string SQLString, params DbParameter[] cmdParms){DbConnection conn = m_Tran == null ? GetConnection() : m_Tran.Connection;using (DbCommand cmd = GetCommand()){try{PrepareCommand(cmd, conn, m_Tran, SQLString, cmdParms);int rows = cmd.ExecuteNonQuery();cmd.Parameters.Clear();return rows;}catch (Exception ex){throw ex;}finally{cmd.Dispose();if (m_Tran == null) conn.Close();}}}#endregion#region 執行查詢語句,返回IDataReader/// <summary>/// 執行查詢語句,返回IDataReader ( 注意:調用該方法后,一定要對IDataReader進行Close )/// </summary>/// <param name="strSQL">查詢語句</param>/// <returns>IDataReader</returns>public DbDataReader ExecuteReader(string sqlString, params DbParameter[] cmdParms){DbConnection conn = GetConnection();DbCommand cmd = GetCommand();try{PrepareCommand(cmd, conn, null, sqlString, cmdParms);DbDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection);cmd.Parameters.Clear();return myReader;}catch (Exception ex){throw ex;}}#endregion#region 執行查詢語句,返回DataSet/// <summary>/// 執行查詢語句,返回DataSet/// </summary>/// <param name="sqlString">查詢語句</param>/// <returns>DataSet</returns>public DataSet Query(string sqlString, params DbParameter[] cmdParms){DbConnection conn = GetConnection();DbCommand cmd = GetCommand();PrepareCommand(cmd, conn, null, sqlString, cmdParms);using (DbDataAdapter da = GetDataAdapter(cmd)){DataSet ds = new DataSet();try{da.Fill(ds, "ds");cmd.Parameters.Clear();}catch (Exception ex){throw ex;}finally{cmd.Dispose();conn.Close();}return ds;}}#endregion#region PrepareCommandprivate void PrepareCommand(DbCommand cmd, DbConnection conn, DbTransaction trans, string cmdText, DbParameter[] cmdParms){if (conn.State != ConnectionState.Open) conn.Open();cmd.Connection = conn;cmd.CommandText = cmdText;if (trans != null) cmd.Transaction = trans;cmd.CommandType = CommandType.Text;if (cmdParms != null){foreach (DbParameter parm in cmdParms){cmd.Parameters.Add(parm);}}}#endregion#endregion#endregion#region 增刪改查#region 獲取最大編號/// <summary>/// 獲取最大編號/// </summary>/// <typeparam name="T">實體Model</typeparam>/// <param name="key">主鍵</param>public int GetMaxID<T>(string key){Type type = typeof(T);string sql = null;switch (m_DBType){case "oracle":sql = string.Format("SELECT Max({0}) FROM {1}", key, type.Name);break;case "mssql":sql = string.Format("SELECT Max({0}) FROM {1}", key, type.Name);break;case "mysql":sql = string.Format("SELECT Max({0}) FROM {1}", key, type.Name);break;case "sqlite":sql = string.Format("SELECT Max(cast({0} as int)) FROM {1}", key, type.Name);break;}using (DbConnection conn = GetConnection()){using (IDbCommand cmd = GetCommand(sql, conn)){try{conn.Open();object obj = cmd.ExecuteScalar();if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value))){return 1;}else{return int.Parse(obj.ToString()) + 1;}}catch (Exception ex){throw ex;}finally{cmd.Dispose();conn.Close();}}}}#endregion#region 添加/// <summary>/// 添加/// </summary>public void Insert(object obj){Insert(obj, m_AutoIncrement);}/// <summary>/// 添加/// </summary>public void Insert(object obj, bool autoIncrement){StringBuilder strSql = new StringBuilder();Type type = obj.GetType();strSql.Append(string.Format("insert into {0}(", type.Name));PropertyInfo[] propertyInfoList = GetEntityProperties(type);List<string> propertyNameList = new List<string>();int savedCount = 0;foreach (PropertyInfo propertyInfo in propertyInfoList){if (propertyInfo.GetCustomAttributes(typeof(IsIdAttribute), false).Length > 0 && autoIncrement) return;if (propertyInfo.GetCustomAttributes(typeof(IsDBFieldAttribute), false).Length > 0){propertyNameList.Add(propertyInfo.Name);savedCount++;}}strSql.Append(string.Format("{0})", string.Join(",", propertyNameList.ToArray())));strSql.Append(string.Format(" values ({0})", string.Join(",", propertyNameList.ConvertAll<string>(a => m_ParameterMark + a).ToArray())));DbParameter[] parameters = new DbParameter[savedCount];int k = 0;for (int i = 0; i < propertyInfoList.Length && savedCount > 0; i++){PropertyInfo propertyInfo = propertyInfoList[i];if (propertyInfo.GetCustomAttributes(typeof(IsIdAttribute), false).Length > 0 && autoIncrement) return;if (propertyInfo.GetCustomAttributes(typeof(IsDBFieldAttribute), false).Length > 0){object val = propertyInfo.GetValue(obj, null);DbParameter param = GetDbParameter(m_ParameterMark + propertyInfo.Name, val == null ? DBNull.Value : val);parameters[k++] = param;}}ExecuteSql(strSql.ToString(), parameters);}#endregion#region 修改/// <summary>/// 修改/// </summary>public void Update(object obj){object oldObj = Find(obj, false);if (oldObj == null) throw new Exception("無法獲取到舊數據");StringBuilder strSql = new StringBuilder();Type type = obj.GetType();strSql.Append(string.Format("update {0} ", type.Name));PropertyInfo[] propertyInfoList = GetEntityProperties(type);List<string> propertyNameList = new List<string>();int savedCount = 0;foreach (PropertyInfo propertyInfo in propertyInfoList){if (propertyInfo.GetCustomAttributes(typeof(IsDBFieldAttribute), false).Length > 0){object oldVal = propertyInfo.GetValue(oldObj, null);object val = propertyInfo.GetValue(obj, null);if (!object.Equals(oldVal, val)){propertyNameList.Add(propertyInfo.Name);savedCount++;}}}strSql.Append(string.Format(" set "));DbParameter[] parameters = new DbParameter[savedCount];StringBuilder sbPros = new StringBuilder();int k = 0;for (int i = 0; i < propertyInfoList.Length && savedCount > 0; i++){PropertyInfo propertyInfo = propertyInfoList[i];if (propertyInfo.GetCustomAttributes(typeof(IsDBFieldAttribute), false).Length > 0){object oldVal = propertyInfo.GetValue(oldObj, null);object val = propertyInfo.GetValue(obj, null);if (!object.Equals(oldVal, val)){sbPros.Append(string.Format(" {0}={1}{0},", propertyInfo.Name, m_ParameterMark));DbParameter param = GetDbParameter(m_ParameterMark + propertyInfo.Name, val == null ? DBNull.Value : val);parameters[k++] = param;}}}if (sbPros.Length > 0){strSql.Append(sbPros.ToString(0, sbPros.Length - 1));}strSql.Append(string.Format(" where {0}='{1}'", GetIdName(obj.GetType()), GetIdVal(obj).ToString()));if (savedCount > 0){ExecuteSql(strSql.ToString(), parameters);}}#endregion#region 刪除/// <summary>/// 根據Id刪除/// </summary>public void Delete<T>(int id){Type type = typeof(T);StringBuilder sbSql = new StringBuilder();sbSql.Append(string.Format("delete from {0} where {2}='{1}'", type.Name, id, GetIdName(type)));ExecuteSql(sbSql.ToString());}/// <summary>/// 根據Id集合刪除/// </summary>public void BatchDelete<T>(string ids){if (string.IsNullOrWhiteSpace(ids)) return;Type type = typeof(T);StringBuilder sbSql = new StringBuilder();sbSql.Append(string.Format("delete from {0} where {2} in ({1})", type.Name, ids, GetIdName(type)));ExecuteSql(sbSql.ToString());}/// <summary>/// 根據條件刪除/// </summary>public void Delete<T>(string conditions){if (string.IsNullOrWhiteSpace(conditions)) return;Type type = typeof(T);StringBuilder sbSql = new StringBuilder();sbSql.Append(string.Format("delete from {0} where {1}", type.Name, conditions));ExecuteSql(sbSql.ToString());}#endregion#region 獲取實體#region 根據實體獲取實體/// <summary>/// 根據實體獲取實體/// </summary>private object Find(object obj, bool readCache = true){Type type = obj.GetType();object result = Activator.CreateInstance(type);bool hasValue = false;IDataReader rd = null;string sql = string.Format("select * from {0} where {2}='{1}'", type.Name, GetIdVal(obj), GetIdName(obj.GetType()));try{rd = ExecuteReader(sql);PropertyInfo[] propertyInfoList = GetEntityProperties(type);int fcnt = rd.FieldCount;List<string> fileds = new List<string>();for (int i = 0; i < fcnt; i++){fileds.Add(rd.GetName(i).ToUpper());}while (rd.Read()){hasValue = true;IDataRecord record = rd;foreach (PropertyInfo pro in propertyInfoList){if (!fileds.Contains(pro.Name.ToUpper()) || record[pro.Name] == DBNull.Value){continue;}pro.SetValue(result, record[pro.Name] == DBNull.Value ? null : getReaderValue(record[pro.Name], pro.PropertyType), null);}}}catch (Exception ex){throw ex;}finally{if (rd != null && !rd.IsClosed){rd.Close();rd.Dispose();}}if (hasValue){return result;}else{return null;}}#endregion#region 根據Id獲取實體/// <summary>/// 根據Id獲取實體/// </summary>private object FindById(Type type, int id){object result = Activator.CreateInstance(type);IDataReader rd = null;bool hasValue = false;string sql = string.Format("select * from {0} where {2}='{1}'", type.Name, id, GetIdName(type));try{rd = ExecuteReader(sql);PropertyInfo[] propertyInfoList = GetEntityProperties(type);int fcnt = rd.FieldCount;List<string> fileds = new List<string>();for (int i = 0; i < fcnt; i++){fileds.Add(rd.GetName(i).ToUpper());}while (rd.Read()){hasValue = true;IDataRecord record = rd;foreach (PropertyInfo pro in propertyInfoList){if (!fileds.Contains(pro.Name.ToUpper()) || record[pro.Name] == DBNull.Value){continue;}pro.SetValue(result, record[pro.Name] == DBNull.Value ? null : getReaderValue(record[pro.Name], pro.PropertyType), null);}}}catch (Exception ex){throw ex;}finally{if (rd != null && !rd.IsClosed){rd.Close();rd.Dispose();}}if (hasValue){return result;}else{return null;}}#endregion#region 根據Id獲取實體/// <summary>/// 根據Id獲取實體/// </summary>public T FindById<T>(string id) where T : new(){Type type = typeof(T);T result = (T)Activator.CreateInstance(type);IDataReader rd = null;bool hasValue = false;string sql = string.Format("select * from {0} where {2}='{1}'", type.Name, id, GetIdName(type));try{rd = ExecuteReader(sql);PropertyInfo[] propertyInfoList = GetEntityProperties(type);int fcnt = rd.FieldCount;List<string> fileds = new List<string>();for (int i = 0; i < fcnt; i++){fileds.Add(rd.GetName(i).ToUpper());}while (rd.Read()){hasValue = true;IDataRecord record = rd;foreach (PropertyInfo pro in propertyInfoList){if (!fileds.Contains(pro.Name.ToUpper()) || record[pro.Name] == DBNull.Value){continue;}pro.SetValue(result, record[pro.Name] == DBNull.Value ? null : getReaderValue(record[pro.Name], pro.PropertyType), null);}}}catch (Exception ex){throw ex;}finally{if (rd != null && !rd.IsClosed){rd.Close();rd.Dispose();}}if (hasValue){return result;}else{return default(T);}}#endregion#region 根據sql獲取實體/// <summary>/// 根據sql獲取實體/// </summary>public T FindBySql<T>(string sql) where T : new(){Type type = typeof(T);T result = (T)Activator.CreateInstance(type);IDataReader rd = null;bool hasValue = false;try{rd = ExecuteReader(sql);PropertyInfo[] propertyInfoList = GetEntityProperties(type);int fcnt = rd.FieldCount;List<string> fileds = new List<string>();for (int i = 0; i < fcnt; i++){fileds.Add(rd.GetName(i).ToUpper());}while (rd.Read()){hasValue = true;IDataRecord record = rd;foreach (PropertyInfo pro in propertyInfoList){if (!fileds.Contains(pro.Name.ToUpper()) || record[pro.Name] == DBNull.Value){continue;}pro.SetValue(result, record[pro.Name] == DBNull.Value ? null : getReaderValue(record[pro.Name], pro.PropertyType), null);}}}catch (Exception ex){throw ex;}finally{if (rd != null && !rd.IsClosed){rd.Close();rd.Dispose();}}if (hasValue){return result;}else{return default(T);}}#endregion#endregion#region 獲取列表/// <summary>/// 獲取列表/// </summary>public List<T> FindListBySql<T>(string sql) where T : new(){List<T> list = new List<T>();object obj;IDataReader rd = null;try{rd = ExecuteReader(sql);if (typeof(T) == typeof(int)){while (rd.Read()){list.Add((T)rd[0]);}}else if (typeof(T) == typeof(string)){while (rd.Read()){list.Add((T)rd[0]);}}else{PropertyInfo[] propertyInfoList = (typeof(T)).GetProperties();int fcnt = rd.FieldCount;List<string> fileds = new List<string>();for (int i = 0; i < fcnt; i++){fileds.Add(rd.GetName(i).ToUpper());}while (rd.Read()){IDataRecord record = rd;obj = new T();foreach (PropertyInfo pro in propertyInfoList){if (!fileds.Contains(pro.Name.ToUpper()) || record[pro.Name] == DBNull.Value){continue;}pro.SetValue(obj, record[pro.Name] == DBNull.Value ? null : getReaderValue(record[pro.Name], pro.PropertyType), null);}list.Add((T)obj);}}}catch (Exception ex){throw ex;}finally{if (rd != null && !rd.IsClosed){rd.Close();rd.Dispose();}}return list;}#endregion#region 獲取列表/// <summary>/// 獲取列表/// </summary>public List<T> FindListBySql<T>(string sql, params DbParameter[] cmdParms) where T : new(){List<T> list = new List<T>();object obj;IDataReader rd = null;try{rd = ExecuteReader(sql, cmdParms);if (typeof(T) == typeof(int)){while (rd.Read()){list.Add((T)rd[0]);}}else if (typeof(T) == typeof(string)){while (rd.Read()){list.Add((T)rd[0]);}}else{PropertyInfo[] propertyInfoList = (typeof(T)).GetProperties();int fcnt = rd.FieldCount;List<string> fileds = new List<string>();for (int i = 0; i < fcnt; i++){fileds.Add(rd.GetName(i).ToUpper());}while (rd.Read()){IDataRecord record = rd;obj = new T();foreach (PropertyInfo pro in propertyInfoList){if (!fileds.Contains(pro.Name.ToUpper()) || record[pro.Name] == DBNull.Value){continue;}pro.SetValue(obj, record[pro.Name] == DBNull.Value ? null : getReaderValue(record[pro.Name], pro.PropertyType), null);}list.Add((T)obj);}}}catch (Exception ex){throw ex;}finally{if (rd != null && !rd.IsClosed){rd.Close();rd.Dispose();}}return list;}#endregion#region 分頁獲取列表/// <summary>/// 分頁(任意entity,盡量少的字段)/// </summary>public PagerModel FindPageBySql<T>(string sql, string orderby, int pageSize, int currentPage) where T : new(){PagerModel pagerModel = new PagerModel(currentPage, pageSize);using (DbConnection connection = GetConnection()){connection.Open();IDbCommand cmd = null;StringBuilder sb = new StringBuilder();string commandText = null;int startRow = 0;int endRow = 0;switch (m_DBType){case "oracle":#region 分頁查詢語句commandText = string.Format("select count(*) from ({0}) T", sql);cmd = GetCommand(commandText, connection);pagerModel.totalRows = int.Parse(cmd.ExecuteScalar().ToString());startRow = pageSize * (currentPage - 1);endRow = startRow + pageSize;sb.Append("select * from ( select row_limit.*, rownum rownum_ from (");sb.Append(sql);if (!string.IsNullOrWhiteSpace(orderby)){sb.Append(" ");sb.Append(orderby);}sb.Append(" ) row_limit where rownum <= ");sb.Append(endRow);sb.Append(" ) where rownum_ >");sb.Append(startRow);#endregionbreak;case "mssql":#region 分頁查詢語句commandText = string.Format("select count(*) from ({0}) T", sql);cmd = GetCommand(commandText, connection);pagerModel.totalRows = int.Parse(cmd.ExecuteScalar().ToString());startRow = pageSize * (currentPage - 1) + 1;endRow = startRow + pageSize - 1;sb.Append(string.Format(@"select * from (select ROW_NUMBER() over({1}) as rowNumber, t.* from ({0}) t) tempTablewhere rowNumber between {2} and {3} ", sql, orderby, startRow, endRow));#endregionbreak;case "mysql":#region 分頁查詢語句commandText = string.Format("select count(*) from ({0}) T", sql);cmd = GetCommand(commandText, connection);pagerModel.totalRows = int.Parse(cmd.ExecuteScalar().ToString());startRow = pageSize * (currentPage - 1);sb.Append("select * from (");sb.Append(sql);if (!string.IsNullOrWhiteSpace(orderby)){sb.Append(" ");sb.Append(orderby);}sb.AppendFormat(" ) row_limit limit {0},{1}", startRow, pageSize);#endregionbreak;case "sqlite":#region 分頁查詢語句commandText = string.Format("select count(*) from ({0}) T", sql);cmd = GetCommand(commandText, connection);pagerModel.totalRows = int.Parse(cmd.ExecuteScalar().ToString());startRow = pageSize * (currentPage - 1);sb.Append(sql);if (!string.IsNullOrWhiteSpace(orderby)){sb.Append(" ");sb.Append(orderby);}sb.AppendFormat(" limit {0} offset {1}", pageSize, startRow);#endregionbreak;}List<T> list = FindListBySql<T>(sb.ToString());pagerModel.result = list;}return pagerModel;}#endregion#region 分頁獲取列表/// <summary>/// 分頁(任意entity,盡量少的字段)/// </summary>/// <typeparam name="T"></typeparam>/// <param name="sql"></param>/// <returns></returns>public PagerModel FindPageBySql<T>(string sql, string orderby, int pageSize, int currentPage, params DbParameter[] cmdParms) where T : new(){PagerModel pagerModel = new PagerModel(currentPage, pageSize);using (DbConnection connection = GetConnection()){connection.Open();IDbCommand cmd = null;StringBuilder sb = new StringBuilder();string commandText = null;int startRow = 0;int endRow = 0;switch (m_DBType){case "oracle":#region 分頁查詢語句commandText = string.Format("select count(*) from ({0}) T", sql);cmd = GetCommand(commandText, connection);pagerModel.totalRows = int.Parse(cmd.ExecuteScalar().ToString());startRow = pageSize * (currentPage - 1);endRow = startRow + pageSize;sb.Append("select * from ( select row_limit.*, rownum rownum_ from (");sb.Append(sql);if (!string.IsNullOrWhiteSpace(orderby)){sb.Append(" ");sb.Append(orderby);}sb.Append(" ) row_limit where rownum <= ");sb.Append(endRow);sb.Append(" ) where rownum_ >");sb.Append(startRow);#endregionbreak;case "mssql":#region 分頁查詢語句commandText = string.Format("select count(*) from ({0}) T", sql);cmd = GetCommand(commandText, connection);pagerModel.totalRows = int.Parse(cmd.ExecuteScalar().ToString());startRow = pageSize * (currentPage - 1) + 1;endRow = startRow + pageSize - 1;sb.Append(string.Format(@"select * from (select ROW_NUMBER() over({1}) as rowNumber, t.* from ({0}) t) tempTablewhere rowNumber between {2} and {3} ", sql, orderby, startRow, endRow));#endregionbreak;case "mysql":#region 分頁查詢語句commandText = string.Format("select count(*) from ({0}) T", sql);cmd = GetCommand(commandText, connection);pagerModel.totalRows = int.Parse(cmd.ExecuteScalar().ToString());startRow = pageSize * (currentPage - 1);sb.Append("select * from (");sb.Append(sql);if (!string.IsNullOrWhiteSpace(orderby)){sb.Append(" ");sb.Append(orderby);}sb.AppendFormat(" ) row_limit limit {0},{1}", startRow, pageSize);#endregionbreak;case "sqlite":#region 分頁查詢語句commandText = string.Format("select count(*) from ({0}) T", sql);cmd = GetCommand(commandText, connection);pagerModel.totalRows = int.Parse(cmd.ExecuteScalar().ToString());startRow = pageSize * (currentPage - 1);sb.Append(sql);if (!string.IsNullOrWhiteSpace(orderby)){sb.Append(" ");sb.Append(orderby);}sb.AppendFormat(" limit {0} offset {1}", pageSize, startRow);#endregionbreak;}List<T> list = FindListBySql<T>(sb.ToString(), cmdParms);pagerModel.result = list;}return pagerModel;}#endregion#region 分頁獲取列表/// <summary>/// 分頁(任意entity,盡量少的字段)/// </summary>public DataSet FindPageBySql(string sql, string orderby, int pageSize, int currentPage, out int totalCount, params DbParameter[] cmdParms){DataSet ds = null;using (DbConnection connection = GetConnection()){connection.Open();IDbCommand cmd = null;StringBuilder sb = new StringBuilder();string commandText = null;int startRow = 0;int endRow = 0;totalCount = 0;switch (m_DBType){case "oracle":#region 分頁查詢語句commandText = string.Format("select count(*) from ({0}) T", sql);cmd = GetCommand(commandText, connection);totalCount = int.Parse(cmd.ExecuteScalar().ToString());startRow = pageSize * (currentPage - 1);endRow = startRow + pageSize;sb.Append("select * from ( select row_limit.*, rownum rownum_ from (");sb.Append(sql);if (!string.IsNullOrWhiteSpace(orderby)){sb.Append(" ");sb.Append(orderby);}sb.Append(" ) row_limit where rownum <= ");sb.Append(endRow);sb.Append(" ) where rownum_ >");sb.Append(startRow);#endregionbreak;case "mssql":#region 分頁查詢語句commandText = string.Format("select count(*) from ({0}) T", sql);cmd = GetCommand(commandText, connection);totalCount = int.Parse(cmd.ExecuteScalar().ToString());startRow = pageSize * (currentPage - 1) + 1;endRow = startRow + pageSize - 1;sb.Append(string.Format(@"select * from (select ROW_NUMBER() over({1}) as rowNumber, t.* from ({0}) t) tempTablewhere rowNumber between {2} and {3} ", sql, orderby, startRow, endRow));#endregionbreak;case "mysql":#region 分頁查詢語句commandText = string.Format("select count(*) from ({0}) T", sql);cmd = GetCommand(commandText, connection);totalCount = int.Parse(cmd.ExecuteScalar().ToString());startRow = pageSize * (currentPage - 1);sb.Append("select * from (");sb.Append(sql);if (!string.IsNullOrWhiteSpace(orderby)){sb.Append(" ");sb.Append(orderby);}sb.AppendFormat(" ) row_limit limit {0},{1}", startRow, pageSize);#endregionbreak;case "sqlite":#region 分頁查詢語句commandText = string.Format("select count(*) from ({0}) T", sql);cmd = GetCommand(commandText, connection);totalCount = int.Parse(cmd.ExecuteScalar().ToString());startRow = pageSize * (currentPage - 1);sb.Append(sql);if (!string.IsNullOrWhiteSpace(orderby)){sb.Append(" ");sb.Append(orderby);}sb.AppendFormat(" limit {0} offset {1}", pageSize, startRow);#endregionbreak;}ds = Query(sql, cmdParms);}return ds;}#endregion#region getReaderValue 轉換數據/// <summary>/// 轉換數據/// </summary>private Object getReaderValue(Object rdValue, Type ptype){if (ptype == typeof(double))return Convert.ToDouble(rdValue);if (ptype == typeof(decimal))return Convert.ToDecimal(rdValue);if (ptype == typeof(int))return Convert.ToInt32(rdValue);if (ptype == typeof(long))return Convert.ToInt64(rdValue);if (ptype == typeof(DateTime))return Convert.ToDateTime(rdValue);if (ptype == typeof(Nullable<double>))return Convert.ToDouble(rdValue);if (ptype == typeof(Nullable<decimal>))return Convert.ToDecimal(rdValue);if (ptype == typeof(Nullable<int>))return Convert.ToInt32(rdValue);if (ptype == typeof(Nullable<long>))return Convert.ToInt64(rdValue);if (ptype == typeof(Nullable<DateTime>))return Convert.ToDateTime(rdValue);return rdValue;}#endregion#region 獲取主鍵名稱/// <summary>/// 獲取主鍵名稱/// </summary>public string GetIdName(Type type){PropertyInfo[] propertyInfoList = GetEntityProperties(type);foreach (PropertyInfo propertyInfo in propertyInfoList){if (propertyInfo.GetCustomAttributes(typeof(IsIdAttribute), false).Length > 0){return propertyInfo.Name;}}return "Id";}#endregion#region 獲取主鍵值/// <summary>/// 獲取主鍵名稱/// </summary>public object GetIdVal(object val){string idName = GetIdName(val.GetType());if (!string.IsNullOrWhiteSpace(idName)){return val.GetType().GetProperty(idName).GetValue(val, null);}return 0;}#endregion#region 獲取實體類屬性/// <summary>/// 獲取實體類屬性/// </summary>private PropertyInfo[] GetEntityProperties(Type type){List<PropertyInfo> result = new List<PropertyInfo>();PropertyInfo[] propertyInfoList = type.GetProperties();foreach (PropertyInfo propertyInfo in propertyInfoList){if (propertyInfo.GetCustomAttributes(typeof(EdmRelationshipNavigationPropertyAttribute), false).Length == 0&& propertyInfo.GetCustomAttributes(typeof(BrowsableAttribute), false).Length == 0){result.Add(propertyInfo);}}return result.ToArray();}#endregion#region 獲取基類/// <summary>/// 獲取基類/// </summary>public Type GetBaseType(Type type){while (type.BaseType != null && type.BaseType.Name != typeof(Object).Name){type = type.BaseType;}return type;}#endregion#endregion#region 事務#region 開始事務/// <summary>/// 開始事務/// </summary>public static void BeginTransaction(){DbConnection conn = GetConnection();if (conn.State != ConnectionState.Open) conn.Open();m_Tran = conn.BeginTransaction();}#endregion#region 提交事務/// <summary>/// 提交事務/// </summary>public static void CommitTransaction(){DbConnection conn = m_Tran.Connection;try{m_Tran.Commit();}catch (Exception ex){m_Tran.Rollback();}finally{if (conn.State == ConnectionState.Open) conn.Close();m_Tran.Dispose();m_Tran = null;}}#endregion#region 回滾事務(出錯時調用該方法回滾)/// <summary>/// 回滾事務(出錯時調用該方法回滾)/// </summary>public static void RollbackTransaction(){DbConnection conn = m_Tran.Connection;m_Tran.Rollback();if (conn.State == ConnectionState.Open) conn.Close();}#endregion#endregion} } View Code

?

如何使用:

? ? 添加:

/// <summary> /// 添加 /// </summary> public void Insert(object obj) {dbHelper.Insert(obj); } View Code

? ? 修改:

/// <summary> /// 修改 /// </summary> public void Update(object obj) {dbHelper.Update(obj); } View Code

? ? 根據ID刪除:

/// <summary> /// 刪除 /// </summary> public void Del(int id) {dbHelper.Delete<BS_Template>(id); } View Code

? ? 根據ID批量刪除:

/// <summary> /// 刪除 /// </summary> public void BatchDelete(string ids) {dbHelper.BatchDelete<BS_Template>(ids); } View Code

? ? 根據條件刪除:

/// <summary> /// 刪除 /// </summary> public void Delete(string conditions) {dbHelper.Delete<BS_Template>(conditions); } View Code

? ? 獲取最大ID(當然,ID一般采用自增,對于并發量極少的系統,或單機系統,為了省事,可以這樣做):

/// <summary> /// GetMaxId /// </summary> public int GetMaxId() {return dbHelper.GetMaxID<BS_Template>("id"); } View Code

? ? 根據條件查詢實體:

public BS_Template Get(string typeCode, Enums.TemplateType templateType) {StringBuilder sql = new StringBuilder(string.Format(@"select *from BS_Template where typeCode='{0}' and type='{1}'", typeCode, (int)templateType));return dbHelper.FindBySql<BS_Template>(sql.ToString()); } public BS_Template Get2(string templateId, Enums.TemplateType templateType) {StringBuilder sql = new StringBuilder(string.Format(@"select *from BS_Template where id='{0}' and type='{1}'", templateId, (int)templateType));return dbHelper.FindBySql<BS_Template>(sql.ToString()); } View Code

? ? 根據ID查詢實體:

public BS_Test Get(string id) {return dbHelper.FindById<BS_Test>(id); } View Code

? ? 查詢列表:

/// <summary> /// 查詢列表 /// </summary> public List<BS_Test> GetList(string name) {StringBuilder sql = new StringBuilder(string.Format(@"select *from BS_Test twhere 1=1 "));if (!string.IsNullOrWhiteSpace(name)){sql.AppendFormat(" and t.name like '%{0}%'", name);}return dbHelper.FindListBySql<BS_Test>(sql.ToString()); } View Code

? ? 分頁查詢列表:

/// <summary> /// 分頁獲取模板集合 /// </summary> public List<BS_Template> GetList(ref PagerModel pager, string noticeType, string coreType, string name, Enums.TemplateType templateType) {StringBuilder sql = new StringBuilder(string.Format(@"select *from BS_Template twhere 1=1 "));if (!string.IsNullOrWhiteSpace(noticeType)){sql.AppendFormat(" and nt.name like '%{0}%'", noticeType);}if (!string.IsNullOrWhiteSpace(coreType)){sql.AppendFormat(" and ct.name like '%{0}%'", coreType);}if (!string.IsNullOrWhiteSpace(name)){sql.AppendFormat(" and t.name like '%{0}%'", name);}sql.AppendFormat(" and t.type = '{0}'", (int)templateType);string orderby = "order by cast(id as int)";pager = dbHelper.FindPageBySql<BS_Template>(sql.ToString(), orderby, pager.rows, pager.page);return pager.result as List<BS_Template>; } View Code

? ? 完整DAL:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using DBUtil; using Models;namespace DAL {/// <summary>/// 模板/// </summary>public class TemplateDal{#region 變量private DBHelper dbHelper = new DBHelper();#endregion#region 分頁獲取模板集合/// <summary>/// 分頁獲取模板集合/// </summary>public List<BS_Template> GetList(ref PagerModel pager, string noticeType, string coreType, string name, Enums.TemplateType templateType){StringBuilder sql = new StringBuilder(string.Format(@"select *from BS_Template twhere 1=1 "));if (!string.IsNullOrWhiteSpace(noticeType)){sql.AppendFormat(" and nt.name like '%{0}%'", noticeType);}if (!string.IsNullOrWhiteSpace(coreType)){sql.AppendFormat(" and ct.name like '%{0}%'", coreType);}if (!string.IsNullOrWhiteSpace(name)){sql.AppendFormat(" and t.name like '%{0}%'", name);}sql.AppendFormat(" and t.type = '{0}'", (int)templateType);string orderby = "order by cast(id as int)";pager = dbHelper.FindPageBySql<BS_Template>(sql.ToString(), orderby, pager.rows, pager.page);return pager.result as List<BS_Template>;}#endregion#region 獲取字段關聯模板集合/// <summary>/// 獲取字段關聯模板集合/// </summary>public List<BS_Template> GetList(string fieldId){StringBuilder sql = new StringBuilder(string.Format(@"select *from BS_Template tleft join BS_TplFieldRelation r on r.templateId=t.idleft join BS_TplField f on f.id=r.fieldId where f.id='{0}'", fieldId));return dbHelper.FindListBySql<BS_Template>(sql.ToString());}#endregion#region 獲取public BS_Template Get(string typeCode, Enums.TemplateType templateType){StringBuilder sql = new StringBuilder(string.Format(@"select *from BS_Template where typeCode='{0}' and type='{1}'", typeCode, (int)templateType));return dbHelper.FindBySql<BS_Template>(sql.ToString());}public BS_Template Get2(string templateId, Enums.TemplateType templateType){StringBuilder sql = new StringBuilder(string.Format(@"select *from BS_Template where id='{0}' and type='{1}'", templateId, (int)templateType));return dbHelper.FindBySql<BS_Template>(sql.ToString());}#endregion#region GetMaxId/// <summary>/// GetMaxId/// </summary>public int GetMaxId(){return dbHelper.GetMaxID<BS_Template>("id");}#endregion#region 添加/// <summary>/// 添加/// </summary>public void Insert(object obj){dbHelper.Insert(obj);}#endregion#region 修改/// <summary>/// 修改/// </summary>public void Update(object obj){dbHelper.Update(obj);}#endregion#region 刪除/// <summary>/// 刪除/// </summary>public void Del(int id){dbHelper.Delete<BS_Template>(id);}/// <summary>/// 刪除/// </summary>public void BatchDelete(string ids){dbHelper.BatchDelete<BS_Template>(ids);}/// <summary>/// 刪除/// </summary>public void Delete(string conditions){dbHelper.Delete<BS_Template>(conditions);}#endregion} } View Code

? ? 查詢sql書寫規范:

? ? SQL不能寫的亂七八糟,該換行換行,該對齊對齊,例:

/// <summary> /// 分頁獲取模板集合 /// </summary> public List<BS_Template> GetList(ref PagerModel pager, string noticeType, string coreType, string name, Enums.TemplateType templateType) {StringBuilder sql = new StringBuilder(string.Format(@"select *from BS_Template twhere 1=1 "));if (!string.IsNullOrWhiteSpace(noticeType)){sql.AppendFormat(" and nt.name like '%{0}%'", noticeType);}if (!string.IsNullOrWhiteSpace(coreType)){sql.AppendFormat(" and ct.name like '%{0}%'", coreType);}if (!string.IsNullOrWhiteSpace(name)){sql.AppendFormat(" and t.name like '%{0}%'", name);}sql.AppendFormat(" and t.type = '{0}'", (int)templateType);string orderby = "order by cast(id as int)";pager = dbHelper.FindPageBySql<BS_Template>(sql.ToString(), orderby, pager.rows, pager.page);return pager.result as List<BS_Template>; } View Code

? ? select換行,from換行,join換行,where換行,and換行。

? ??

? ? 數據庫事務:

try {DBHelper.BeginTransaction();BS_Template model = new BS_Template();model.id = m_TemplateDal.GetMaxId().ToString();model.code = k.ToString("0000");model.name = "測試" + k.ToString();model.remarks = "測試" + k.ToString();model.type = ((int)Enums.TemplateType.Notice).ToString();m_TemplateDal.Insert(model);//throw new Exception("a"); BS_Test test = new BS_Test();test.id = m_TestDal.GetMaxId().ToString();test.code = "測試" + k.ToString();test.name = "測試" + k.ToString();test.remarks = "測試" + k.ToString();m_TestDal.Insert(test);DBHelper.CommitTransaction();MessageBox.Show("成功"); } catch (Exception ex) {DBHelper.RollbackTransaction();MessageBox.Show(ex.Message); } View Code

?

? ? 代碼下載:http://files.cnblogs.com/files/s0611163/DBHelperDemo.zip

? ? Model生成器下載:http://files.cnblogs.com/files/s0611163/Model%E7%94%9F%E6%88%90%E5%99%A8.zip

?

轉載于:https://www.cnblogs.com/s0611163/p/5858456.html

總結

以上是生活随笔為你收集整理的轻量级ORM的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

日日干天夜夜 | av中文电影 | 极品久久久久久久 | 国产精品 视频 | 久久精品久久久久 | 欧美国产不卡 | 国产美女免费看 | 欧美久久久 | 九九综合九九 | 免费亚洲黄色 | 久久久国产精品亚洲一区 | 日韩一区二区三免费高清在线观看 | 91高清视频| 国产无套精品久久久久久 | 黄色精品免费 | 国产主播99 | 香蕉视频网址 | 在线天堂中文在线资源网 | 国语精品久久 | 欧美久久久久久久久久 | 婷婷视频在线 | 毛片网站免费 | 亚洲理论片在线观看 | 91热视频在线观看 | 精品久久久久久一区二区里番 | www.超碰97.com | 成人毛片在线观看视频 | 成人综合日日夜夜 | 精品免费观看视频 | 国产午夜精品一区二区三区嫩草 | 麻豆国产视频下载 | 91chinesexxx | 91视视频在线直接观看在线看网页在线看 | 91精品国产自产老师啪 | 成人午夜电影网站 | 久久综合久久88 | 亚洲成av人影院 | 亚洲国产精品日韩 | 日本字幕网 | 亚洲dvd| 中文永久字幕 | 久久精品爱视频 | 91麻豆免费看 | 日韩欧美在线综合网 | 午夜精品视频在线 | www日韩欧美| 国产午夜麻豆影院在线观看 | av综合av | 黄色av影院 | 激情五月av | 国产一区二区免费 | 欧美在线观看视频一区二区 | 欧美精品乱码久久久久久 | 欧美久草视频 | 免费在线中文字幕 | 一二三区高清 | 丝袜美腿av | a在线观看国产 | 日韩大片在线看 | 中文字幕av最新更新 | 国产欧美日韩精品一区二区免费 | 美女在线黄| 天天爽网站 | 亚洲欧美一区二区三区孕妇写真 | 国产黄色精品视频 | 在线成人欧美 | 国产91在线播放 | 中文字幕中文字幕在线中文字幕三区 | 久草在线网址 | 992tv成人免费看片 | 91免费高清| 97精品国产97久久久久久粉红 | 亚洲成av人影片在线观看 | 亚洲精品高清在线观看 | 天天色视频 | 久久久精品 一区二区三区 国产99视频在线观看 | 久久精品免费观看 | 欧美精品乱码久久久久久按摩 | 黄色av高清 | 久久看片网 | 国产精品久久久久三级 | 免费看一级一片 | 色干干| 亚洲精品久久久久58 | 亚洲在线精品 | 日韩中文在线播放 | 九九久久婷婷 | 在线黄网站 | 69久久99精品久久久久婷婷 | 久久精品视频免费 | 六月婷婷久香在线视频 | 成人国产电影在线观看 | 成年人黄色免费看 | 精品一区二区三区久久久 | 不卡中文字幕av | 国产亚洲精品久久久久久电影 | 亚洲精品高清一区二区三区四区 | 波多野结衣精品 | 欧美精品久久久久久久久久丰满 | 久久女同性恋中文字幕 | 久久免费视频一区 | 日韩一区正在播放 | 亚洲精品日韩在线观看 | 国产专区一 | 亚洲六月丁香色婷婷综合久久 | 日韩一区二区三区高清在线观看 | 国产成人a亚洲精品v | 日日干激情五月 | 西西444www大胆高清图片 | 久久久国产影视 | 夜夜躁狠狠躁日日躁视频黑人 | 欧美成天堂网地址 | 欧美激情精品久久久久久变态 | 国产精品久久久久久99 | 美女很黄免费网站 | 国产精品白丝jk白祙 | 亚洲欧洲精品一区二区精品久久久 | 干干日日 | 日韩精品一区电影 | 99久久精品国产亚洲 | 91在线小视频 | 亚洲涩涩一区 | 区一区二区三区中文字幕 | 丁香高清视频在线看看 | 国产精品va在线 | 欧美性猛片 | 国产精品免费久久久久 | 欧美在线free | 很黄很黄的网站免费的 | 久久久综合香蕉尹人综合网 | 黄色片毛片 | 在线一二三四区 | 亚洲一级免费电影 | 欧美日韩二区在线 | 国产中文字幕三区 | 91黄色小视频 | 欧美大片在线看免费观看 | 四虎视频 | 午夜私人影院久久久久 | 亚洲日日夜夜 | 久久久在线观看 | www.69xx| 精品国产乱码久久久久久天美 | 久久成人一区二区 | 久久高视频| 午夜123 | 最新中文字幕在线播放 | 国产成人亚洲在线观看 | 丁香国产视频 | 四虎成人精品 | 天天爽夜夜爽人人爽曰av | 日韩视频1区 | 国产视频一区在线免费观看 | 天天天插 | 91精品在线免费观看视频 | 欧美巨乳网 | 成人毛片网 | 天天色天天爱天天射综合 | 国产97超碰| 国产理论片在线观看 | 欧美久久99 | 国产一性一爱一乱一交 | 麻豆一区二区三区视频 | 精品久久久成人 | 973理论片235影院9 | 精品欧美一区二区精品久久 | 黄色网址国产 | 久久久久久久久久久久久9999 | 热精品| 日韩av中文字幕在线免费观看 | 国产精品第三页 | 天天天插| 亚洲欧洲精品一区二区精品久久久 | 国产一区国产精品 | 精品国产成人在线影院 | 中文字幕中文字幕 | 91av手机在线 | 天天综合五月天 | 玖玖玖在线 | 久久调教视频 | 成人免费网站在线观看 | 国内成人精品2018免费看 | 午夜久久久久久久久 | 精久久久久 | 欧美a级片免费看 | 亚洲波多野结衣 | 免费污片 | 久久艹国产 | 日日夜夜精品视频天天综合网 | 成 人 黄 色 视频 免费观看 | 久久综合偷偷噜噜噜色 | 久久国产视频网站 | 婷婷精品国产欧美精品亚洲人人爽 | 色婷婷亚洲精品 | 日本91在线| 色射爱 | 亚洲1区 在线| 中国一区二区视频 | 国产成人三级一区二区在线观看一 | 韩国精品福利一区二区三区 | 国产精品久久久久免费观看 | 国产精品18久久久久久首页狼 | 色成人亚洲 | 日韩一级精品 | 亚洲一区精品二人人爽久久 | 久久精品电影网 | 久久国产精品第一页 | 亚洲精品国产精品久久99热 | 99热99热 | 亚洲成人免费 | 精品国产乱码久久久久久1区二区 | 婷婷亚洲五月 | 国产精品福利av | 欧美日韩国产综合一区二区 | 日本视频精品 | 欧美精品小视频 | 日韩视频中文字幕在线观看 | 国产中文欧美日韩在线 | 黄色亚洲大片免费在线观看 | 久久夜色电影 | 97高清视频 | 手机在线观看国产精品 | 国产午夜精品久久 | 亚洲午夜精品一区二区三区电影院 | 国产精品视频免费观看 | 久久精品日韩 | 欧美综合色| 欧美日韩久久一区 | 97视频久久久| 欧美午夜性 | 91成人精品视频 | 日韩亚洲国产精品 | 久久呀 | 国偷自产中文字幕亚洲手机在线 | 久久午夜精品影院一区 | 美国人与动物xxxx | 免费看搞黄视频网站 | 日韩一级片观看 | 色橹橹欧美在线观看视频高清 | 日韩一区二区免费播放 | 久久只有精品 | 伊人影院在线观看 | 久久观看最新视频 | 久久综合久色欧美综合狠狠 | 欧美一区二区精品在线 | 91av在线不卡 | 日本精品一二区 | 成人a大片 | 国产一区二区日本 | 久操免费视频 | 亚洲美女视频网 | 久久九九免费视频 | 中文字幕999 | 久久av一区二区三区亚洲 | 国产高清视频免费观看 | 久久视频精品在线观看 | 66av99精品福利视频在线 | 精品视频免费观看 | 午夜精品av在线 | 91在线中字 | 精品免费在线视频 | 国产资源站 | 中文字幕首页 | 国产真实在线 | 国产精品久久久久av免费 | 97在线看片| 国产一级免费电影 | 免费久草视频 | 成人在线视频免费看 | 天天干,天天操 | 午夜影院一级片 | 日韩中文字幕免费视频 | 国产亚洲精品xxoo | 最近2019中文免费高清视频观看www99 | 亚洲男男gⅴgay双龙 | 97网在线观看 | 在线欧美最极品的av | 日韩高清不卡一区二区三区 | 成人黄色电影免费观看 | 中文字幕制服丝袜av久久 | 日日夜夜天天人人 | 国产无遮挡猛进猛出免费软件 | 99精品视频播放 | 91av免费观看 | 豆豆色资源网xfplay | 国产精品免费成人 | 成人午夜电影免费在线观看 | 国产小视频在线看 | 亚洲精品国产精品国自产在线 | 久艹在线观看视频 | 99精品国产亚洲 | 一区二区三区视频在线 | 久久综合导航 | 97日日碰人人模人人澡分享吧 | 一区二区三高清 | 亚洲国产精品日韩 | av青草 | 亚洲综合在线五月天 | 亚洲一片黄 | 成人性生爱a∨ | 香蕉视频免费在线播放 | 日韩特级片 | 欧美激情视频在线免费观看 | 日韩欧美国产免费播放 | 日日干夜夜草 | 久久96国产精品久久99软件 | 蜜臀一区二区三区精品免费视频 | 午夜 在线 | 国产又粗又猛又黄又爽视频 | 中文字幕在线观看你懂的 | 精品国产一区在线观看 | 久久草草热国产精品直播 | 玖玖玖在线| 成人免费共享视频 | 在线看av的网址 | 91在线九色 | 亚洲色图27p | 日韩高清片| 日本精品午夜 | 黄色在线免费观看网址 | 久久视频国产 | 97精品国产97久久久久久免费 | 久久精品视频在线看 | 亚洲国产高清在线观看视频 | 亚洲精品乱码白浆高清久久久久久 | 99视频久久 | 免费69视频 | 亚洲aaa毛片 | 国产成人一级 | 精品国产一区二区三区久久久蜜月 | 在线v片免费观看视频 | 久久国产精品一区二区 | 亚洲传媒在线 | 六月丁香婷 | 香蕉视频色 | 成年人黄色大全 | 国产精品6999成人免费视频 | av高清免费在线 | 亚洲国产三级 | 免费97视频 | 69久久久久久久 | 91丨九色丨国产丨porny精品 | 国产精品毛片久久久久久久久久99999999 | 国产精品久久久毛片 | 天天亚洲 | 最新真实国产在线视频 | 国产高清在线免费观看 | 久久久国产一区二区三区四区小说 | 成人av在线资源 | 成x99人av在线www | 国产区第一页 | a级一a一级在线观看 | av在线h | 91视频观看免费 | 亚洲精品91天天久久人人 | 区一区二区三在线观看 | 超级碰碰碰视频 | 免费在线观看不卡av | 久久久久成人精品 | 婷婷六月丁香激情 | 欧美一级片在线 | 综合天天色 | 视频在线观看99 | 欧美激情第28页 | 亚洲欧洲国产精品 | 91麻豆精品国产91久久久久久 | www.久久久 | 懂色av一区二区三区蜜臀 | 四虎永久免费网站 | 欧美一级性生活视频 | 国产一卡久久电影永久 | 99r精品视频在线观看 | 日本久久成人中文字幕电影 | 久射网| 992tv人人草 黄色国产区 | 日韩在线免费播放 | 午夜免费久久看 | 成年人国产视频 | 免费看黄色91 | 欧美日韩在线观看不卡 | 久久精品永久免费 | 在线观看中文 | 九色视频网址 | 97精品国产 | 五月天网站在线 | 91系列在线观看 | 日韩精品一区在线播放 | 开心色停停 | 超级碰碰碰视频 | 欧洲精品视频一区 | 狠狠色狠狠色综合日日小说 | 二区三区精品 | 亚洲最快最全在线视频 | 日韩影视精品 | 国产激情久久久 | 亚洲欧美日韩国产 | 国产免费三级在线观看 | 中文字幕在线观看1 | 韩国av免费在线观看 | 日韩精品欧美专区 | av在线免费播放 | 精品国产亚洲在线 | 国产高清久久 | 欧美精品黑人性xxxx | 在线成人免费 | 97夜夜澡人人爽人人免费 | 久久不卡av | 91经典在线 | 一区二区三区在线影院 | 午夜精品一区二区三区视频免费看 | 免费视频国产 | 91黄色小网站 | 香蕉视频一级 | 在线免费av网站 | 亚洲综合激情五月 | av免费在线网 | 日韩电影在线视频 | 国产成人精品一区二区三区在线观看 | 天天干天天拍天天操天天拍 | av在线观 | 久久综合爱 | 日b视频在线观看网址 | 亚洲美女精品视频 | 国产99久久99热这里精品5 | 国产精品免费一区二区 | 亚洲第一av在线播放 | 欧美一级久久久久 | 国产精品自产拍在线观看网站 | 综合久久五月天 | 亚洲综合色av | 中文字幕在线观看完整版电影 | 中文永久字幕 | 欧美精品视 | 欧美日韩视频网站 | 欧美激情精品久久久 | av不卡中文字幕 | 伊人天堂网 | 中文字幕视频在线播放 | 色婷婷狠狠干 | 国产xxxx性hd极品| av电影不卡在线 | 91在线视频 | 97成人在线视频 | 欧美 激情在线 | 在线电影a | 国产字幕av | 欧美一区二区三区在线观看 | 一区 在线 影院 | 91九色蝌蚪国产 | 免费黄色小网站 | 日韩精选在线 | 日韩久久午夜一级啪啪 | 色在线中文字幕 | 国产一级片免费观看 | 中文字幕在线播放一区 | 福利区在线观看 | 婷婷九月激情 | 国内精品久久久久久久影视简单 | 日韩av片免费在线观看 | 色婷婷影视 | av资源免费观看 | 久久久久久久久久影院 | av一级免费| 久久激情片 | 中文字幕一区二区三区乱码在线 | 久久久亚洲影院 | 91在线www| 91精品久久久久久久久 | 国产亚州精品视频 | 久久久www成人免费毛片麻豆 | 精品99免费 | 久久久国产精品一区二区中文 | 亚洲做受高潮欧美裸体 | 国产又粗又猛又色 | 久插视频 | 精品v亚洲v欧美v高清v | 久久免费精品国产 | 成人国产精品久久久 | 99视频免费看 | 久久亚洲美女 | 热久久视久久精品18亚洲精品 | 成年人天堂com | 亚洲三级在线免费观看 | 亚洲黄色免费观看 | 丁香视频免费观看 | 国产视频精品免费播放 | 国产精品第二十页 | 久久精彩视频 | 色综合久久88色综合天天免费 | 国产福利一区二区三区在线观看 | 久久艹久久 | 中文字幕一区二区三区久久蜜桃 | 婷婷丁香五 | 成人在线播放视频 | 开心综合网 | 欧美日韩高清 | 狠狠伊人 | 最新极品jizzhd欧美 | 日韩色视频在线观看 | 91av大全 | 亚洲三级网 | 久久精品影视 | 中文字幕在线一区观看 | 91在线你懂的| 久草在线一免费新视频 | 国产精品二区三区 | 久久综合色综合88 | 欧美-第1页-屁屁影院 | 狠狠久久| 久操视频在线观看 | 国产精品女人网站 | 精品一区二区电影 | 午夜在线看 | 亚洲电影久久 | 欧美日韩国产色综合一二三四 | 在线99视频 | 手机在线日韩视频 | 亚洲黄色网络 | 婷婷丁香色综合狠狠色 | 91网在线看 | 欧美激情综合色综合啪啪五月 | 精品国内自产拍在线观看视频 | 手机看片99 | 天天干 夜夜操 | 天天激情天天干 | 国产一级片免费播放 | 日日躁夜夜躁aaaaxxxx | 欧美在线观看小视频 | www.黄色片网站 | 天天操夜夜看 | 久久私人影院 | 激情综合色图 | 久久av免费电影 | 在线免费观看av网站 | 美女精品久久久 | 亚洲精品国产精品久久99热 | 午夜精品一区二区三区免费视频 | 久久在视频 | 日本老少交| 日韩黄色在线观看 | 九九视频免费在线观看 | 久久 一区 | 日韩av资源在线观看 | 韩国av免费在线 | 亚洲精品免费在线视频 | 一区二区三区在线观看免费视频 | 欧美日韩1区2区 | 国产美女视频网站 | 日本爱爱片 | 国产高清视频免费在线观看 | 九九视频在线 | 久久久免费 | 日日操网 | 免费在线观看av网站 | 97香蕉久久国产在线观看 | 色婷婷五| 日韩在线精品一区 | 久久999精品 | 国产精品久久久久久999 | 91成人精品国产刺激国语对白 | 久久曰视频 | 丁香综合网 | 国产香蕉久久精品综合网 | 欧美-第1页-屁屁影院 | 久久久久久久综合色一本 | 波多野结衣亚洲一区二区 | 亚洲精品视频大全 | 深夜视频久久 | 成人亚洲欧美 | 人人插人人射 | 中文av网| 国内精品久久久久久久影视麻豆 | 精品久久免费看 | 中文字幕中文字幕中文字幕 | 中文av在线免费观看 | 97视频免费观看2区 亚洲视屏 | 超碰在线日韩 | 一区二区三区在线免费观看 | 精壮的侍卫呻吟h | 成人在线免费观看网站 | 免费观看一区 | 欧美亚洲精品一区 | 干天天 | 右手影院亚洲欧美 | 久久久久国产一区二区三区 | 欧美久久久久久久久久久久久 | 欧美日韩国产二区三区 | 久久久国产精品成人免费 | 午夜婷婷在线播放 | 婷婷丁香自拍 | 久草com| 国产成人一二片 | 91免费视频网站在线观看 | 亚洲精品综合在线观看 | 美女视频黄网站 | 97国产精品一区二区 | 91成人亚洲 | www在线免费观看 | 肉色欧美久久久久久久免费看 | 国产美女黄网站免费 | 在线成人观看 | 国产精品永久免费在线 | 免费成人黄色 | 久久人网| 国产在线播放一区 | 在线观看视频你懂得 | 91正在播放| 国内精品久久久久久久97牛牛 | 国产亚洲片 | 三级黄色网址 | 精品久久一区二区三区 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 免费在线观看视频a | 日本中文字幕网站 | 在线视频日韩欧美 | 免费的国产精品 | 日本中文字幕久久 | 69视频网站 | 亚洲片在线 | 成人免费在线看片 | 亚洲激情在线视频 | 久久精品九色 | 久久人人爽人人片 | 亚洲精品在线国产 | 麻豆精品视频在线 | 特级毛片在线免费观看 | 中文字幕在线观看网址 | 国产成人精品电影久久久 | 久久久久久久久久免费视频 | 欧美亚洲精品在线观看 | 亚洲综合射 | 四虎最新入口 | 亚洲欧洲一区二区在线观看 | 啪啪资源 | 在线观看免费观看在线91 | 五月天综合网站 | 久久激情五月丁香伊人 | www黄色av| 91精品久久久久久综合乱菊 | 亚洲国产成人精品久久 | 伊人五月天婷婷 | 国产高清在线免费观看 | 欧美有色 | 成年人在线观看网站 | 日韩午夜电影院 | 人人干人人艹 | 久久久精品国产一区二区 | 久久久久久久久久电影 | 亚洲一级黄色大片 | 7777xxxx| 国内成人综合 | 欧女人精69xxxxxx | 亚洲高清免费在线 | 一区二区视频电影在线观看 | 久久天堂精品视频 | 免费日韩 精品中文字幕视频在线 | 国产高清第一页 | 欧美成年人在线视频 | 91久久精品一区二区三区 | 黄色大片日本 | 欧美精品乱码久久久久 | 丝袜美腿亚洲 | 精品一区 精品二区 | 99久视频| 亚洲jizzjizz日本少妇 | 午夜视频在线观看一区二区三区 | 成人aⅴ视频 | 免费黄色网址大全 | 日韩理论在线观看 | 一二三精品视频 | 久草视频2 | 丁香花中文字幕 | 色婷婷国产精品 | 欧美日韩免费观看一区=区三区 | 国产黄色在线网站 | 最近中文字幕mv | 欧美性视频网站 | 久久久久亚洲精品成人网小说 | a视频在线 | 国产成人61精品免费看片 | 99精品一区 | 四虎永久网站 | 特黄色大片 | 亚洲视频在线视频 | 欧美一区二区三区免费看 | 国产日韩精品一区二区在线观看播放 | 伊人五月婷 | 蜜桃麻豆www久久囤产精品 | 97人人模人人爽人人少妇 | 96精品视频 | 天天激情站| 福利视频一区二区 | 四虎在线免费视频 | 91成人在线看 | 97超碰人人澡人人爱学生 | 欧美精品乱码久久久久久 | 欧美午夜一区二区福利视频 | 五月天亚洲婷婷 | 91豆麻精品91久久久久久 | 久久亚洲美女 | 国产精品成人国产乱一区 | 亚洲波多野结衣 | 午夜国产一区二区三区四区 | 亚洲国产精品日韩 | 国内精品久久久久久久影视麻豆 | 99九九热只有国产精品 | 久久男人免费视频 | 激情综合五月天 | 亚色视频在线观看 | 欧美精品久久久久久久久久丰满 | 国产亚洲激情视频在线 | 欧美一区影院 | 精品视频免费久久久看 | 日本中文一级片 | 在线观看成人av | 波多野结衣在线播放一区 | 免费看的黄色小视频 | 色天天中文 | 国产一级精品绿帽视频 | 久久五月情影视 | av电影在线不卡 | 九草在线观看 | 麻豆视频在线看 | 精品9999 | 视频国产一区二区三区 | 国产福利一区二区在线 | 狠狠色狠狠色综合日日小说 | av福利资源 | 草久在线播放 | 久久影视中文字幕 | 免费在线观看毛片网站 | 免费看的黄网站 | 久久久亚洲精品 | 国产69久久久欧美一级 | 91av综合| 91av99| 亚洲精品视频在线观看网站 | 午夜91在线| 天堂视频中文在线 | av片子在线观看 | 日韩免费播放 | 96国产精品视频 | 国产精品一区二区久久 | 国产精品九九九九九九 | 久久九九免费视频 | 五月激情五月激情 | 成人黄色片在线播放 | 久久超碰99 | 17videosex性欧美| 在线观看中文 | 一区二区三区国产精品 | 黄色毛片一级片 | 91精品视频在线观看免费 | 国产精选在线观看 | 久久亚洲欧美日韩精品专区 | 天天做天天射 | 激情五月婷婷激情 | 天天·日日日干 | 欧美不卡视频在线 | 午夜av剧场| 久久国产精品视频免费看 | 91丨九色丨国产女 | 夜夜操天天干, | 亚洲精品免费在线视频 | 日韩视频一二三区 | 国产 一区二区三区 在线 | 天天爱天天舔 | 天天草天天色 | 久久视频这里有精品 | 国产美女在线免费观看 | 中文字幕日韩一区二区三区不卡 | 成人三级视频 | 国产网红在线观看 | 91成人在线视频 | 国产亚洲综合性久久久影院 | 91久久精品日日躁夜夜躁国产 | 久久久久国产成人免费精品免费 | 亚洲精品国产精品国自产观看浪潮 | 四虎在线永久免费观看 | 国产成人精品久久二区二区 | 国产成人99久久亚洲综合精品 | 天天操天天操天天操天天操天天操 | 日韩欧美国产精品 | 色吊丝在线永久观看最新版本 | 日韩在线观看中文字幕 | 婷婷视频在线播放 | 国产美女精品人人做人人爽 | 国产精品视频免费看 | 黄网站www| 亚州精品一二三区 | 在线免费观看亚洲视频 | 91久久在线观看 | 国产1区2| 久久国产成人午夜av影院宅 | 美女视频黄是免费的 | 黄色三级久久 | 久草在线观看 | 日本中文字幕在线免费观看 | av不卡中文字幕 | 99re视频在线观看 | 国产精品久久久一区二区 | 久久久久久草 | 成人中文字幕+乱码+中文字幕 | 一级欧美日韩 | 国产九九九视频 | 麻豆视频在线 | 日本中文字幕网站 | 91一区啪爱嗯打偷拍欧美 | 超碰免费观看 | 日韩视频一区二区 | 91看片在线播放 | 欧美日韩视频在线观看免费 | 精品国产免费久久 | 日日夜夜综合 | 日韩免费三区 | aaaaaa毛片 | 久久精品99久久 | 国产理论一区二区三区 | 日韩欧美国产精品 | 久久躁日日躁aaaaxxxx | 久久国产色 | 五月天天天操 | 在线观看黄色的网站 | 免费精品人在线二线三线 | 91大神免费在线观看 | 日本一区二区免费在线观看 | 欧美精品三级在线观看 | 国产精品成久久久久三级 | 日日天天av | www国产亚洲精品久久麻豆 | 精品综合久久 | 中文字幕丝袜制服 | 日韩免费观看一区二区三区 | 国产日本亚洲 | 四虎国产精品成人免费影视 | 91热| 最近的中文字幕大全免费版 | 99久久精品网| 国产手机在线播放 | 欧美日本啪啪无遮挡网站 | 欧美精品久久久久久久亚洲调教 | 日韩字幕在线观看 | 国产一级片免费视频 | 最新日本中文字幕 | 天天操偷偷干 | 精品日本视频 | 久久午夜鲁丝片 | 最近中文字幕免费av | 91精品对白一区国产伦 | 国产精品人成电影在线观看 | 99中文在线 | www.xxxx变态.com | 在线久草视频 | 在线有码中文字幕 | 午夜影院一级 | 亚洲综合日韩在线 | 91超级碰| www.福利| 天天av在线播放 | 色吊丝av中文字幕 | 天天干夜夜爱 | 成人av.com| 91伊人久久大香线蕉蜜芽人口 | 日韩在线国产精品 | 午夜久久久久久久久 | 在线视频a | 成人免费看电影 | 国产成人精品综合 | 久久视| 久久国产手机看片 | 精品一区精品二区高清 | 中文字幕在线观看视频一区 | 99热超碰 | 久久综合爱 | 婷婷久久一区 | 亚洲激情在线播放 | 手机看国产毛片 | 亚洲黄色在线观看 | 免费av一级电影 | 亚洲精品小区久久久久久 | 国产精品一区在线观看你懂的 | 婷婷激情在线 | 久久精品国产亚洲aⅴ | 亚洲欧美成人 | 99国产精品一区 | 亚洲一区欧美激情 | 成人h在线 | av青草| 丁香六月天 | 蜜臀久久99精品久久久无需会员 | 色中射| 国产精品mm | 伊人伊成久久人综合网小说 | 久久在线视频在线 | 日本高清久久久 | 国产精品99在线播放 | 天天色天天操天天爽 | 国产亚洲在线 | 成年人在线 | 日韩视频专区 | 亚洲成a人片在线观看网站口工 | 午夜国产福利在线 | 久久美女高清视频 | 91麻豆精品国产91久久久久久久久 | 91精品久久久久久综合五月天 | 成人污视频在线观看 | 欧美精品少妇xxxxx喷水 | 免费视频成人 | 狠狠狠色狠狠色综合 | 丰满少妇久久久 | 国产96在线 | 久久,天天综合 | 在线岛国av| 中文字幕丝袜一区二区 | 在线观看激情av | 国产精品理论片在线播放 | 亚洲欧洲精品一区二区 | 四虎成人精品 | 免费男女羞羞的视频网站中文字幕 | 日韩视频1 | 久久精品视频18 | 久久久影院一区二区三区 | 91视频在线观看免费 | 嫩草av在线| 香蕉视频在线观看免费 | 高清av在线免费观看 | 国产成人在线精品 | 91看片在线播放 | 丁香花中文在线免费观看 | 中文字幕av在线 | 中文字幕人成乱码在线观看 | 久草在线视频中文 | 久草视频视频在线播放 | 91精品国产麻豆国产自产影视 | 91完整版观看 | 亚洲一级黄色av | 国产我不卡 | 久草免费手机视频 | 国产精品久久一区二区无卡 | av亚洲产国偷v产偷v自拍小说 | 最近中文字幕视频完整版 | 麻豆精品在线视频 | 亚洲女人av | 网站免费黄色 | 欧美伊人网 | www四虎影院 | 成人免费共享视频 | 亚洲综合精品视频 | 日韩网站一区 | 色噜噜日韩精品一区二区三区视频 | 欧美91精品久久久久国产性生爱 | 久久人人爽人人爽 | 亚洲国产一区二区精品专区 | 在线免费黄色av | 国产色在线,com | 欧美日韩在线第一页 | 精品在线亚洲视频 | 五月激情六月丁香 | 中文字幕精 | 国内精品亚洲 | 欧美在线观看视频一区二区三区 | 日韩高清一二区 | 久久精品一二三区白丝高潮 | 欧美精品三级在线观看 | 激情五月婷婷综合 | www国产一区 | 久久女同性恋中文字幕 | 色噜噜日韩精品欧美一区二区 | 胖bbbb搡bbbb擦bbbb | 五月天网页 | 免费黄色av片| 国产精品12345 | 99久久精品日本一区二区免费 | 91网址在线| 又黄又爽又色无遮挡免费 | 制服丝袜在线91 | 国产精品免费久久久 | 免费看污黄网站 | 亚洲日本欧美在线 | 天天艹天天 | 国产尤物在线视频 | 毛片网在线播放 | 日日操日日插 | 亚洲老妇xxxxxx | 久久精品国产亚洲精品 | 日韩视频区 | 亚洲春色综合另类校园电影 | 97色免费视频 | 91九色蝌蚪在线 | 免费看黄20分钟 | 在线激情小视频 | 精品美女在线观看 | 日韩黄色一级电影 | 婷婷六月综合网 | 免费av观看网站 | 日韩精品免费一线在线观看 | 一区二区三区四区精品视频 | 精品伊人久久久 |