国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

MyBatis 的工作原理,你了解過嗎?

共 13371字,需瀏覽 27分鐘

 ·

2020-10-31 01:08

來源:cnblogs.com/scuury/p/10371246.html

  • 第一步:創(chuàng)建一個sqlSessionFactory
  • 第二步:創(chuàng)建sqlSession
  • 第三步:執(zhí)行具體的sql請求
  • 總結(jié)
  • 參考


近來想寫一個mybatis的分頁插件,但是在寫插件之前肯定要了解一下mybatis具體的工作原理吧,于是邊參考別人的博客,邊看源碼就開干了。

核心部件:

  • SqlSession
  • Executor
  • StatementHandler
  • ParameterHandler
  • ResultSetHandler
  • TypeHandler
  • MappedStatement
  • Configuration

在分析工作原理之前,首先看一下我的mybatis全局配置文件

"1.0"?encoding="UTF-8"??>
PUBLIC?"-//mybatis.org//DTD?Config?3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

????
????default="development">
????????"development">
????????????
????????????"JDBC"?/>
????????????
????????????"POOLED">
????????????????"driver"?value="com.mysql.jdbc.Driver"?/>
????????????????"url"
????????????????????value="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8"?/>
????????????????"username"?value="root"?/>
????????????????"password"?value="123456"?/>
????????????
????????
????
????
???????"sqlMapper/userMapper.xml"/>
????


第一步:創(chuàng)建一個sqlSessionFactory

在了解如何創(chuàng)建sqlSessionFactory之前,先看一下mybatis是如何加載全局配置文件,解析xml文件生成Configuration的

public?Configuration?parse()?{
????if?(parsed)?{
??????throw?new?BuilderException("Each?XMLConfigBuilder?can?only?be?used?once.");
????}
????parsed?=?true;
????parseConfiguration(parser.evalNode("/configuration"));
????return?configuration;
??}
private?void?parseConfiguration(XNode?root)?{
????try?{
??????propertiesElement(root.evalNode("properties"));?//issue?#117?read?properties?first
??????typeAliasesElement(root.evalNode("typeAliases"));
??????pluginElement(root.evalNode("plugins"));
??????objectFactoryElement(root.evalNode("objectFactory"));
??????objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
??????settingsElement(root.evalNode("settings"));
??????environmentsElement(root.evalNode("environments"));?//?read?it?after?objectFactory?and?objectWrapperFactory?issue?#631
??????databaseIdProviderElement(root.evalNode("databaseIdProvider"));
??????typeHandlerElement(root.evalNode("typeHandlers"));
??????mapperElement(root.evalNode("mappers"));
????}?catch?(Exception?e)?{
??????throw?new?BuilderException("Error?parsing?SQL?Mapper?Configuration.?Cause:?"?+?e,?e);
????}
??}

在上面的第二段代碼中有一句

mapperElement(root.evalNode("mappers"));

剛好我們的全局配置文件中有一個mapper的配置,由此可見,mapperElemet()方法是解析mapper映射文件的,具體代碼如下

private?void?mapperElement(XNode?parent)?throws?Exception?{
????if?(parent?!=?null)?{
??????for?(XNode?child?:?parent.getChildren())?{
????????if?("package".equals(child.getName()))?{
??????????String?mapperPackage?=?child.getStringAttribute("name");
??????????configuration.addMappers(mapperPackage);
????????}?else?{
??????????String?resource?=?child.getStringAttribute("resource");
??????????String?url?=?child.getStringAttribute("url");
??????????String?mapperClass?=?child.getStringAttribute("class");
??????????if?(resource?!=?null?&&?url?==?null?&&?mapperClass?==?null)?{//進(jìn)入該判斷
????????????ErrorContext.instance().resource(resource);
????????????InputStream?inputStream?=?Resources.getResourceAsStream(resource);
????????????XMLMapperBuilder?mapperParser?=?new?XMLMapperBuilder(inputStream,?configuration,?resource,?configuration.getSqlFragments());
????????????mapperParser.parse();
??????????}?else?if?(resource?==?null?&&?url?!=?null?&&?mapperClass?==?null)?{
????????????ErrorContext.instance().resource(url);
????????????InputStream?inputStream?=?Resources.getUrlAsStream(url);
????????????XMLMapperBuilder?mapperParser?=?new?XMLMapperBuilder(inputStream,?configuration,?url,?configuration.getSqlFragments());
????????????mapperParser.parse();
??????????}?else?if?(resource?==?null?&&?url?==?null?&&?mapperClass?!=?null)?{
????????????Class?mapperInterface?=?Resources.classForName(mapperClass);
????????????configuration.addMapper(mapperInterface);
??????????}?else?{
????????????throw?new?BuilderException("A?mapper?element?may?only?specify?a?url,?resource?or?class,?but?not?more?than?one.");
??????????}
????????}
??????}
????}
??}

根據(jù)以上代碼可以分析,在寫mapper映射文件的地址時不僅可以寫成resource,還可以寫成url和mapperClass的形式,由于我們用的是resource,所以直接進(jìn)入第一個判斷,最后解析mapper映射文件的方法是

private?void?configurationElement(XNode?context)?{
????try?{
??????String?namespace?=?context.getStringAttribute("namespace");
??????if?(namespace.equals(""))?{
??????????throw?new?BuilderException("Mapper's?namespace?cannot?be?empty");
??????}
??????builderAssistant.setCurrentNamespace(namespace);
??????cacheRefElement(context.evalNode("cache-ref"));
??????cacheElement(context.evalNode("cache"));
??????parameterMapElement(context.evalNodes("/mapper/parameterMap"));
??????resultMapElements(context.evalNodes("/mapper/resultMap"));
??????sqlElement(context.evalNodes("/mapper/sql"));
??????buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
????}?catch?(Exception?e)?{
??????throw?new?BuilderException("Error?parsing?Mapper?XML.?Cause:?"?+?e,?e);
????}
??}

其中具體解析每一個sql語句節(jié)點的是

buildStatementFromContext(context.evalNodes("select|insert|update|delete"));

進(jìn)入這個方法一層層深究,最后到這里可以知道MappedStatement是由builderAssistant(即MapperBuildAssistant)創(chuàng)建的。

public?void?parseStatementNode()?{
????...
????builderAssistant.addMappedStatement(id,?sqlSource,?statementType,?sqlCommandType,
????????fetchSize,?timeout,?parameterMap,?parameterTypeClass,?resultMap,?resultTypeClass,
????????resultSetTypeEnum,?flushCache,?useCache,?resultOrdered,
????????keyGenerator,?keyProperty,?keyColumn,?databaseId,?langDriver,?resultSets);
??}

最后進(jìn)入方法addMappedStatement(),mappedStatement最后以id為鍵保存在了Configuration中的一個map變量mappedStatements中。

public?MappedStatement?addMappedStatement(
??????String?id,
??????SqlSource?sqlSource,
??????StatementType?statementType,
??????SqlCommandType?sqlCommandType,
??????Integer?fetchSize,
??????Integer?timeout,
??????String?parameterMap,
??????Class?parameterType,
??????String?resultMap,
??????Class?resultType,
??????ResultSetType?resultSetType,
??????boolean?flushCache,
??????boolean?useCache,
??????boolean?resultOrdered,
??????KeyGenerator?keyGenerator,
??????String?keyProperty,
??????String?keyColumn,
??????String?databaseId,
??????LanguageDriver?lang,
??????String?resultSets)
?
{

????if?(unresolvedCacheRef)?throw?new?IncompleteElementException("Cache-ref?not?yet?resolved");

????id?=?applyCurrentNamespace(id,?false);
????boolean?isSelect?=?sqlCommandType?==?SqlCommandType.SELECT;

????MappedStatement.Builder?statementBuilder?=?new?MappedStatement.Builder(configuration,?id,?sqlSource,?sqlCommandType);
????statementBuilder.resource(resource);
????statementBuilder.fetchSize(fetchSize);
????statementBuilder.statementType(statementType);
????statementBuilder.keyGenerator(keyGenerator);
????statementBuilder.keyProperty(keyProperty);
????statementBuilder.keyColumn(keyColumn);
????statementBuilder.databaseId(databaseId);
????statementBuilder.lang(lang);
????statementBuilder.resultOrdered(resultOrdered);
????statementBuilder.resulSets(resultSets);
????setStatementTimeout(timeout,?statementBuilder);

????setStatementParameterMap(parameterMap,?parameterType,?statementBuilder);
????setStatementResultMap(resultMap,?resultType,?resultSetType,?statementBuilder);
????setStatementCache(isSelect,?flushCache,?useCache,?currentCache,?statementBuilder);

????MappedStatement?statement?=?statementBuilder.build();
????configuration.addMappedStatement(statement);
????return?statement;
??}

最后回到我們的創(chuàng)建sqlSessionFactory上,之前的一切都是為了生成一個sqlSessionFactory服務(wù)的

public?SqlSessionFactory?build(InputStream?inputStream,?String?environment,?Properties?properties)?{
????try?{
??????XMLConfigBuilder?parser?=?new?XMLConfigBuilder(inputStream,?environment,?properties);
??????return?build(parser.parse());
????}?catch?(Exception?e)?{
??????throw?ExceptionFactory.wrapException("Error?building?SqlSession.",?e);
????}?finally?{
??????ErrorContext.instance().reset();
??????try?{
????????inputStream.close();
??????}?catch?(IOException?e)?{
????????//?Intentionally?ignore.?Prefer?previous?error.
??????}
????}
??}

??public?SqlSessionFactory?build(Configuration?config)?{
????return?new?DefaultSqlSessionFactory(config);
??}

從上面的代碼可以看出最后是通過以Configuration為參數(shù)build()方法生成DefautSqlSessionFactory。

第二步:創(chuàng)建sqlSession

?public?SqlSession?openSession()?{
????return?openSessionFromDataSource(configuration.getDefaultExecutorType(),?null,?false);
??}
private?SqlSession?openSessionFromDataSource(ExecutorType?execType,?TransactionIsolationLevel?level,?boolean?autoCommit)?{
????Transaction?tx?=?null;
????try?{
??????final?Environment?environment?=?configuration.getEnvironment();
??????final?TransactionFactory?transactionFactory?=?getTransactionFactoryFromEnvironment(environment);
??????tx?=?transactionFactory.newTransaction(environment.getDataSource(),?level,?autoCommit);
??????final?Executor?executor?=?configuration.newExecutor(tx,?execType);
??????return?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();
????}
??}
//返回一個SqlSession,默認(rèn)使用DefaultSqlSession
?public?DefaultSqlSession(Configuration?configuration,?Executor?executor,?boolean?autoCommit)?{
????this.configuration?=?configuration;
????this.executor?=?executor;
????this.dirty?=?false;
????this.autoCommit?=?autoCommit;
??}

executor在這一步得到創(chuàng)建,具體的使用在下一步。

第三步:執(zhí)行具體的sql請求

在我的代碼里執(zhí)行的是

User?user?=?sqlSession.selectOne("test.findUserById",?1);

具體到里面的方法就是

public??List?selectList(String?statement,?Object?parameter,?RowBounds?rowBounds)?{
????try?{
?????//1.根據(jù)Statement?Id,在mybatis?配置對象Configuration中查找和配置文件相對應(yīng)的MappedStatement
??????MappedStatement?ms?=?configuration.getMappedStatement(statement);
??????//2.?將查詢?nèi)蝿?wù)委托給MyBatis?的執(zhí)行器?Executor
??????List?result?=?executor.query(ms,?wrapCollection(parameter),?rowBounds,?Executor.NO_RESULT_HANDLER);
??????return?result;
????}?catch?(Exception?e)?{
??????throw?ExceptionFactory.wrapException("Error?querying?database.??Cause:?"?+?e,?e);
????}?finally?{
??????ErrorContext.instance().reset();
????}
??}

在這里通過statementId拿到了我們在第一步存在map里面的MappedStatement。在這里引用參考博客的一句話:

SqlSession根據(jù)Statement ID, 在mybatis配置對象Configuration中獲取到對應(yīng)的MappedStatement對象,然后調(diào)用mybatis執(zhí)行器來執(zhí)行具體的操作。

再繼續(xù)看query()和queryFromDatabase()這兩個方法

@SuppressWarnings("unchecked")
??public??List?query(MappedStatement?ms,?Object?parameter,?RowBounds?rowBounds,?ResultHandler?resultHandler,?CacheKey?key,?BoundSql?boundSql)?throws?SQLException?{
????ErrorContext.instance().resource(ms.getResource()).activity("executing?a?query").object(ms.getId());
????if?(closed)?throw?new?ExecutorException("Executor?was?closed.");
????if?(queryStack?==?0?&&?ms.isFlushCacheRequired())?{
??????clearLocalCache();
????}
????List?list;
????try?{
??????queryStack++;
??????list?=?resultHandler?==?null???(List)?localCache.getObject(key)?:?null;
??????if?(list?!=?null)?{
????????handleLocallyCachedOutputParameters(ms,?key,?parameter,?boundSql);
??????}?else?{
????????list?=?queryFromDatabase(ms,?parameter,?rowBounds,?resultHandler,?key,?boundSql);
??????}
????}?finally?{
??????queryStack--;
????}
????if?(queryStack?==?0)?{
??????for?(DeferredLoad?deferredLoad?:?deferredLoads)?{
????????deferredLoad.load();
??????}
??????deferredLoads.clear();?//?issue?#601
??????if?(configuration.getLocalCacheScope()?==?LocalCacheScope.STATEMENT)?{
????????clearLocalCache();?//?issue?#482
??????}
????}
????return?list;
??}
private??List?queryFromDatabase(MappedStatement?ms,?Object?parameter,?RowBounds?rowBounds,?ResultHandler?resultHandler,?CacheKey?key,?BoundSql?boundSql)?throws?SQLException?{
????List?list;
????localCache.putObject(key,?EXECUTION_PLACEHOLDER);
????try?{
??????list?=?doQuery(ms,?parameter,?rowBounds,?resultHandler,?boundSql);
????}?finally?{
??????localCache.removeObject(key);
????}
????localCache.putObject(key,?list);
????if?(ms.getStatementType()?==?StatementType.CALLABLE)?{
??????localOutputParameterCache.putObject(key,?parameter);
????}
????return?list;
??}

在這兩個方法里面會為當(dāng)前的查詢創(chuàng)建一個緩存key,如果緩存中沒有值,直接從數(shù)據(jù)庫中讀取,執(zhí)行查詢后將得到的list結(jié)果放入緩存之中。

緊接著看doQuery()在SimpleExecutor類中重寫的方法

public??List?doQuery(MappedStatement?ms,?Object?parameter,?RowBounds?rowBounds,?ResultHandler?resultHandler,?BoundSql?boundSql)?throws?SQLException?{
????Statement?stmt?=?null;
????try?{
??????Configuration?configuration?=?ms.getConfiguration();
??????StatementHandler?handler?=?configuration.newStatementHandler(wrapper,?ms,?parameter,?rowBounds,?resultHandler,?boundSql);
??????stmt?=?prepareStatement(handler,?ms.getStatementLog());
??????return?handler.query(stmt,?resultHandler);
????}?finally?{
??????closeStatement(stmt);
????}
??}

Statement連接對象就是在這里創(chuàng)建的,因此Executor的作用之一就是創(chuàng)建Statement了,創(chuàng)建完后又把Statement丟給StatementHandler返回List查詢結(jié)果。

接下來再看一下這里的兩個方法prepareStatement()和query()的具體實現(xiàn)

private?Statement?prepareStatement(StatementHandler?handler,?Log?statementLog)?throws?SQLException?{
????Statement?stmt;
????Connection?connection?=?getConnection(statementLog);
????stmt?=?handler.prepare(connection);
????handler.parameterize(stmt);
????return?stmt;
??}

public??List?query(Statement?statement,?ResultHandler?resultHandler)?throws?SQLException?{
????PreparedStatement?ps?=?(PreparedStatement)?statement;
????ps.execute();
????return?resultSetHandler.?handleResultSets(ps);
??}

prepareStatement()是創(chuàng)建Statement的具體實現(xiàn)方法,調(diào)用parameterize()對創(chuàng)建的Statement對象設(shè)置參數(shù),即為我們設(shè)為占位符的地方賦上指定的參數(shù),parameterize()方法再深入進(jìn)去就是調(diào)用ParameterHandler的setParameters()方法具體賦值了。

這里的query()是調(diào)用了ResultSetHandler的handleResultSets(Statement) 方法。作用就是把ResultSet結(jié)果集對象轉(zhuǎn)換成List類型的集合。

總結(jié)以上步驟就是:

  1. 根據(jù)具體傳入的參數(shù),動態(tài)地生成需要執(zhí)行的SQL語句,用BoundSql對象表示
  2. 為當(dāng)前的查詢創(chuàng)建一個緩存Key
  3. 緩存中沒有值,直接從數(shù)據(jù)庫中讀取數(shù)據(jù)
  4. 執(zhí)行查詢,返回List 結(jié)果,然后 將查詢的結(jié)果放入緩存之中
  5. 根據(jù)既有的參數(shù),創(chuàng)建StatementHandler對象來執(zhí)行查詢操作
  6. 將創(chuàng)建Statement傳遞給StatementHandler對象,調(diào)用parameterize()方法賦值
  7. 調(diào)用StatementHandler.query()方法,返回List結(jié)果集

總結(jié)

以上三個步驟所有流程大體可以用一張圖來總結(jié)

(END)

更多精彩:
有了這款可視化工具,Java 應(yīng)用性能調(diào)優(yōu)超簡單!
10k+點贊的 SpringBoot 后臺管理系統(tǒng)竟然出了詳細(xì)教程!
程序員 1024 刷屏漫畫,非常有趣!
求求你別再用System.out.println 了,有更好的選擇!
使用IntelliJ IDEA查看類圖,內(nèi)容極度舒適
關(guān)注公眾號,查看更多優(yōu)質(zhì)文章

最近,整理一份Java資料Java從0到1,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
獲取方式:關(guān)注公眾號并回復(fù)?Java?領(lǐng)取,更多Java內(nèi)容陸續(xù)奉上。
明天見(??ω??)??

瀏覽 54
點贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 91精品国产aⅴ一区二区| 爱视频福利网| 久久毛片| 日韩精品人妻中文字幕| 9i看片成人免费视频| 人妻av中文字幕| 精品五月天| 国产成人网站免费观看| 欧洲性爱视频在线观看| 日韩二级片| 一本久道综合| 91无码一区二区三区在线| 男人天堂网站| 黄频视频| 亚洲午夜福利电影| 国产不卡一区| 亚洲.欧美.丝袜.中文.综合| 亚洲AⅤ无码一区二区波多野按摩| 免费A级毛片在线播放不收费| 国产麻豆精品成人毛片| 欧美精品一区二区三区蜜臀| 木下凛凛子AV888AV在线观看| 青娱乐亚洲领先| 91美女网站| 国产又爽又黄在线看视频| 婷婷综合素质二区| 精品日逼| 欧美性成人| 日韩欧美成人网| AV天堂小说网| 久久精品综合| 免费射精一二三区| 国产福利视频在线观看| 黄色三级在线观看| 99综合在线| 青青草视频| 欧美偷拍精品| 中文在线字幕免费观| 好男人WWW社区在线视频夜恋| 日本黄在线看| 国产a毛一级,a毛一级| 欧美熟女性爱视频| 秋霞二区| MAD033_后宫秘密陶子.| 亚洲第一黄色| 天天久久综合| 天天操网站| 国产一二三| 东京热av在线| 黄色网页在线免费观看| 一道本无码在线观看| 欧美成人AA| 无码直播| 在线无码视频观看| 欧美XX888做受| 一区二区三区在线看| 黄色大片在线免费观看| 人成视频在线观看| 江苏妇搡BBBB搡BBB| 欧美亚洲一区| 久久这里只有| 大色欧美| 人人看人人摸人人操| 99国产在线视频| 欧美黄色电影网站| 一级黄片免费看| 欧美中文字幕| 日韩顶级毛片| 色色一级| 性猛交╳XXX乱大交| 黄色视频日韩| 小早川怜子精品一区二区| 一区二区人妻| 中文乱码在线观看| 人妻少妇精品视频一区二区三区| 人人肏人人射| 97香蕉久久夜色精品国产| 亚洲日韩精品欧美一区二区yw| 男女av在线观看| 精品成人Av一区二区三区| 亚洲中文视频免费| 欧美18禁| 操逼三级片| 色噜噜狠狠一区二区三区300部| 波多野结衣视频无码| 欧美色女人| 肏逼免费视频| 在线无码中文字幕| 国产久久久久久久久久| 五月天三级片| 影音先锋女人av噜噜色| 99久久婷婷国产综合精品漫| 欧美成人内射| www四虎| 人人鲁人人操| 狠狠干伊人| 美女黄色网| AV在线资源网| 人人看人人做| www.天天日| 国产777| AV天堂影视在线观看| 久久嫩草精品久久久久精| 亚洲日操| 国产激情内射| 亚洲无码一区二区三| 日韩欧美人妻无码精品| 亚洲AV黄色| 在线观看老湿视频福利| 人人操人人搞| 国产日韩在线视频| 91蝌蚪在线| 人人澡人人澡人人澡| 爱爱无码| 亚洲无码高清在线| 岛国A视频| 蜜桃视频成人版网站| 日韩3级片| 人人摸在线视频| 国产女人高潮毛片| 我要操影院| 亚洲中文字幕在线视频观看| 无码一区二区视频| 天天插天天插| 91性爱| 瘦精品无码一区二区三区四区五区六区七区八区 | 中文字幕久热| 国产一级片在线播放| 亚洲无码三区| 玩弄大乳乳妾高潮乳喷视频| 中国熟女视频| 亚洲美女网站免费观看网址| 亚洲插菊花综合网| 亚洲无码视频免费| 亚洲毛片视频| 乱婬妺妺躁爽A片| 欧美日韩在线免费观看| 国产在线一二三| 五月丁香激情四射| 成人丁香五月| 欧美精品日韩| 无码一区二区三区四| 久久在线视频| 日韩视频免费观看高清完整版在线观| 美日韩一级| 亚洲无码。| 国产视频激情| 97人妻精品一区二区三区视频| 国产偷拍网站| 国产福利在线视频| 久久福利网| 伊人伊人网| 涩五月婷婷| 日韩精品久久久久久久酒店| 日韩一级欧美一级| 免费在线成人网| 国产久视频| 欧美成人综合色| 亚洲无码AV一区二区| 欧美日韩精品一区| 成人自拍视频在线观看| 无码免费观看| 怡红院成人AV| 欧美一级成人| 69AV视频在线观看| 91色噜噜狠狠色婷婷| 日本黄色电影网站| 性爱AV| 亚洲手机在线播放| 亚洲午夜在线| 五月婷婷一区| 日韩三区| 嫖中国站街老熟女HD| 91在线成人电影| 俺操也| 欧美操操| 欧美夜夜草视频| 人人操人人干人人妻| 精品成人影视| 水蜜桃视频免费观看| 无码人妻一区二区三区| 色综合五月| 国产在线性爱视频| 黄色视频在线网站| 99啪啪| 三级片日本在线| 久久久久久久久久久国产精品| 91豆花成人社区| 丁香五月天社区| 国产成人AV网站| 操噜噜噜噜噜插| 一级片麻豆| 色吊丝中文字幕| 亚洲无码影片| 国产精品123区| 免费观看黄色一级片| 丰满人妻一区二区三区四区53| 激情伊人| 欧美综合激情| 91在线视频观看| 伊人大久久| 蜜臀久久99精品久久久久酒店更新时间| 青青草免费福利视频| 亚洲韩国国产| AV色图| 日韩成人一区二区三区| 黄片在线免费观看| 国产无遮挡又黄又爽又色视频软件| 无码动漫av| 激情av| 成人A毛片| 久操新在线| 内射熟妇| 骚逼av| 欧美自拍视频| 天天色色天天| 黄色亚洲视频| 日韩AAA在线| 动漫无码视频| 成人精品久久| 久操网站| 中文字幕国产综合| 91视频在| 91丨九色丨东北熟女| 天天色色婷婷| 亚洲免费视频一区| 久久久无码精品亚洲| 奶大丰满一乱一视频一区二区三区在| 免费看黄视频| 强伦轩人妻一区二区三区四区| 亚洲免费视频在线播放| 青娱乐亚洲精品视频| 97精品人妻一区二区| 国产午夜福利在线| 黑人干亚洲| 日韩a在线观看| 免费三级网站| 久操无码视频| 午夜人妻AV| 九九热免费视频| 中文字幕视频一区日日骚| 成人黄A片免费| 日韩高清无码电影| 国产6区| 婷婷五月天色播| 香蕉91视频| 亚洲精品成人av| 想要xx视频| 日本一级黄色电影| 久久水密桃| 风流老熟女一区二区三区| 怡春院在线| 毛片在线看片| 3d动漫精品一区二区三区在线观看 | 你懂的网站在线观看| www.bbbb| 高清无码视频直接看| 国产免费自拍视频| avcom无码| 蜜桃视频日韩| 日韩一级黄色| 国产精品探花熟女| 五月婷婷五月| 国产激情视频在线| 国产又爽又黄免费观看| 日韩欧美毛片| 91要爱爱| 午夜啪啪视频| 刘玥91精品一区二区三区| 激情五月天激情网| 婷婷亚洲色| 欧美三级长视频| 三级毛片在线| 五月激情丁香| 日本欧美中文字幕| 在线观看免费A片| 大香蕉伊人| 精品av在线观看| 久久久久久久性爱| 久久露脸国语精品国产91| 日韩久久网站| 婷婷五月天中文字幕| 亚洲综合99| 在线免费看a片| 69久久久久久久久久| 人与禽一级A片一区二区三区| 欧美黑吊大战白妞| 蜜桃传媒在线| 国产9熟妇视频网站| 日本操逼在线播放| 日韩欧美精品在线| 免费无码国产在线53| 精品国精品自拍自在线| 色欲一区| 操一线天逼| 2025av在线| 国产成人精品八戒| 一区电影网| 国产欧美精品一区二区| 色大香蕉伊人| 久久综合伊人777777| 国产一区二区三区18| 亚洲国产精品VA在线看黑人 | 女生被操网站| 中文字幕无码一区二区三区一本久| 粉嫩小泬BBBBBB免费| 一本视频| 国产乱子伦精品免费,| 青草社区在线观看| 亚洲色欲av| 精产国品一区二区区别| 欧美视频久久| 国产女人在线观看| 韩国无码中文| 黄色三级毛片| TokyoKot大交乱无码| 日韩精品三级| 狠狠色狠狠操| 国产AV日韩AV| 国产一区二区免费看| 国产嫩苞又嫩又紧AV在线| 懂色av| 亚洲伊人大香蕉| 日产久久视频| 久久久久久久9999| 青草视频在线播放| 一道本无码视频| 97碰碰碰| 蜜桃性视频| 九九九中文字幕| 人妖黃色一級A片| 欧美不卡一区二区三区| 中文字幕日韩欧美在线| 大香蕉伊人网站| 丁香激情视频| 亚洲欧洲AV| 免费日本A片| 国产精品99久久久久久成人| 成人a片在线免费观看| 无码一区二区三区四区五区六区 | 青青草原成人| 大香蕉美女视频| 噜噜噜在线| 狠狠干老司机| 国产黄色视频免费观看| 欧美日韩成人网| 五十路无码| 青草久久久久| 亚洲性爱视频在线观看| 亚洲无码av网站| 天天av天天av天天爽| 99re在线精品| 97人妻无码一区二区| 玖玖国产精品| 色婷婷狠狠| 精品久久无码| 在线观看黄色视频网站| 91黑人丨人妻丨国产丨| 搡BBBB搡BBBB搡BBB| 日韩日韩日韩日韩日韩| 色综合99| 97精品欧美91久久久久久久| 91大神久久| 成人无码区免费A片在线软件| 成人国产片女人爽到高潮| 亚洲黄色影视| 人人妻人人玩澡人人爽| 麻豆传媒免费观看| 国产精品黄| 99熟女| 欧美狠狠| 手机看片亚洲| 国产乱子伦日B视频| 成人精品免费无码毛片| 91在线无码精品秘国产三年| 中国熟女视频| 俺去久久| 二级黄色视频| 青娱乐超碰在线| 亚洲色图自拍| 人人妻人人草| 在线观看视频国产| 女侠吕四娘第二部| 婷婷狠狠干| 免费看A级片| 日本黄色视| 99r6热只有精品免费观看| 久久综合99| 国产深喉视频| 国产777| 久草手机视频在线观看| 亚洲影音先锋资源| 婷婷午夜精品久久久久久性色AV| 欧美日韩无| av在线免费播放| 免费无码一级A片大黄在线观看 | 人妖和人妖互交性XXXX视频 | 影音先锋成人无码| 久久精品国产亚洲AV麻豆痴男| 97精品在线视频| 豆花视频无码| 亚洲第一视频| 2026国产精品视频| 这里视频很精彩免费观看电视剧最新| 欧美婷婷五月天| 九九re精品视频在线观看| 麻豆av在线| 色欲欲www成人网站| 日韩无码久| 日韩国产中文字幕| 欧美性综合网| 精品无码国产一区二区三区51安| 四虎综合| 日韩欧美国产一区二区| 一道本在线视频| 欧美日韩性爱网站| 久久人操| 精品乱子伦一区二区三区免费播成| 欧美午夜电影| 伊人网在线观看| 五月丁香六月婷婷综合| 手机看片1024久久| 成人做爰A片一区二区| 熟女人妻在线观看| 久久久久久无码视频| 欧美日韩成人视频| 91热爆TS人妖系列| 美女黄色视频永费在线观看网站| 黄片视频在线免费观看| 免费观看一级毛一片| 白白操白白干| 欧美一级网| 18啪啪网站| AV天堂小说| 欧美AAA视频| 日日搔AV一区二区三区| 亚洲国产精品一区二区三区| 农村乱子伦毛片国产乱| 尤物视频在线观看视频| 六月丁香欧美综合| 青青自拍视频| 色综合久久88色综合| 2019中文字幕在线免费观看 | 日韩一页| 欧美精产国品一区二区区别| 成人在线黄片| 欧美日日| 超碰三级| 国产香蕉91| 操逼色| 午夜操逼视频| 五月琪琪| 亚洲AV永久无码国产精品久久 | 国产成人在线免费观看| 北条麻妃在线视频聊天| 性猛交AAAA片免费观看直播| 中文字幕免费在线观看| 超碰三级| 久久午夜无码鲁丝片主演是谁| 日韩无码不卡电影| 中日韩欧美一级A片免费| 91福利视频网站| 91成人A片| 亚洲美女喷水视频| 人人妻人人爽人人澡人人精品| 四川BBB嫩BBBB爽BBBB| 水蜜桃视频网站在线观看| 欧美一页| 黄片小视频在线观看| 亚洲午夜福利视频在线观看| 亚洲高清无码视频| 狠狠狠狠干| 成熟的国模冰莲[2]| 国产淫乱视频| 最近中文字幕免费mv第一季歌词強上 | 中文字幕H| 欧美日韩成人电影| 国产农村乱婬片A片AAA图片 | 少妇A片| 欧美一区二区丁香五月天激情 | 自拍偷拍免费| 七十路の高齢熟女千代子| 国产精品久久久大香蕉| 国产在线不卡年轻点的| 午夜不卡视频| 蜜桃亚洲AV无码一区二区三区 | 国产黄色在线观看| 色色影院| 最近日本中文字幕中文翻译歌词| 国产拍拍视频| 欧美成人性爱网| 人人妻人人玩人人澡人人爽| 俺也去射| 人妻少妇精品视频| 日韩中文字幕网站| 性爱av在线观看| 亚洲无码999| 欧美偷拍一区| 91国产视频在线播放| 国产一区无码| 日韩有码在线观看| 国产淫荡视频| 黄色成人视频网站| 国产操片| 久久草大香蕉| 欧美成人三级在线播放| 久久久久人| 午夜精品秘一区二区三区| 亚洲乱码日产精品BD在线观看| www.污污污| 秋霞网一区二区| 亚洲天堂中文字幕| AA黄色片| 亚洲精品国偷拍自产在线观看蜜桃| 精品网站| 国产探花视频在线免费观看| 国产伊人大香蕉| 日韩av在线电影| 日本黄色片在线播放| 51XX嘿嘿午夜| 欧美老妇另类| 久久国产片| 特一级黄色视频| 一级aa视频| 国产45页| 亚洲精品国产精品国自产在线| 国产精品久久久久精| 91久久无码一区人妻A片蜜桃| 日韩大屌操| 91无码人妻| 亚洲精品一二三区| 一本无码视频| 亚洲在线观看免费| 国内成人自拍| 成人自拍偷拍视频| 亚洲成人网在线| 国产视频999| 一级婬片A片AAAAA毛片| A级毛片网站| JUY-579被丈夫的上司侵犯后的第7天,我| 国产一级女婬乱免费看| 中文字幕99页| 91大神在线免费观看| 国产精品HongKong麻豆| 中文字字幕在线中文乱码电影| 91丨九色丨蝌蚪丨成人| 国产视频在线免费观看| av一卡二卡| 插菊花综合网亚洲| 午夜黄色视频| 香蕉婷婷| 日韩AV在线免费| 九九自拍视频| 三级片AV在线| 开心激情播播网| 刘玥91精品一区二区三区| 东京热av在线| 久久99精品久久久久久水蜜桃| 在线观看不卡av| 大香蕉伊人丁香五月| 亚洲有码中文字幕| 国产三级片在线视频| 亚洲日本国产| 日韩成人免费观看| 成人AV午夜福利| 大香蕉伊人网在线| 玩弄大乳乳妾高潮乳喷视频| 中文字幕综合| 波多野结衣成人在线| 中文字幕第315页| 欧美日韩无码视频| 成年人黄色视频| 在线观看中文字幕视频| 国精久久久久| 欧美激情综合| 99久久99九九99九九九| 黄片免费播放| 午夜资源网| 免费播放黄色成人片| AV在线小说| 美女视频一区二区三区| 亚洲AV无码专区一级婬片毛片 | 91香蕉在线观看| 亚洲AV无码成人| 免费成人黄色| 色色操| 不卡日本| 欧美久久电影| 亚洲一区二区黄色电影视频网站 | 手机免费AV| 最新日韩无码| 日韩视频区| 亚洲a电影| 乱伦一区二区三区| 按摩性高湖婬AAA片A片中国| 自拍三级| 亚洲第一综合网| 国产一级婬片A片免费妖精视频| 久草中文在线| 国产高清无码视频在线观看| 国产一二三| 欧美超碰在线| 怮交小拗女小嫩苞视频| 九九久热| 黄色不卡| 青青草黄色视频| 秋霞欧美在线| 欧美熟妇另类久久久久久不卡| 女人的天堂网| 国产乱伦熟女| 日韩操逼一区| 日本高清色清di免费观看| 天天综合久久| 精品视频在线免费观看| 在线中文字幕av| 色色五月天婷婷| 福利在线播放| 51精品国产| 老婆中文字幕乱码中文乱码| 四虎成人免费视频| 91成人视频在线免费观看| 青青免费在线视频| 黄色亚洲网站| 激情三区| 逼逼AV| 久久一级A片| 国产免费啪啪视频| 粉嫩AV在线| 波多野结衣99| 国产精品成人69| 日韩丰满人妻| 天干夜操| 北条麻妃在线播放一区| 国产亚洲视频完整在线观看| 丁香六月婷婷| 高清一区二区| 日韩一区二区在线观看| 在线观看黄色小视频| 成人黄片18| 亚洲第一av| 天堂中文网| 91在线小视频| 久久久久国产视频| 丝瓜视频| 中文字幕在线观看日韩| 日本精品二区| 国产成人精品在线| 亚洲成人日韩| 四川BBB搡BBB搡多人乱| 国产又爽又黄在线看| 俺来也俺也啪WWW色| 国产无套内射在线观看| 无卡无码| 91香蕉国产在线观看软件| 精品视频免费| 欧美成人三级在线| 国产在线观看无码免费视频 | 欧美亚洲| 精品国产三级| 先锋影音av在线| 老欧性老太色HD大全| 中文字幕在线观看免费高清完整版在线观看| 国产三级自拍视频| 黄色小视频免费看| 伊人网视频在线| 国产在线不卡| 成人免费无码| 韩国成人啪啪无码高潮| 亚洲性爱一区| 大香蕉精品| 波多野结衣一区| 中文字幕色| 天天色图| 人人摸人人看| 伊人在综合| 在线观看视频日韩| 亚洲日韩中文字幕无码| 自拍视频在线| 苍井空中文字幕在线观看| 一级a一级a爰片免费免免在线 | 巨爆乳肉感一区二区三区视频| 天天日天天操天天日| 欧美大胆视频| 不卡无码免费视频| 九热视频| 欧洲性爱视频在线观看| 大香蕉com| 欧美熟妇一区二区| 欧美性爱导航| 精品一区二区三区视频| 69国产精品成人无码视频色| 日一日干一干| 亚洲无码999| 中文字幕无码高清| 日本爱爱免费视频| 午夜性爱网| 青娱乐国产| 国产操B| 亚洲福利视频电影精| 最新AV在线播放| 91成人免费电影片| 美女少妇激情BBBB| 黄色不卡视频| 国产h在线播放| 午夜91| 成人aV无码精品国产一区二区 | 99热青青草| 中文字幕视频在线播放| 国产无码成人免费| 成人AV天堂| 国产精品操逼| 亚洲综合社区在线| 午夜免费播放观看在线视频| 亚洲视频456| 性欧美xxxx| 北条麻妃成人视频| 国产av在| 亚洲国产无码在线观看| 欧美高清无码视频| 东京热国产| 久热精品视频在线观看| 99爱视频| 美国无码黄片| 苍井空中文字幕在线观看| 天天看天天色| 黄色视频免费网站| 欧美精品亚洲| 中文字幕在线视频免费观看| 999免费视频| 婷婷网址| 天天爱天天射| 黄工厂精品视频在线播| 欧美日韩AV| 黄色视频大全在线观看| 亚洲精品伦理| 五月婷婷五月| 92丨九色丨偷拍老熟女| 久久久一区二区三区四区| 一级无码毛片| 丝瓜视频污APP| 无码网站内射| 激情久久综合| 国产嘿嘿| 超碰碰碰碰| 日本韩国无码| 内射视频在线观看| 人操人人| 特级毛片AAAAAA蜜桃| 中国老少配BBwBBwBBW| 7x7x7x人成免费观学生视频 | 激情五月天网址| 在线一区二区三区四区| 国产高清AV| 狠狠撸狠狠撸| 啊啊啊在线| 日韩综合在线观看| 北条麻妃被躁57分钟视频在线| 黄色影片在线观看| 久久久久久久久久久高清毛片一级| 日韩中文字幕在线视频| 黄色激情AV| 成人免费视频一区| 夜夜爽7777精品国产三级| 一道本无码在线观看| 东京热av在线| 欧美一级性爱| 亚洲AV第一页| 天天视频亚洲| 亚洲xx网| 国产美女一级真毛片酒店| 日本黄色一级| 国产又粗又大| 欧美特级毛片| 天堂成人av| 国产精品美女毛片j酒店| 激情五月天导航| 日韩中文字幕有码| 日本Sm/调教/捆绑/紧缚| 亚洲欧美日韩性爱| 操b视频在线免费观看| 久久久久性| 国产剧情在线| 一区二区AV| 久久99高清视频| 91嫖妓站街埯店老熟女| 国产视频在线免费观看| 日韩欧美成人视频| 男女av在线| 欧洲三级片网站| 日韩视频中文字幕在线| 中文字幕在线电影| 岛国A片| 亚洲天堂免费视频| 国产精品女人精品久久久天天| 日本一区中文字幕| 天天夜夜操| 久草婷婷| 99热在线播放| 国产婬片一级A片AAA毛片AⅤ | 中文字幕无码不卡| 亚洲无码在线高清| 大香蕉最新视频| 亚洲高清无码在线免费观看| 欧美五月婷婷| 国产操穴| 97伊人大香蕉| 日韩在线视频一区二区三区| 91亚洲国产成人精品一区| 亚洲无码成人电影| 成人无码99| 精品动漫一区二区三区| 天天插天天射| 99热9| 苍井空一区二区三区四区| 亚洲婷婷五月天| 51毛片| 国产无码AV大片| 狠狠se| 91蜜桃在线观看| 无码人妻av黄色一区二区三区| 日韩无任何视频在线观看| 男女一区二区三区| 婷婷五月天基地| 九九九精品视频| 午夜午夜福利理论片在线播放| 亚洲男女啪啪视频| 一级内射视频| 三级网址在线观看| 蜜臀AV成人| 2025国产在线| 久久91欧美特黄A片| 青青操逼| 国产精品人妻无码一区牛牛影视| 久久一区二区三区四区五区| a天堂视频| 最新久欠一区二区免费看| a免费在线| 亚洲激情黄色| AV资源在线| 亚洲天堂女人| 日韩欧美在线不卡| 中文字幕有码视频| 人妻无码在线观看| NP玩烂了公用爽灌满视频播放| 久色网站| 无套免费视频欧美| 久久综合17p| 亚洲三级电影| 日韩城人网站| 一级片国产| 91九色91蝌蚪91成人| 色婷婷精品| 国产一级在线免费观看| 欧一美一婬一伦一区二区三区自慰,| 精品人妻一区二区三区-国产精品 无码人妻av黄色一区二区三区 | 亚洲精品自拍偷拍| 色婷婷亚洲婷婷| 人操人人| 日韩黄色精品| 丝袜足交在线| 日韩一级在线| 男女啪啪啪网站| 亚洲456| 土耳其电影《爱与罚》| 一道本无码视频| 亚洲va欧洲va国产va不卡| 中文字幕三区| 丰满大爆乳波霸奶| 18禁av在线| 男女av在线| 欧美日韩三级在线| 久草福利网| 北条麻妃在线无码| 不卡日本| 97福利在线| 青娱乐三级在线免| 欧美污视频在线观看| 国产成人亚洲综合A∨婷婷| 国产一级美女操逼视频免费播放| 一级AAAAA片裸体做受| 成人看片黄a免费看视频| 久久电影五月天| 69国产精品视频免费观看| 欧美精品久久久久| 亚洲成人网站视频| 伊人免费成人视频| 色九九综合| 久久婷婷婷| 亚洲免费观看高清完整版在线观| 亚洲日韩视频在线观看| 日韩性生活| 亚洲精品久久久久久久久久久 | 91久久久久| 水多多成人免费A片| 亚洲精品人妻在线| 久久久久久久久久国产精品免费观看-百度 | 爱视频福利| 中国熟睡妇BBwBBw| 精品国产黄色| 艾操网|