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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Mybatis源码阅读(五 ):接口层——SqlSession

發布時間:2025/3/11 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mybatis源码阅读(五 ):接口层——SqlSession 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

*************************************優雅的分割線 **********************************

分享一波:程序員賺外快-必看的巔峰干貨

如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程

請關注微信公眾號:HB荷包

一個能讓你學習技術和賺錢方法的公眾號,持續更新
*************************************優雅的分割線 **********************************
SimpleExecutor
SqlSession

SqlSession是Mybatis的核心接口之一,對外提供常用的數據庫操作api。mybatis提供了兩個SqlSession的實現,其中最常用的是DefaultSqlSession。

SqlSession的代碼如下

/**

  • 接口層,也是開發人員使用mybatis去操作sql所使用的主要的接口

  • @author Clinton Begin
    */
    public interface SqlSession extends Closeable {

    /**

    • 查詢sql單條數據
    • @param 返回的數據類型
    • @param statement sql
    • @return Mapped object
      */
      T selectOne(String statement);

    /**

    • 指定sql并傳入實參去查單條數據
    • @param 返回的數據類型
    • @param statement 預編譯的帶有?的sql
    • @param parameter 用戶傳入的實參,與前面sql綁定
    • @return Mapped object
      */
      T selectOne(String statement, Object parameter);

    /**

    • 執行sql查詢多條數據
    • @param 返回的數據類型
    • @param statement sql
    • @return List of mapped object
      */
      List selectList(String statement);

    /**

    • 指定sql并傳入實參去查多條數據
    • @param 返回的數據類型
    • @param statement 預編譯的帶有問號的sql
    • @param parameter 用戶傳入的實參,與前面的sql綁定
    • @return List of mapped object
      */
      List selectList(String statement, Object parameter);

    /**

    • 使用預編譯的sql,指定傳入的實參以及結果集范圍
    • 查詢指定范圍的所有數據
    • @param 返回的數據類型
    • @param statement 預編譯的帶有問號的sql
    • @param parameter 用戶傳入的實參,與前面的sql綁定
    • @param rowBounds 指定查詢范圍
    • @return List of mapped object
      */
      List selectList(String statement, Object parameter, RowBounds rowBounds);

    /**

    • 執行sql,返回map對象
    • @param the returned Map keys type
    • @param the returned Map values type
    • @param statement Unique identifier matching the statement to use.
    • @param mapKey The property to use as key for each value in the list.
    • @return Map containing key pair data.
      */
      <K, V> Map<K, V> selectMap(String statement, String mapKey);

    /**

    • 指定sql和實參,返回map
    • @param the returned Map keys type
    • @param the returned Map values type
    • @param statement Unique identifier matching the statement to use.
    • @param parameter A parameter object to pass to the statement.
    • @param mapKey The property to use as key for each value in the list.
    • @return Map containing key pair data.
      */
      <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey);

    /**

    • 指定sql、實參、范圍,返回map
    • @param the returned Map keys type
    • @param the returned Map values type
    • @param statement Unique identifier matching the statement to use.
    • @param parameter A parameter object to pass to the statement.
    • @param mapKey The property to use as key for each value in the list.
    • @param rowBounds Bounds to limit object retrieval
    • @return Map containing key pair data.
      */
      <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds);

    /**

    • A Cursor offers the same results as a List, except it fetches data lazily using an Iterator.
    • @param the returned cursor element type.
    • @param statement Unique identifier matching the statement to use.
    • @return Cursor of mapped objects
      */
      Cursor selectCursor(String statement);

    /**

    • A Cursor offers the same results as a List, except it fetches data lazily using an Iterator.
    • @param the returned cursor element type.
    • @param statement Unique identifier matching the statement to use.
    • @param parameter A parameter object to pass to the statement.
    • @return Cursor of mapped objects
      */
      Cursor selectCursor(String statement, Object parameter);

    /**

    • A Cursor offers the same results as a List, except it fetches data lazily using an Iterator.
    • @param the returned cursor element type.
    • @param statement Unique identifier matching the statement to use.
    • @param parameter A parameter object to pass to the statement.
    • @param rowBounds Bounds to limit object retrieval
    • @return Cursor of mapped objects
      */
      Cursor selectCursor(String statement, Object parameter, RowBounds rowBounds);

    /**

    • 將查詢結果通過此處的ResultHandler對象封裝成對應的對象
    • @param statement Unique identifier matching the statement to use.
    • @param parameter A parameter object to pass to the statement.
    • @param handler ResultHandler that will handle each retrieved row
      */
      void select(String statement, Object parameter, ResultHandler handler);

    /**

    • Retrieve a single row mapped from the statement
    • using a {@code ResultHandler}.
    • @param statement Unique identifier matching the statement to use.
    • @param handler ResultHandler that will handle each retrieved row
      */
      void select(String statement, ResultHandler handler);

    /**

    • Retrieve a single row mapped from the statement key and parameter
    • using a {@code ResultHandler} and {@code RowBounds}.
    • @param statement Unique identifier matching the statement to use.
    • @param rowBounds RowBound instance to limit the query results
    • @param handler ResultHandler that will handle each retrieved row
      */
      void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler);

    /**

    • 執行insert
    • @param statement Unique identifier matching the statement to execute.
    • @return int The number of rows affected by the insert.
      */
      int insert(String statement);

    /**

    • Execute an insert statement with the given parameter object. Any generated
    • autoincrement values or selectKey entries will modify the given parameter
    • object properties. Only the number of rows affected will be returned.
    • @param statement Unique identifier matching the statement to execute.
    • @param parameter A parameter object to pass to the statement.
    • @return int The number of rows affected by the insert.
      */
      int insert(String statement, Object parameter);

    /**

    • 執行update
    • @param statement Unique identifier matching the statement to execute.
    • @return int The number of rows affected by the update.
      */
      int update(String statement);

    /**

    • Execute an update statement. The number of rows affected will be returned.
    • @param statement Unique identifier matching the statement to execute.
    • @param parameter A parameter object to pass to the statement.
    • @return int The number of rows affected by the update.
      */
      int update(String statement, Object parameter);

    /**

    • 執行delete
    • @param statement Unique identifier matching the statement to execute.
    • @return int The number of rows affected by the delete.
      */
      int delete(String statement);

    /**

    • Execute a delete statement. The number of rows affected will be returned.
    • @param statement Unique identifier matching the statement to execute.
    • @param parameter A parameter object to pass to the statement.
    • @return int The number of rows affected by the delete.
      */
      int delete(String statement, Object parameter);

    /**

    • 提交事務
      */
      void commit();

    /**

    • Flushes batch statements and commits database connection.
    • @param force forces connection commit
      */
      void commit(boolean force);

    /**

    • 回滾事務
      */
      void rollback();

    /**

    • Discards pending batch statements and rolls database connection back.
    • Note that database connection will not be rolled back if no updates/deletes/inserts were called.
    • @param force forces connection rollback
      */
      void rollback(boolean force);

    /**

    • 將請求刷新到數據庫
    • @return BatchResult list of updated records
    • @since 3.0.6
      */
      List flushStatements();

    /**

    • 關閉SqlSession
      */
      @Override
      void close();

    /**

    • 清空 緩存
      */
      void clearCache();

    /**

    • Retrieves current configuration.
    • @return Configuration
      */
      Configuration getConfiguration();

    /**

    • 使用type獲取對應的Mapper
    • @param the mapper type
    • @param type Mapper interface class
    • @return a mapper bound to this SqlSession
      */
      T getMapper(Class type);

    /**

    • 獲取該SqlSession對應的數據庫連接
    • @return Connection
      */
      Connection getConnection();
      }

DefaultSqlSession

在mybatis單獨使用的時候,DefaultSqlSession是最常使用的SqlSession實現。DefaultSqlSession核心字段如下,其中已經過多介紹的類將不再注釋。

private final Configuration configuration; private final Executor executor;/*** 是否自動提交事務*/ private final boolean autoCommit;/*** 當前緩存是否有臟數據*/ private boolean dirty;

DefaultSqlSession中使用到了策略模式(不知道策略模式的請看我以前的帖子)。DefaultSqlSession扮演了上下文,只是通過executor字段的不同,而選擇不同的Executor去操作數據庫。

DefaultSqlSession為每種SQL操作都提供了大量的重載,對于不同的參數都提供了一個重載方法, 便于開發者去調用。這里只貼出核心的方法,對于重載方法將不進行介紹。

* 根據sql和實參查詢一條數據* @param statement 預編譯的帶有?的sql* @param parameter 用戶傳入的實參,與前面sql綁定* @param <T>* @return*/ @Override public <T> T selectOne(String statement, Object parameter) {// 調用selectList查詢多條List<T> list = this.selectList(statement, parameter);// 如果查詢到的數據長度1是或者0就正常,否則拋出異常if (list.size() == 1) {return list.get(0);} else if (list.size() > 1) {// 這里的異常信息是不是很熟悉呢throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size());} else {return null;} }/*** 查詢結果封裝成map返回* 閱讀源碼發現,這里的selectMap貌似并不是將結果集按照屬性映射成map* 而是把map當做list去使用。* 查詢出多條數據,使用不同的key去封裝到map* 這里的V應該是這一條數據映射的對象,或者是Map<String, Object>* @param statement Unique identifier matching the statement to use.* @param parameter A parameter object to pass to the statement.* @param mapKey The property to use as key for each value in the list.* @param rowBounds Bounds to limit object retrieval* @param <K>* @param <V>* @return*/ @Override public <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds) {// 查詢列表final List<? extends V> list = selectList(statement, parameter, rowBounds);// 創建Map返回集處理器final DefaultMapResultHandler<K, V> mapResultHandler = new DefaultMapResultHandler<>(mapKey,configuration.getObjectFactory(), configuration.getObjectWrapperFactory(), configuration.getReflectorFactory());final DefaultResultContext<V> context = new DefaultResultContext<>();for (V o : list) {// 暫存一下當前結果對象context.nextResultObject(o);// 處理上下文中的結果對象mapResultHandler.handleResult(context);}// 將map返回回去return mapResultHandler.getMappedResults(); }/*** 根據傳入的sql、實參、查詢范圍去查詢一個列表* @param statement 預編譯的帶有問號的sql* @param parameter 用戶傳入的實參,與前面的sql綁定* @param rowBounds 指定查詢范圍* @param <E>* @return*/ @Override public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {try {MappedStatement ms = configuration.getMappedStatement(statement);return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);} catch (Exception e) {throw ExceptionFactory.wrapException("Error querying database. Cause: " + e, e);} finally {ErrorContext.instance().reset();} }/*** 根據sql、實參、范圍查詢* 將查詢結果交給指定的ResultHandler去處理* @param statement Unique identifier matching the statement to use.* @param parameter* @param rowBounds RowBound instance to limit the query results* @param handler ResultHandler that will handle each retrieved row*/ @Override public void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler) {try {MappedStatement ms = configuration.getMappedStatement(statement);executor.query(ms, wrapCollection(parameter), rowBounds, handler);} catch (Exception e) {throw ExceptionFactory.wrapException("Error querying database. Cause: " + e, e);} finally {ErrorContext.instance().reset();} }@Override public int update(String statement, Object parameter) {try {dirty = true;MappedStatement ms = configuration.getMappedStatement(statement);return executor.update(ms, wrapCollection(parameter));} catch (Exception e) {throw ExceptionFactory.wrapException("Error updating database. Cause: " + e, e);} finally {ErrorContext.instance().reset();} }@Override public void commit(boolean force) {try {// 提交事務。提交之后將dirty設為false// 此時的緩存中視為沒有臟數據executor.commit(isCommitOrRollbackRequired(force));dirty = false;} catch (Exception e) {throw ExceptionFactory.wrapException("Error committing transaction. Cause: " + e, e);} finally {ErrorContext.instance().reset();} }@Override public void rollback(boolean force) {try {executor.rollback(isCommitOrRollbackRequired(force));dirty = false;} catch (Exception e) {throw ExceptionFactory.wrapException("Error rolling back transaction. Cause: " + e, e);} finally {ErrorContext.instance().reset();} }@Override public List<BatchResult> flushStatements() {try {return executor.flushStatements();} catch (Exception e) {throw ExceptionFactory.wrapException("Error flushing statements. Cause: " + e, e);} finally {ErrorContext.instance().reset();} }

代碼比較簡單,就不做過多的介紹。
DefaultSqlSessionFactory

DefaultSqlSessionFactory是一個工廠類,提供了兩種創建DefaultSqlSession的方式,一種是通過數據源創建SqlSession,一種是通過用戶傳入的數據庫連接對象來創建SqlSession。另外代碼里有大量的openSession都是用于創建SqlSession對象的,但是其實現都是基于這兩種方式,因此這里只把兩種創建SqlSession的方式的代碼貼出來,如下。

/*** 通過數據源去創建SqlSession* @param execType* @param level* @param autoCommit* @return*/ private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {Transaction tx = null;try {// 獲取environment。這個是mybatis中配置的環境final Environment environment = configuration.getEnvironment();// 根據環境去獲取TransactionFactory對象final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);// 創建Transaction對象tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);// 創建Executor對象final Executor executor = configuration.newExecutor(tx, execType);// 創建DefaultSqlSessionreturn new DefaultSqlSession(configuration, executor, autoCommit);} catch (Exception e) {closeTransaction(tx);// may have fetched a connection so lets call close()throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e);} finally {ErrorContext.instance().reset();} }/*** 通過用戶提供的Connection對象去創建* @param execType* @param connection* @return*/ private SqlSession openSessionFromConnection(ExecutorType execType, Connection connection) {try {boolean autoCommit;try {autoCommit = connection.getAutoCommit();} catch (SQLException e) {// Failover to true, as most poor drivers// or databases won't support transactionsautoCommit = true;}final Environment environment = configuration.getEnvironment();final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);final Transaction tx = transactionFactory.newTransaction(connection);final Executor executor = configuration.newExecutor(tx, execType);return new DefaultSqlSession(configuration, executor, autoCommit);} catch (Exception e) {throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e);} finally {ErrorContext.instance().reset();} }

SqlSessionManager

SqlSessionManager同時實現了SqlSession接口和SQLSessionFactory接口,因此它擁有操作數據庫的能力以及創建SqlSession的功能。

SQLSessionManager核心字段如下

private final SqlSessionFactory sqlSessionFactory;/*** localSqlSession中記錄的SqlSession對象的代理對象*/ private final SqlSession sqlSessionProxy;/*** 記錄當前線程的SqlSession對象*/ private final ThreadLocal<SqlSession> localSqlSession = new ThreadLocal<>();

其中ThreadLocal的作用往往是作為當前線程的上下文,可以為當前線程提供全局變量。對ThreadLocal不了解的朋友也請查看我以前的文章。

SqlSessionManager提供了兩種模式。一種是同一線程每次通過SqlSessionManager對象訪問數據庫時,都會創建一個DefaultSqlSession對象完成數據庫操作,另一種則是使用localSqlSession綁定當前線程的SqlSession,在當前線程中循環使用同一個SqlSession。后者使用往往居多,這也是大家經常說的“SqlSession與線程綁定 ,每個請求都會創建SqlSession”的原因。

sqlSessionProxy是一個代理對象,在SqlSessionmanager的構造方法中使用JDK的動態代理創建完成,代碼如下。

private SqlSessionManager(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;// 使用動態代理去創建 SqlSessionthis.sqlSessionProxy = (SqlSession) Proxy.newProxyInstance(SqlSessionFactory.class.getClassLoader(),new Class[]{SqlSession.class},new SqlSessionInterceptor()); }

SqlSessionManager中實現的SqlSession 接口方法,都是直接調用sqlSessionProxy字段記錄的SqlSession代理對象的方法實現的。在創建該代理對象時使用到的SqlSessionInterceptor是SqlSessionManager的內部類,代碼如下。

private class SqlSessionInterceptor implements InvocationHandler {public SqlSessionInterceptor() {// Prevent Synthetic Access}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 獲取當前線程的SqlSessionfinal SqlSession sqlSession = SqlSessionManager.this.localSqlSession.get();if (sqlSession != null) {try {// SqlSession不為空就調用真正的SqlSession去完成數據庫的操作return method.invoke(sqlSession, args);} catch (Throwable t) {throw ExceptionUtil.unwrapThrowable(t);}} else {try (SqlSession autoSqlSession = openSession()) {// 如果當前線程的SqlSession為空,就創建新的SqlSession對象try {// 使用創建的SqlSession對象完成數據庫操作final Object result = method.invoke(autoSqlSession, args);// 提交事務autoSqlSession.commit();return result;} catch (Throwable t) {autoSqlSession.rollback();throw ExceptionUtil.unwrapThrowable(t);}}}} }

總結

SqlSession是單體mybatis使用最多的一個接口,可能我們在整合SSM之后就看不到這個接口了,但是其底層實現的時候也是會創建SqlSession的,雖然這個比較簡單,但是也是相當重要的一個模塊。
*************************************優雅的分割線 **********************************

分享一波:程序員賺外快-必看的巔峰干貨

如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程

請關注微信公眾號:HB荷包

一個能讓你學習技術和賺錢方法的公眾號,持續更新
*************************************優雅的分割線 **********************************
SimpleExecutor

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Mybatis源码阅读(五 ):接口层——SqlSession的全部內容,希望文章能夠幫你解決所遇到的問題。

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

国产精品综合久久久久久 | 日日日操操 | 日韩视频一区二区三区在线播放免费观看 | 少妇bbw揉bbb欧美 | 午夜手机看片 | 国产精品女教师 | 日韩成人免费观看 | 亚洲男模gay裸体gay | 美女黄频在线观看 | 成人av影视在线 | 91丨九色丨国产在线观看 | 婷婷六月激情 | 成人免费观看视频大全 | 亚洲色图美腿丝袜 | 91av免费在线观看 | 四虎成人精品在永久免费 | av成人在线播放 | 国色天香av | 国产免费成人 | 国产淫片免费看 | 国模视频一区二区 | 97超碰在线久草超碰在线观看 | 亚洲高清视频在线播放 | 色婷婷www | japanesefreesex中国少妇 | 人人爱爱人人 | 中文字幕日本在线观看 | 久久久久久久久久久免费 | 国产精品欧美日韩在线观看 | 国产精品观看在线亚洲人成网 | 免费一级片观看 | 亚州精品国产 | 亚洲欧洲av在线 | 中文字幕久久精品亚洲乱码 | 久久久国产电影 | 91精品无人成人www | 99精品热视频只有精品10 | www.狠狠| 中文字幕高清 | 久久国语 | 久久午夜剧场 | 国产精品视频免费观看 | 免费一级特黄毛大片 | 999久久久久 | 国产精品入口久久 | 九九热视频在线免费观看 | 天天摸天天舔天天操 | 久久99精品国产99久久 | 国产精品99久久免费观看 | 国产成人精品av在线观 | 国内精品美女在线观看 | 开心色插| 青草视频免费观看 | 国产精品欧美久久久久久 | 亚洲闷骚少妇在线观看网站 | 三上悠亚一区二区在线观看 | 久久九九精品 | 久久久国产精品成人免费 | 福利一区二区 | 狠狠久久婷婷 | 99热最新在线 | 国产精品一区二区果冻传媒 | 在线精品视频在线观看高清 | 99久久一区 | 亚洲成a人片在线观看网站口工 | av在线一二三区 | 亚洲综合在线五月 | 国产亚洲在线视频 | 欧美日韩国产欧美 | 国产一级免费视频 | 亚洲精品高清在线 | 国产探花视频在线播放 | 日韩黄色大片在线观看 | 免费在线观看午夜视频 | 中文字幕精品一区久久久久 | 8x成人免费视频 | 国产乱码精品一区二区三区介绍 | 色综合www | 91成人欧美| 日韩区在线观看 | 天堂网一区二区 | 成人在线观看免费视频 | 国产九九精品视频 | 91网址在线| 91传媒在线看 | 黄色app网站在线观看 | 午夜视频亚洲 | 国产99久久久国产精品免费二区 | 九九九九热精品免费视频点播观看 | 91刺激视频 | 91精品国产麻豆国产自产影视 | 日韩理论片 | 日韩电影一区二区三区 | 久久情网 | 中国一级特黄毛片大片久久 | 国产成人三级在线 | 久草精品视频 | 久久不卡免费视频 | 亚洲电影图片小说 | 精品在线播放视频 | 欧美一区二区在线免费观看 | 国产成人精品久久亚洲高清不卡 | 日韩欧美高清视频在线观看 | 天天天综合 | 日b视频在线观看网址 | 久久全国免费视频 | 99免在线观看免费视频高清 | 亚洲人成人天堂h久久 | 免费观看一级视频 | 成人黄色一级视频 | 亚洲国产成人精品在线观看 | 久久资源在线 | 日韩高清www | 国产精品高潮呻吟久久av无 | 日韩欧美在线观看一区 | 日韩和的一区二在线 | 成人黄色免费在线观看 | 在线免费观看国产精品 | a级国产毛片 | 国产精品久久久久久久久久久久 | 一区二区三区三区在线 | 丁香五月亚洲综合在线 | 欧美黄在线 | 久久国产精品免费一区二区三区 | 九九免费精品视频在线观看 | 国产成人精品电影久久久 | 在线视频 你懂得 | 美女一级毛片视频 | 深爱激情五月综合 | 日韩丝袜 | 成人精品福利 | 亚洲天堂网在线视频观看 | 国产美女免费看 | 人人干人人超 | 亚洲综合小说电影qvod | 久久天天操 | 亚洲精品在线免费看 | 国产丝袜制服在线 | 亚洲影院国产 | 国产美女主播精品一区二区三区 | 精品无人国产偷自产在线 | 国产美女网站视频 | 免费av看片| 黄色av网站在线免费观看 | 一级黄色片在线观看 | 天天干天天拍天天操天天拍 | 国产成人亚洲在线观看 | 99视频在线观看视频 | 日韩在线免费高清视频 | 免费人人干 | 久草.com| 亚洲v精品 | 欧美中文字幕第一页 | 久草网免费 | 美女福利视频 | 最近中文字幕完整视频高清1 | 97免费| 日韩精品一区二区三区水蜜桃 | 亚州精品国产 | 日韩高清不卡一区二区三区 | 激情视频免费观看 | 免费情趣视频 | 色在线视频网 | 国产精品免费不 | 欧美大香线蕉线伊人久久 | 在线国产福利 | 久人人| 香蕉一区 | 国产中文字幕在线视频 | 亚洲午夜在线视频 | 免费看黄在线网站 | 婷婷国产一区二区三区 | 91高清视频免费 | 国产第一页福利影院 | 六月丁香在线视频 | 最新中文字幕 | 日韩欧美在线视频一区二区 | 国产精品午夜在线观看 | 国产高清视频在线播放 | 国产精品理论片 | av一区二区三区在线观看 | 最近中文字幕mv | 久久精品亚洲 | 国产精品免费在线视频 | 欧美色操 | 午夜成人免费影院 | 婷婷丁香在线观看 | 最新动作电影 | 久久一区二区三区超碰国产精品 | 看片网站黄 | 久久综合天天 | 韩国av免费在线观看 | 国产亚洲精品久久 | 精品一区二区视频 | 精品国产电影一区二区 | 亚洲高清在线 | 成人午夜影院 | 欧美黄色软件 | 欧美精品中文字幕亚洲专区 | 日韩在线三级 | 美女精品久久久 | 国产在线观看你懂得 | 国产一级精品在线观看 | 久久综合九色欧美综合狠狠 | 久久在线看 | 亚洲午夜精 | 狠狠色噜噜狠狠狠狠2022 | 97人人超| 亚洲视频2 | 三级免费黄色 | 欧美日韩精品国产 | 欧美专区日韩专区 | 国产99一区 | 欧美大片大全 | 日韩精品免费在线观看 | 亚洲精品视频偷拍 | www欧美xxxx| 日韩免费成人av | 99热999| 日日日操| 国产三级久久久 | 久久久高清 | 午夜视频免费在线观看 | 四月婷婷在线观看 | 成人免费大片黄在线播放 | 国产高清一区二区 | 国产精品一区二区三区久久久 | 欧美精品久久久久久久久久 | 区一区二区三在线观看 | 色先锋av资源中文字幕 | 在线色亚洲 | 亚洲va天堂va欧美ⅴa在线 | 在线视频观看你懂的 | 国产精品毛片一区视频播不卡 | 成人av一二三区 | 免费能看的av | 久国产在线播放 | 亚洲自拍av在线 | 国产精品岛国久久久久久久久红粉 | 免费高清在线观看电视网站 | 成人在线视频在线观看 | 天天干天天操天天射 | 精品国产电影一区 | 一区二区在线影院 | 在线视频久久 | 97人人超碰在线 | 久久精品人人做人人综合老师 | 成人国产网址 | 成人免费在线播放 | 超碰97国产精品人人cao | 久久伊人八月婷婷综合激情 | 久久视频在线观看免费 | 视频国产区 | 国产免费一区二区三区最新 | 亚洲天堂首页 | 天天干夜夜 | 波多野结衣亚洲一区二区 | 久久久久亚洲精品 | 一区二区三区精品久久久 | 国产午夜麻豆影院在线观看 | 在线不卡中文字幕播放 | 国产二级视频 | 五月婷婷伊人网 | 91久久在线观看 | 2019精品手机国产品在线 | 精品视频在线观看 | 91精彩视频 | 中文字幕视频网 | 看av免费 | 天天综合网入口 | 91精品推荐 | av线上看 | 又大又硬又黄又爽视频在线观看 | 在线观看黄色av | 操操操综合| 日韩一区二区三区不卡 | 精品国产日本 | 国产成人区 | 免费观看的黄色片 | 中文高清av | 999抗病毒口服液 | 最新国产在线视频 | 射久久久 | 久久久久麻豆 | 最近中文字幕免费观看 | 色综合久久中文综合久久牛 | 天堂va欧美va亚洲va老司机 | 免费在线观看国产精品 | 国产欧美在线一区 | 91黄色免费看 | 精品国产乱子伦一区二区 | 国产精品99久久久久的智能播放 | 亚洲三级性片 | 狠狠色狠狠综合久久 | 国产精品免费在线播放 | 国产成人精品亚洲日本在线观看 | 国产福利精品视频 | v片在线看 | 亚洲综合在线一区二区三区 | www亚洲视频 | 在线免费中文字幕 | 国内精品久久久久久久97牛牛 | 国产又黄又硬又爽 | 少妇搡bbb | 亚洲成人国产精品 | 最近中文字幕高清字幕免费mv | 亚洲一区精品人人爽人人躁 | 成人在线免费看 | 亚洲成人国产精品 | 亚洲最新av在线网址 | 欧美日韩精品综合 | 精品在线亚洲视频 | 黄色小说免费在线观看 | 日韩精品一区不卡 | 四虎国产永久在线精品 | 欧美午夜性生活 | 国产免费观看久久 | 最新精品视频在线 | 亚洲激情视频在线观看 | www.狠狠色 | 精品二区视频 | 午夜美女福利直播 | 夜夜躁狠狠躁日日躁 | 精品免费在线视频 | 久青草国产在线 | 国产一级免费视频 | 国产尤物在线观看 | 久久视频国产 | 国产黄色片在线免费观看 | 99热这里只有精品免费 | 国产亚洲资源 | 天天操天天舔天天干 | 日韩欧美视频二区 | av在线专区 | www.狠狠| 久久99深爱久久99精品 | 天天操综合 | 在线观看完整版 | 久久一区国产 | 久久优| 中文字幕视频一区二区 | 日本精品中文字幕在线观看 | 成人免费视频在线观看 | 在线观看黄色国产 | 干干干操操操 | 久久永久视频 | 操处女逼 | 国产精品美女999 | 激情欧美国产 | 国产一区二区在线看 | 中文字幕日本在线 | 婷婷激情小说网 | 中文字幕亚洲综合久久五月天色无吗'' | 一区二区三区四区五区在线视频 | 97成人在线观看视频 | 在线精品一区二区 | 国产污视频在线观看 | 91免费版在线观看 | 久久精品精品 | 黄色片网站 | 日韩精品一区二区在线观看 | 人人爱人人爽 | 国产视频在线观看一区二区 | 免费在线观看日韩视频 | 天天摸夜夜添 | 国产精品九色 | 久久精品国产亚洲精品 | 欧美aaa一级 | 天天干干 | 天天曰视频 | 久久久久久久久久亚洲精品 | 99精品国产99久久久久久福利 | 久久再线视频 | 亚洲,国产成人av | 婷婷国产v亚洲v欧美久久 | 日韩91在线 | a色视频| 欧美老人xxxx18 | 最新91在线视频 | 国产精品成人久久 | 日韩电影中文,亚洲精品乱码 | 有码中文字幕 | 日日夜夜中文字幕 | 一级成人免费 | 九色91在线 | 亚洲永久精品国产 | 欧美日本中文字幕 | 天堂va欧美va亚洲va老司机 | 天天夜操 | 波多野结衣在线视频一区 | 97人人澡人人添人人爽超碰 | 欧美久草在线 | 成人av在线直播 | 久久草视频 | 黄a在线观看 | 成人在线观看日韩 | 日韩网站免费观看 | 丁香六月网 | 国产午夜三级 | 四虎在线视频免费观看 | 国产精品久久久影视 | 欧美性色综合 | 国产婷婷一区二区 | 成人avav | 97超碰国产精品 | 亚洲成人家庭影院 | 国语精品视频 | 东方av在| 天天干天天操天天入 | 蜜桃视频在线视频 | 国产欧美久久久精品影院 | 人人干人人做 | 午夜视频一区二区三区 | 欧美 亚洲 另类 激情 另类 | 月丁香婷婷 | 久久久久久久久久久综合 | 久久久久成人免费 | 伊人伊成久久人综合网小说 | 狠狠干我 | 99久久婷婷国产一区二区三区 | 精品免费一区二区三区 | 日韩在线观看av | 国产999精品久久久久久 | 国产一区二区精品91 | 久久久久高清 | 丁香婷婷色 | 久久精品欧美一区 | 日本久久综合视频 | 日韩专区一区二区 | 麻豆一精品传二传媒短视频 | 97超碰人人澡人人爱 | 激情综合色综合久久 | 91视频免费视频 | 高清不卡毛片 | 亚洲理论在线观看电影 | 久久精品国产成人精品 | 一区二区三区中文字幕在线观看 | 国产特级毛片aaaaaaa高清 | 99精品视频在线播放观看 | 99日精品| 天天综合狠狠精品 | 2021av在线| caobi视频| 久久国产视频网站 | 精品久久久久久综合 | 在线精品视频在线观看高清 | 欧美视频99| 日韩一级网站 | 欧美亚洲一区二区在线 | 九九视频精品免费 | 国产麻豆精品久久 | 日韩一区二区在线免费观看 | 国产一区二区手机在线观看 | 天天综合网在线观看 | 久久久久久久久久久久久久av | 激情九九| 狠狠干五月天 | 狠狠地日 | 69久久久| 久久99免费| 激情开心色 | 中文字幕在线观看第三页 | 国产日韩精品久久 | 日韩大片在线播放 | 日韩女同一区二区三区在线观看 | 91在线91拍拍在线91 | 国产精品丝袜久久久久久久不卡 | 久草爱| 日本大片免费观看在线 | www.伊人网| 综合国产在线 | 亚洲国产最新 | 在线午夜 | 国产精品久久亚洲 | 91网页版免费观看 | 久久精品国产亚洲aⅴ | 久久人人爽人人片av | 久久免费视频在线观看6 | 97av在线| 久操视频在线播放 | 91av播放 | 国产精品成人久久久久久久 | a级成人毛片 | 天天弄天天操 | 成人久久精品视频 | 欧美欧美| 日韩一区二区三区不卡 | 成人黄色大片在线免费观看 | 国产精品久久久久久久久久99 | 国产精品久久久久高潮 | 精品天堂av | 在线免费黄色av | 九九久久国产 | 亚洲精品免费在线 | 亚洲区二区| 天天玩天天干 | 久草热视频 | 韩国一区二区三区视频 | 亚洲国产av精品毛片鲁大师 | 中文字幕频道 | 欧美性久久久久久 | 福利二区视频 | 亚洲国产精品久久久久婷婷884 | 亚洲欧美乱综合图片区小说区 | 一区二区三区在线视频111 | 国产午夜精品一区 | 99久久综合精品五月天 | 国产一级视频免费看 | 亚洲激情视频在线观看 | 久久九九精品 | 亚洲精品资源在线 | 91丨九色丨国产在线 | 成人手机在线视频 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 91精品久久久久久久91蜜桃 | 亚洲色综合 | 黄色网址a | 激情综合色综合久久综合 | 日韩精品中文字幕在线播放 | 中文字幕 国产精品 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 免费一级片视频 | 1000部国产精品成人观看 | 中文字幕第一 | 中文字幕免费观看全部电影 | 国产一区二区三区网站 | 久久男人免费视频 | 五月花婷婷 | 99精品视频免费在线观看 | 国产麻豆精品在线观看 | www黄| 国产精品专区在线观看 | 91香蕉视频黄色 | 亚洲狠狠婷婷综合久久久 | 午夜精品一区二区三区在线 | 国产精品区一区 | 午夜免费久久看 | 中文字幕在线播放一区 | 日韩欧美国产激情在线播放 | 天天爽天天爽天天爽 | 91热爆视频| 麻豆视频免费入口 | 国产在线播放观看 | 国产精品第2页 | 黄色片免费电影 | 国产亚洲成av人片在线观看桃 | 日韩在线高清 | 91免费看黄色 | 日韩国产精品久久 | 在线观看激情av | 欧美怡红院视频 | 亚洲影院色 | 国内精品久久久久影院日本资源 | 日韩精品一区二区三区第95 | 欧美专区日韩专区 | av在线h| 婷婷六月网 | 天天干夜夜夜操天 | 久久久久成人精品 | 九九九在线观看视频 | 国产成人精品午夜在线播放 | 国产亚洲一区二区三区 | 懂色av一区二区三区蜜臀 | 综合中文字幕 | 在线免费av网站 | 精品一区二区视频 | 国产不卡免费视频 | 激情综合网五月激情 | 国产色视频网站 | 成人宗合网 | 久久综合色综合88 | 狠狠色噜噜狠狠狠合久 | 乱子伦av | 亚洲黄色影院 | 精品一区二区在线免费观看 | 日韩一二三区不卡 | 日本久久久久久久久 | 天天天天天干 | 国产视频一区在线播放 | 天天干天天弄 | 国产高清在线永久 | 久久婷婷激情 | 国产99久久九九精品免费 | 五月天九九 | 久久69精品| 中文字幕成人在线 | 国产黄色特级片 | 欧美精品久久久久久久亚洲调教 | 国产精品成人av电影 | 亚洲综合婷婷 | 91在线产啪 | 日本黄区免费视频观看 | 中文字幕一区二区在线播放 | 日韩电影一区二区在线观看 | 在线免费黄 | 中文字幕黄色 | 精品在线视频一区 | 精品国产成人在线 | 久久精品之 | 国产一卡二卡四卡国 | 伊人国产在线播放 | 91精品国产九九九久久久亚洲 | 国产精品成人久久久久久久 | 欧美黑人巨大xxxxx | 91成年人网站| 国产在线观看99 | 在线看的av网站 | 久草免费色站 | av在线短片 | 亚洲国产高清在线观看视频 | 91在线看视频免费 | 欧美日韩综合在线 | 国产精品久久久久久久久久99 | 99久热精品| 五月天堂网 | 伊人亚洲综合 | 美女黄视频免费 | 九九热有精品 | 在线 国产一区 | 五月婷婷天堂 | 久久久精品 一区二区三区 国产99视频在线观看 | 亚洲综合色视频 | 啪啪午夜免费 | 国产黄av | 丁香六月五月婷婷 | 深爱激情站 | 7777xxxx| 久久av免费电影 | 美女久久久久久 | 国产在线91在线电影 | 日本久久免费电影 | 日本护士三级少妇三级999 | 久久精品7 | 日日夜夜狠狠操 | 亚洲jizzjizz日本少妇 | 欧美在线视频日韩 | 天天躁日日躁狠狠 | 日韩欧美在线一区二区 | 日韩网 | 亚洲黄在线观看 | 欧美乱码精品一区 | 欧美日产在线观看 | 日韩欧美在线影院 | 国产一区av在线 | 毛片网在线播放 | 久久久免费播放 | 在线观看免费av网站 | 亚洲免费观看视频 | 日韩av电影免费观看 | 国产精品色在线 | 国产精品欧美一区二区三区不卡 | 99热在线观看免费 | 天天操天天综合网 | 亚洲国产激情 | www.久艹 | 国产1区在线 | 99视频免费观看 | 日批视频国产 | 国产成人精品999在线观看 | av大全在线看| 美女免费视频观看网站 | 国产精品18久久久久久首页狼 | 精品国产乱码久久久久久1区2匹 | 成人免费一区二区三区在线观看 | 青青河边草免费直播 | 丰满少妇在线观看资源站 | 黄色av成人在线 | 国产精品一区二区美女视频免费看 | 九九热精品视频在线观看 | 久久免费黄色 | 欧美一级乱黄 | 免费看色视频 | 欧美另类v | 操一草 | 伊人中文在线 | 奇米7777狠狠狠琪琪视频 | 亚洲视频aaa | 成人污视频在线观看 | 91亚洲精品在线观看 | 色亚洲激情| 香蕉视频4aa | 欧美日韩性生活 | 91大神精品视频在线观看 | 波多野结衣亚洲一区二区 | 成年在线观看 | 久久天天拍| 亚洲精品一区二区精华 | 欧美激情精品久久久久 | 亚洲欧美国产精品18p | 51精品国自产在线 | 极品嫩模被强到高潮呻吟91 | 9在线观看免费高清完整版在线观看明 | av在线日韩| 国产精品视频永久免费播放 | 99久久久国产精品美女 | a级国产片| 欧美一级高清片 | 久久精品中文 | 精品久久久久久久久久岛国gif | 国产高清视频在线播放一区 | 欧美日韩不卡一区二区三区 | 91精品国产福利 | 性色av香蕉一区二区 | 成年人在线免费看视频 | 国产视频在 | 亚洲观看黄色网 | 在线观看mv的中文字幕网站 | 国产私拍在线 | h视频在线看 | 国产成人亚洲在线观看 | 成人免费观看在线视频 | 狠狠干夜夜 | 免费av在线网站 | 国产精品99久久久久人中文网介绍 | 黄色大片日本免费大片 | 黄色不卡av | 天天操夜操 | 天天摸天天干天天操天天射 | 99热这里只有精品国产首页 | www久久国产 | 久久久久夜色 | av超碰免费在线 | 欧美做受xxx | 亚洲国产中文字幕 | 五月激情五月激情 | 日韩一区二区三区免费视频 | 久久精品国产亚洲精品2020 | 伊人国产在线观看 | 五月激情在线 | 碰超人人 | 日本中文字幕久久 | 蜜桃av观看 | 国产精品入口传媒 | 探花视频在线观看免费版 | 婷婷丁香在线观看 | 国产97碰免费视频 | 99精品欧美一区二区 | 欧美视频99 | 少妇做爰k8经典 | 黄色三级在线看 | 一区二区三区四区在线 | 麻豆综合网 | 婷婷久久网 | 丁香婷婷基地 | 欧美日韩xxxxx | 久久综合在线 | 国产1区2区3区精品美女 | 久久99精品国产91久久来源 | 人人爱在线视频 | 亚洲精品免费在线视频 | 色五丁香 | 国产精品免费一区二区三区在线观看 | 国产午夜激情视频 | 久久综合精品国产一区二区三区 | 色综合久久中文综合久久牛 | 最近免费中文字幕 | 久久艹在线观看 | 久久午夜精品影院一区 | 久久精品欧美一区 | 国产一区黄色 | 香蕉视频色 | 久久这里只有精品久久 | 99精品视频在线观看视频 | 国产日产欧美在线观看 | 国产香蕉视频在线播放 | 18av在线视频 | 91人人网| 五月婷婷狠狠 | 激情深爱五月 | 日韩69视频 | 国产一级二级三级视频 | 亚洲女同videos| 欧美一级视频一区 | 国产在线视频一区二区三区 | 国产麻豆视频在线观看 | 日本精品xxxx | 香蕉网在线观看 | 九九久久久久久久久激情 | 中文视频在线看 | 免费网站在线观看成人 | 黄网站免费大全入口 | 精品一区精品二区 | 欧美国产精品久久久久久免费 | 国产精选在线观看 | 久久99国产一区二区三区 | 97成人精品视频在线播放 | 亚洲精品午夜aaa久久久 | 免费麻豆网站 | 亚洲激情久久 | 国产日本亚洲 | 午夜精品福利一区二区三区蜜桃 | 成在人线av | 色天天综合久久久久综合片 | 欧美日韩二三区 | 999一区二区三区 | 亚洲成人av在线电影 | 国产精品久久99综合免费观看尤物 | 国产在线污| 午夜精品av| 韩日精品在线观看 | 亚洲精品在线观看免费 | 丁香六月国产 | 欧美日韩中文国产一区发布 | 视频成人永久免费视频 | 亚洲毛片视频 | 婷婷久操 | 国产成人综 | 永久免费观看视频 | 夜夜干夜夜 | 在线观看色网 | 黄色成人av网址 | 美女国产 | 色在线网| 中国一级片视频 | 成人a视频片观看免费 | 久久久午夜剧场 | 国产精品18久久久久久久久久久久 | 久久九九精品久久 | 国产精品久久久久一区二区国产 | 成人在线视频免费 | 亚洲国产精品电影在线观看 | 最近日韩免费视频 | 免费看的黄色 | 五月婷婷天堂 | 又污又黄网站 | 久久久久久久久久影视 | 香蕉视频免费在线播放 | 人人舔人人干 | 精品国产不卡 | 9999精品| 色天天 | 成人黄色大片在线免费观看 | 欧美日韩亚洲在线观看 | 国产在线色视频 | 成人午夜在线电影 | 99久久国产免费看 | 337p欧美| 欧美精品久久久久久久久老牛影院 | 夜夜爱av| 天天干天天干天天干 | 一区二区精品视频 | 亚洲国产午夜精品 | 欧美日韩在线精品 | 2020天天干夜夜爽 | 亚洲国产精品久久久 | 国产精品女同一区二区三区久久夜 | 久久蜜桃av | 午夜三级大片 | 香蕉视频网址 | 国产在线高清精品 | 99久久99热这里只有精品 | 亚洲天堂精品视频 | www.五月婷婷.com| 欧洲色综合| 天天射网站 | 99精品视频免费全部在线 | 国产成人精品不卡 | 毛片二区 | 久久综合九色九九 | 久久艹久久 | 国产精品一区二区在线 | 91成人精品视频 | 国产精品一区二 | 国内揄拍国产精品 | 91丨porny丨九色 | 日韩一区二区三 | 国产999免费视频 | 人人精品 | 国产精品久久久久久久av大片 | 日韩美精品视频 | 久久免费观看视频 | 又污又黄的网站 | 免费观看91视频 | 欧美日韩99 | 国产精品综合久久久久久 | 亚洲精品国偷自产在线99热 | 色婷婷av在线| 久久一区国产 | 爱爱av网站| 97视频入口免费观看 | 日韩免费看视频 | 91禁在线观看 | 在线观看av中文字幕 | 日韩三级.com| 狠狠干夜夜| 日韩系列 | 91九色porny蝌蚪主页 | 成年人免费看片 | 色爱成人网 | 噜噜色官网 | 久久久久久久网 | 91人人射 | 亚洲精品tv久久久久久久久久 | 黄色小说免费观看 | 午夜精品av在线 | 久久 亚洲视频 | 日本韩国精品一区二区在线观看 | 91系列在线观看 | .国产精品成人自产拍在线观看6 | 黄色视屏av | 黄色视屏av| 欧美国产日韩一区二区三区 | 免费精品在线视频 | 色综合久久66 | 天天色天天操天天爽 | 中文字幕免费在线 | 福利视频网站 | 8x8x在线观看视频 | 国产一级精品视频 | 国产高清久久久久 | 欧美怡红院视频 | 日韩欧美在线观看一区二区三区 | 成人欧美一区二区三区在线观看 | 婷婷在线五月 | 亚洲人在线视频 | av 一区二区三区四区 | 国产精品久久久久久久久久久不卡 | 中文字幕日韩精品有码视频 | 国产一级片视频 | 日韩高清观看 | 欧美成人h版在线观看 | 国产精品成人自产拍在线观看 | 国产精品va在线播放 | 中文字幕三区 | 97在线成人| 超碰公开在线 | 亚洲综合小说电影qvod | 久久国产高清视频 | 国产在线探花 | 激情网在线观看 | 久久国产精品久久久久 | 日本黄色免费在线观看 | 特级黄色一级 | 国产精品视频地址 | 六月色婷婷 | 色天天中文 | 男女啪啪视屏 | 91九色综合 | 国产精品 久久 | 99视频这里只有 | 中字幕视频在线永久在线观看免费 | 九九热免费观看 | 成人黄在线观看 | 探花视频在线观看+在线播放 | 亚洲精品国产欧美在线观看 | 亚洲在线激情 | 欧美日韩在线观看一区 | 日韩免费一区二区在线观看 | 最近中文字幕大全中文字幕免费 | 亚洲精品在线观看免费 | 日本特黄一级片 | 亚洲视频每日更新 | 久久久国产一区二区三区四区小说 | 韩国三级在线一区 | 国内成人av | 日韩欧美国产免费播放 | 五月激情综合婷婷 | 国产视频网站在线观看 | 人人澡人人模 | www.久艹| 中文字幕一区二区三区四区在线视频 | 九九免费在线视频 | 激情综合五月婷婷 | 韩国一区二区三区在线观看 | 在线观看免费高清视频大全追剧 | 91在线精品一区二区 | 亚洲精品乱码久久久久v最新版 | 黄色av网站在线免费观看 | 欧美日韩亚洲在线观看 | 欧美日韩国产免费视频 | 97国产| 久草男人天堂 | 视频一区二区国产 | 欧美日韩高清在线 | 国产一区二区不卡在线 | 91精品国产网站 | 久久亚洲综合国产精品99麻豆的功能介绍 | 国产福利一区二区三区视频 | 夜色资源站wwwcom | 欧美一级视频免费 | 久久国产精品免费一区二区三区 | 成人影视免费 | 日韩一区在线播放 | 成人观看| 欧美精品一区二区性色 | 国产欧美综合视频 | 亚洲影视九九影院在线观看 | a久久免费视频 | 日韩精品中文字幕一区二区 | 久久久毛片| 色噜噜在线观看视频 | 成人av高清在线 | 天天操天天干天天插 | 蜜臀av性久久久久av蜜臀妖精 | 一区二区三区在线观看 | 久草香蕉在线视频 | 亚洲一级电影在线观看 | 六月婷色 |