色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

MyBatis-Plus代碼生成器實(shí)戰(zhàn):從數(shù)據(jù)庫(kù)表到CRUD代碼一鍵生成

MyBatis-Plus代碼生成器實(shí)戰(zhàn):從數(shù)據(jù)庫(kù)表到CRUD代碼一鍵生成 前陣子幫朋友維護(hù)一個(gè)老系統(tǒng)數(shù)據(jù)庫(kù)里二十多張表業(yè)務(wù)不算復(fù)雜但每張表都得配實(shí)體類、Mapper接口、XML、Service、ServiceImpl、Controller。一開(kāi)始我還挺有耐心手寫了四五張表以后實(shí)在頂不住全是機(jī)械重復(fù)的增刪改查真正要?jiǎng)幽X子的業(yè)務(wù)邏輯反而沒(méi)時(shí)間看。后來(lái)把MyBatis-Plus 代碼生成器也就是常說(shuō)的數(shù)據(jù)庫(kù)逆向工程接進(jìn)來(lái)從表結(jié)構(gòu)到可運(yùn)行的代碼一分鐘不到就能產(chǎn)出一套我把省下來(lái)的時(shí)間全花在業(yè)務(wù)優(yōu)化上。今天這篇就把我實(shí)際配置、跑通、二次改造的完整過(guò)程寫出來(lái)包括版本選擇的坑、連接串里的雷區(qū)、模板改造的細(xì)節(jié)以及生成之后必須處理的幾件收尾事。本文適合誰(shuí)看如果你正在用 MyBatis-Plus 寫后端接口或者項(xiàng)目里有一堆表等待建 CRUD又或者你之前試過(guò)動(dòng)軟、軟著代碼生成器這類老工具但覺(jué)得生成結(jié)果太死板、不好改這篇應(yīng)該能幫到你。我盡量把每個(gè)配置項(xiàng)背后的理由講清楚不光是給一段能跑的代碼而是讓你知道哪一項(xiàng)改了對(duì)結(jié)果有什么影響這樣你拿到自己的項(xiàng)目里也能靈活調(diào)整。1. 還在手寫CRUD的人值得重新認(rèn)識(shí)一下數(shù)據(jù)庫(kù)逆向工程1.1 從動(dòng)軟到MyBatis-Plus老派生成器為什么讓人又愛(ài)又恨如果你做過(guò)一段時(shí)間的后端開(kāi)發(fā)多少聽(tīng)過(guò)動(dòng)軟代碼生成器或者某些軟著申請(qǐng)配套用的代碼導(dǎo)出工具。這些工具在當(dāng)年確實(shí)解決了大批量建代碼的問(wèn)題連上數(shù)據(jù)庫(kù)選擇表點(diǎn)擊生成Controller、Model、DAL 一堆文件就出來(lái)了。但用過(guò)的同學(xué)大概率有同感生成的東西太重且太老模板結(jié)構(gòu)是固定的想加個(gè) Swagger 注解、想把主鍵策略換一下、想讓實(shí)體類繼承公共父類都要去翻生成器的配置界面試半天或者生成完手動(dòng)批量替換。更麻煩的是這類工具生成的代碼往往和項(xiàng)目里實(shí)際使用的框架版本脫節(jié)拿回來(lái)還要改依賴、改命名空間規(guī)模一大反而比手寫還累。MyBatis-Plus 代碼生成器是另一種思路它以依賴庫(kù)的形式直接寄生在你的項(xiàng)目里你寫一段 Java 配置去驅(qū)動(dòng)它生成結(jié)果天然貼合 MyBatis-Plus 的體系——實(shí)體類帶TableName、TableIdMapper 繼承BaseMapperService 繼承IServiceController 里直接注入IService調(diào)用現(xiàn)成方法。它不追求生成一套完整的三層架構(gòu)而是生成一套能被 MyBatis-Plus 直接驅(qū)動(dòng)的骨架。所以相比之下它的生成結(jié)果更輕、更貼合主流 Spring Boot 項(xiàng)目的習(xí)慣改起來(lái)也容易。1.2 逆向工程到底能替你做什么、不能替你做什么剛接觸代碼生成器的人容易把它想象成一個(gè)輸入數(shù)據(jù)庫(kù)、輸出整個(gè)項(xiàng)目的神器實(shí)際不是這樣。MyBatis-Plus 代碼生成器做的事本質(zhì)上只有一件讀取數(shù)據(jù)庫(kù)表結(jié)構(gòu)字段、類型、注釋、索引、主鍵翻譯成 Java 代碼文件。它能穩(wěn)定解決的是單表 CRUD 那 80% 的重復(fù)勞動(dòng)。它能替你做的我總結(jié)下來(lái)主要有這些根據(jù)表名和字段名生成實(shí)體類自動(dòng)把user_name轉(zhuǎn)成userName下劃線命名轉(zhuǎn)駝峰。根據(jù)主鍵類型生成對(duì)應(yīng)的TableId注解配置好自增或輸入型主鍵策略。生成 Mapper 接口和 XML 文件XML 里預(yù)留好ResultMap和基礎(chǔ)字段列表。生成 Service 接口與實(shí)現(xiàn)類自動(dòng)繼承IService/ServiceImpl自帶save、removeById、page等通用方法。生成 Controller提供一套最基礎(chǔ)的增刪改查 REST 接口。把數(shù)據(jù)庫(kù)字段注釋同步成實(shí)體類字段的 Javadoc代碼可讀性直接從零分拉到及格線。它不能替你做的也很明顯跨表復(fù)雜查詢、業(yè)務(wù)狀態(tài)流轉(zhuǎn)、權(quán)限校驗(yàn)、數(shù)據(jù)權(quán)限過(guò)濾這些還是要自己寫。所以我的建議是把生成器當(dāng)腳手架別把它當(dāng)業(yè)務(wù)引擎。它負(fù)責(zé)把地基和承重墻搭好里面的裝修和功能分區(qū)得自己來(lái)。2. 版本與依賴先把環(huán)境里的坑填平2.1 版本矩陣主框架與生成器版本號(hào)并不總是一一對(duì)應(yīng)我第一次用 MyBatis-Plus 代碼生成器時(shí)踩的坑就是版本號(hào)配錯(cuò)。項(xiàng)目里mybatis-plus-boot-starter用的是3.5.3.1我隨手找了一篇老文章把mybatis-plus-generator配成了3.5.1結(jié)果AutoGenerator類的 API 對(duì)不上編譯直接報(bào)錯(cuò)。后來(lái)才知道MyBatis-Plus 的主框架版本和代碼生成器版本是從某個(gè)版本開(kāi)始各自獨(dú)立演進(jìn)的生成器并不是跟著主框架的版本號(hào)走的。這里簡(jiǎn)單梳理一下版本演變的脈絡(luò)。在3.5.1及之前大家常見(jiàn)到的寫法是AutoGeneratorGlobalConfigDataSourceConfigPackageConfigStrategyConfig用鏈?zhǔn)?setter 來(lái)配置。到了3.5.2之后官方主推FastAutoGenerator配置方式從先 new 對(duì)象再逐步 set變成了create lambda 回調(diào)代碼更簡(jiǎn)潔。到我現(xiàn)在用的3.5.4/3.5.3這些版本里FastAutoGenerator已經(jīng)很穩(wěn)定了。我建議你自己項(xiàng)目里如果主框架是3.5.x直接上FastAutoGenerator別再用老的AutoGenerator。如果主框架還是3.4.x那生成器也得跟著用對(duì)應(yīng)老版本否則啟動(dòng)時(shí)可能出現(xiàn)方法找不到之類的兼容問(wèn)題。這里提供一個(gè)我測(cè)試過(guò)的版本組合dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-generator/artifactId version3.5.3/version /dependency dependency groupIdorg.freemarker/groupId artifactIdfreemarker/artifactId version2.3.32/version /dependency注意最后那個(gè)freemarker這是模板引擎依賴。生成器本身不內(nèi)置模板引擎官方默認(rèn)使用的是 Velocity但如果你的項(xiàng)目里沒(méi)有引入 Velocity運(yùn)行時(shí)會(huì)報(bào)找不到模板引擎相關(guān)的類。我習(xí)慣用 Freemarker因?yàn)樗哪0逭Z(yǔ)法我相對(duì)熟而且 Spring Boot 項(xiàng)目里很多時(shí)候已經(jīng)依賴了它不會(huì)有沖突。如果你要用 Velocity就引入velocity-engine-core用 Beetl 就引入beetl。這步最容易漏漏了之后生成器代碼本身能編譯一運(yùn)行就報(bào)錯(cuò)。2.2 數(shù)據(jù)庫(kù)連接串里的隱藏雷區(qū)驅(qū)動(dòng)、時(shí)區(qū)與 nullCatalogMeansCurrent搞定 Maven 依賴之后第二個(gè)大坑出現(xiàn)在數(shù)據(jù)庫(kù)連接串上。生成器要連數(shù)據(jù)庫(kù)讀表結(jié)構(gòu)這一步跑不通后面全是空談。首先要確認(rèn) MySQL 驅(qū)動(dòng)版本。MySQL 5.x 用的是com.mysql.jdbc.Driver但新版 MySQL 驅(qū)動(dòng)已經(jīng)把老驅(qū)動(dòng)類標(biāo)記過(guò)時(shí)換個(gè) MySQL 8.x 版本就要改成com.mysql.cj.jdbc.Driver。我的習(xí)慣是直接用com.mysql.cj.jdbc.Driver配合mysql-connector-j8.x 驅(qū)動(dòng)不管連 MySQL 5.7 還是 8.0 都能跑。如果你用的是連接池包驅(qū)動(dòng)類名照抄就行不用額外處理。然后是連接串的 URL 參數(shù)。一個(gè)比較常規(guī)的示例是jdbc:mysql://127.0.0.1:3306/my_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghainullCatalogMeansCurrenttrue這里幾個(gè)參數(shù)缺一不可useSSLfalse不關(guān)掉 SSL 握手某些環(huán)境下連接會(huì)非常慢甚至超時(shí)。生成器本來(lái)是一次性工具能少一事是一事。serverTimezoneAsia/ShanghaiMySQL 8.x 驅(qū)動(dòng)強(qiáng)制要求設(shè)置時(shí)區(qū)不設(shè)就會(huì)報(bào)The server time zone value ... is unrecognized代碼根本跑不起來(lái)。nullCatalogMeansCurrenttrue這是個(gè)冷門參數(shù)但建議從一開(kāi)始就加上。它解決的是連接串里指定了數(shù)據(jù)庫(kù)名之后驅(qū)動(dòng)在讀取表清單時(shí)把catalog當(dāng)成 null導(dǎo)致去讀系統(tǒng)庫(kù)比如information_schema或其它你有權(quán)限的庫(kù)的表生成出一堆莫名其妙的表。加上這個(gè)參數(shù)驅(qū)動(dòng)會(huì)更嚴(yán)格地按照連接串里的庫(kù)名去讀取避免明明只想生成用戶表結(jié)果把系統(tǒng)表也掃進(jìn)來(lái)的情況。還有一個(gè)隱藏問(wèn)題生成器對(duì) MySQL 8 和 MySQL 5 的元數(shù)據(jù)讀取方式有差異如果你用的是 MySQL 5.6連接串里serverTimezone參數(shù)可能反而不被識(shí)別那就要看驅(qū)動(dòng)版本必要時(shí)降級(jí)驅(qū)動(dòng)??傊劝羊?qū)動(dòng)和連接參數(shù)對(duì)齊再往下配生成器。3. FastAutoGenerator核心配置拆解每一項(xiàng)設(shè)置都帶著理由3.1 全局配置從代碼風(fēng)格到注釋歸屬配置代碼寫起來(lái)不復(fù)雜但每一項(xiàng)的含義和影響范圍值得逐一看清楚。我先把一個(gè)完整的FastAutoGenerator示例放出來(lái)后面再拆開(kāi)講FastAutoGenerator.create( jdbc:mysql://127.0.0.1:3306/my_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghainullCatalogMeansCurrenttrue, root, 123456) .globalConfig(builder - { builder.author(shipan) // 作者名會(huì)寫到類注釋里 .enableSwagger() // 生成 Swagger 注解 .dateType(DateType.TIME_PACK) // 時(shí)間類型用 java.time 包 .commentDate(yyyy-MM-dd) // 生成注釋里的日期格式 .outputDir(System.getProperty(user.dir) /src/main/java); }) .packageConfig(builder - { builder.parent(com.example.demo) .moduleName(system) .entity(entity) .mapper(mapper) .service(service) .serviceImpl(service.impl) .controller(controller) .pathInfo(Collections.singletonMap( OutputFile.xml, System.getProperty(user.dir) /src/main/resources/mapper)); }) .strategyConfig(builder - { builder.addInclude(sys_user, sys_role, sys_user_role) .addTablePrefix(sys_) .entityBuilder() .enableLombok() .logicDeleteColumnName(deleted) .versionColumnName(version) .enableTableFieldAnnotation() .controllerBuilder() .enableRestStyle() .formatFileName(%sController); }) .execute();globalConfig里的author會(huì)直接進(jìn)到每個(gè)類的 Javadoc 注釋里團(tuán)隊(duì)協(xié)作時(shí)建議寫真實(shí)姓名或工號(hào)方便追溯。enableSwagger()開(kāi)不開(kāi)取決于項(xiàng)目里是否已經(jīng)集成了 Swagger/OpenAPI如果集成了就開(kāi)生成的實(shí)體類字段上會(huì)自動(dòng)加ApiModelPropertyController 方法上會(huì)加ApiOperation如果項(xiàng)目里沒(méi)集成 Swagger開(kāi)了反而編譯不過(guò)。dateType(DateType.TIME_PACK)是我個(gè)人的偏好把Date替換成LocalDateTime現(xiàn)代項(xiàng)目基本都是這個(gè)約定避免一堆Date類型在時(shí)間格式化上反復(fù)踩坑。commentDate控制的是類注釋里since 2025-01-01這種日期的格式默認(rèn)帶時(shí)間分秒我改成純?nèi)掌诟蓛粢稽c(diǎn)。3.2 包名與模塊劃分決定代碼長(zhǎng)在哪棵樹(shù)上packageConfig最大的作用是決定代碼生成到哪個(gè)包下面。很多人只配置了parent沒(méi)配置moduleName結(jié)果所有類都直接堆在com.example.demo下面項(xiàng)目結(jié)構(gòu)立刻變成一鍋粥。我的做法是parent寫項(xiàng)目的根包moduleName寫當(dāng)前模塊或業(yè)務(wù)域的名字比如system、order、user這樣生成的類會(huì)落在com.example.demo.system.entity、com.example.demo.system.mapper這類路徑下一個(gè)業(yè)務(wù)域一個(gè)包找代碼和做權(quán)限控制都方便。還有個(gè)細(xì)節(jié)容易忽略entity、mapper、service、serviceImpl、controller這些子包名默認(rèn)是英文如果你們團(tuán)隊(duì)有自己約定比如用model、dao、manager代替默認(rèn)名稱也可以在這里改。真正決定輸出路徑的是包名 Java 源碼目錄所以不要只改子包名而忘了確認(rèn)最后的輸出目錄是否在src/main/java下。特別要提的是pathInfo這一項(xiàng)。默認(rèn)情況下生成的 XML 文件會(huì)放在src/main/java對(duì)應(yīng)的包目錄里這不符合 Maven 工程的約定。正常的 XML 應(yīng)該放在src/main/resources/mapper下。所以必須用pathInfo把OutputFile.xml指向資源目錄否則后續(xù) MyBatis 掃描 XML 時(shí)會(huì)找不到文件。這是我每次配置必寫的一項(xiàng)而且它只影響 XML 的輸出位置不改變 Mapper 接口的包名兩者互不影響。3.3 策略配置收窄生成范圍保留擴(kuò)展余地strategyConfig是整個(gè)生成器里最需要花心思的部分。第一件事是明確要生成哪些表。addInclude就是白名單只生成指定的表。為什么不直接全庫(kù)生成因?yàn)楹芏鄻I(yè)務(wù)庫(kù)里會(huì)有各種歷史表、臨時(shí)表、統(tǒng)計(jì)表這些表根本不需要生成 CRUD 代碼全庫(kù)生成會(huì)制造一堆垃圾類。用addInclude收窄范圍每次跑生成器之前先想清楚這次要?jiǎng)幽男┍泶a產(chǎn)出可控。特殊情況下可以用addExclude排除表但我印象里用白名單比黑名單理性因?yàn)槟阍谡f(shuō)我只要這些而不是除了這些我都要。addTablePrefix(sys_)表示生成實(shí)體類時(shí)去掉sys_前綴。比如表名sys_user生成的實(shí)體類是User而不是SysUser。這個(gè)前綴設(shè)計(jì)在大型項(xiàng)目里比較常見(jiàn)表名用統(tǒng)一前綴做業(yè)務(wù)域隔離但 Java 類名里不需要這個(gè)前綴。如果你的表已經(jīng)叫user_info沒(méi)有多余前綴那addTablePrefix就不加讓user_info直接轉(zhuǎn)成UserInfo即可。entityBuilder下面的幾項(xiàng)也值得說(shuō)說(shuō)。enableLombok()開(kāi)啟后生成的實(shí)體類上會(huì)加Data注解不生成一堆 getter/setter 方法代碼立刻簡(jiǎn)潔一個(gè)量級(jí)前提是項(xiàng)目里已經(jīng)引入了 Lombok 依賴否則編譯報(bào)錯(cuò)。logicDeleteColumnName(deleted)指定表里的邏輯刪除字段名生成器會(huì)在實(shí)體類對(duì)應(yīng)字段上自動(dòng)加TableLogic注解這樣走 MyBatis-Plus 的通用刪除方法時(shí)就會(huì)自動(dòng)改成update語(yǔ)句而不是delete語(yǔ)句這是線上系統(tǒng)不能省的安全底線。versionColumnName(version)指定樂(lè)觀鎖版本字段生成的字段上會(huì)帶Version配合后續(xù)配置的樂(lè)觀鎖插件就能實(shí)現(xiàn)并發(fā)更新的安全控制。enableTableFieldAnnotation()比較容易被忽略。開(kāi)啟后實(shí)體類每個(gè)字段上都會(huì)加TableField(列名)雖然 MyBatis-Plus 默認(rèn)也能根據(jù)駝峰轉(zhuǎn)下劃線自動(dòng)映射但顯式標(biāo)注可以避免字段名里出現(xiàn)特殊詞、多詞縮寫時(shí)映射錯(cuò)亂。代價(jià)是代碼稍微啰嗦一點(diǎn)但穩(wěn)妥性更好。我傾向于開(kāi)啟尤其是在接手老表、字段命名不規(guī)范的情況下這個(gè)注解等于一個(gè)保護(hù)罩。最后是controllerBuilder部分。enableRestStyle()讓生成的 Controller 自動(dòng)加RestController而不是Controller省得每生成完一批代碼還手動(dòng)改一個(gè)注解formatFileName(%sController)控制類名格式默認(rèn)就是UserController這種一般不用改但如果你不喜歡 Controller 后綴也可以改成%sApi之類。3.4 數(shù)據(jù)源配置選擇目標(biāo)庫(kù)的正確姿勢(shì)可能有人會(huì)問(wèn)FastAutoGenerator.create(url, username, password)不是已經(jīng)寫了連接信息嗎為什么還要單獨(dú)配置數(shù)據(jù)源原因在于create方法接受的是最簡(jiǎn)單的基礎(chǔ)連接參數(shù)而dataSourceConfig允許你指定更細(xì)的數(shù)據(jù)庫(kù)類型、驅(qū)動(dòng)類名以及自定義數(shù)據(jù)庫(kù)類型轉(zhuǎn)換規(guī)則。對(duì)于大部分單數(shù)據(jù)源項(xiàng)目直接create(url, username, password)就夠了。但如果你連接的是 PostgreSQL、Oracle 或者 SQLServer推薦用dataSourceConfig顯式聲明FastAutoGenerator.create( new DataSourceConfig.Builder(url, username, password) .databaseQueryClass(SqlQuery.class) // 默認(rèn)根據(jù) url 判斷一般不用手動(dòng)指定 .typeConvert(new MySqlTypeConvert()) .build() )實(shí)際項(xiàng)目中我用得最多的是默認(rèn)行為。只有當(dāng)數(shù)據(jù)庫(kù)驅(qū)動(dòng)無(wú)法被自動(dòng)識(shí)別或者字段類型映射不符合預(yù)期的時(shí)候才需要顯式去改。比如 MySQL 的tinyint(1)在某些版本里會(huì)被映射成Boolean但業(yè)務(wù)上可能希望映射成Integer這時(shí)就需要自定義typeConvert來(lái)處理。這個(gè)屬于進(jìn)階玩法新手可以先跳過(guò)等遇到具體問(wèn)題再回來(lái)調(diào)。4. 從建表到出代碼一次完整逆向工程演示4.1 準(zhǔn)備一張覆蓋常見(jiàn)場(chǎng)景的業(yè)務(wù)表光講配置不落地看完還是不會(huì)用。我拿一張實(shí)際業(yè)務(wù)表跑一遍完整流程你可以照著建表、照著生成然后對(duì)比結(jié)果。假設(shè)我們要生成一個(gè)系統(tǒng)用戶相關(guān)的代碼表結(jié)構(gòu)如下CREATE TABLE sys_user ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主鍵ID, username varchar(50) NOT NULL COMMENT 用戶名, password varchar(100) NOT NULL COMMENT 密碼, nickname varchar(50) DEFAULT NULL COMMENT 昵稱, email varchar(100) DEFAULT NULL COMMENT 郵箱, phone varchar(20) DEFAULT NULL COMMENT 手機(jī)號(hào), status tinyint(1) DEFAULT 1 COMMENT 狀態(tài)1啟用 0禁用, deleted tinyint(1) DEFAULT 0 COMMENT 邏輯刪除標(biāo)記0未刪除 1已刪除, version int(11) DEFAULT 0 COMMENT 樂(lè)觀鎖版本號(hào), remark varchar(500) DEFAULT NULL COMMENT 備注, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 創(chuàng)建時(shí)間, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新時(shí)間, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT系統(tǒng)用戶表;注意我在建表時(shí)把每個(gè)字段的COMMENT都寫清楚了。這一步非常關(guān)鍵因?yàn)樯善鲿?huì)把字段注釋直接變成實(shí)體類字段的 Javadoc。如果建表的時(shí)候圖省事不寫注釋生成的實(shí)體類是干干凈凈的后面看代碼的人只能去翻數(shù)據(jù)庫(kù)體驗(yàn)極差。好的表結(jié)構(gòu)是好代碼的第一步這句話在代碼生成器場(chǎng)景下體現(xiàn)得淋漓盡致。這張表里涵蓋了常用的字段類型主鍵bigint自增、字符串、整數(shù)、布爾、日期時(shí)間還有邏輯刪除字段deleted和樂(lè)觀鎖字段version生成的代碼能覆蓋絕大多數(shù)后端 CRUD 場(chǎng)景。4.2 運(yùn)行生成器與產(chǎn)出文件配置沿用上一節(jié)的完整示例我這里把實(shí)際跑起來(lái)的main方法貼完整方便你直接復(fù)制修改public class CodeGenerator { public static void main(String[] args) { String url jdbc:mysql://127.0.0.1:3306/my_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghainullCatalogMeansCurrenttrue; String username root; String password 123456; FastAutoGenerator.create(url, username, password) .globalConfig(builder - { builder.author(shipan) .enableSwagger() .dateType(DateType.TIME_PACK) .commentDate(yyyy-MM-dd) .outputDir(System.getProperty(user.dir) /src/main/java); }) .packageConfig(builder - { builder.parent(com.example.demo) .moduleName(system) .entity(entity) .mapper(mapper) .service(service) .serviceImpl(service.impl) .controller(controller) .pathInfo(Collections.singletonMap( OutputFile.xml, System.getProperty(user.dir) /src/main/resources/mapper)); }) .strategyConfig(builder - { builder.addInclude(sys_user) .addTablePrefix(sys_) .entityBuilder() .enableLombok() .logicDeleteColumnName(deleted) .versionColumnName(version) .enableTableFieldAnnotation() .controllerBuilder() .enableRestStyle() .formatFileName(%sController) .mapperBuilder() .enableBaseColumnList() .enableBaseResultMap(); }) .execute(); } }運(yùn)行后項(xiàng)目src/main/java下會(huì)多出這些文件src/main/java/com/example/demo/system/ ├── controller/ │ └── UserController.java ├── entity/ │ └── User.java ├── mapper/ │ └── UserMapper.java ├── service/ │ ├── UserService.java │ └── impl/ │ └── UserServiceImpl.java src/main/resources/mapper/ └── UserMapper.xml注意UserMapper.xml被我手動(dòng)指定到了src/main/resources/mapper下而不是默認(rèn)的src/main/java。這是很多人在生成完代碼后出現(xiàn)Invalid bound statement報(bào)錯(cuò)的主要原因路徑不對(duì)MyBatis 找不到對(duì)應(yīng)的 SQL 映射文件所以從配置階段就得把它掰到正確的位置。4.3 查看生成的代碼哪些直接用哪些要?jiǎng)邮指纳赏暌院笪覀兿瓤纯磳?shí)體類長(zhǎng)什么樣。下面是生成的User.java核心內(nèi)容Data EqualsAndHashCode(callSuper false) TableName(sys_user) ApiModel(value User對(duì)象, description 系統(tǒng)用戶表) public class User implements Serializable { private static final long serialVersionUID 1L; ApiModelProperty(主鍵ID) TableId(value id, type IdType.AUTO) private Long id; ApiModelProperty(用戶名) TableField(username) private String username; ApiModelProperty(密碼) TableField(password) private String password; ApiModelProperty(狀態(tài)1啟用 0禁用) TableField(status) private Integer status; ApiModelProperty(邏輯刪除標(biāo)記0未刪除 1已刪除) TableField(deleted) TableLogic private Integer deleted; ApiModelProperty(樂(lè)觀鎖版本號(hào)) TableField(version) Version private Integer version; ApiModelProperty(創(chuàng)建時(shí)間) TableField(value create_time, fill FieldFill.INSERT) private LocalDateTime createTime; ApiModelProperty(更新時(shí)間) TableField(value update_time, fill FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; }這里有幾個(gè)點(diǎn)需要你留意。一是createTime和updateTime自動(dòng)加了fill FieldFill.INSERT和fill FieldFill.INSERT_UPDATE這是 MyBatis-Plus 的自動(dòng)填充注解。如果要生效你還得自己在項(xiàng)目里配置一個(gè)MetaObjectHandler實(shí)現(xiàn)類在插入和更新時(shí)統(tǒng)一填寫這兩個(gè)字段。不配置的話注解加了也白加數(shù)據(jù)庫(kù)里的時(shí)間字段如果本身有默認(rèn)值CURRENT_TIMESTAMP倒也能跑但如果你想讓代碼統(tǒng)一維護(hù)時(shí)間就得補(bǔ)上這個(gè) Handler。二是UserMapper接口里只繼承了BaseMapperUser但 XML 文件里已經(jīng)生成了ResultMap和基礎(chǔ)的selectByExample類似的結(jié)構(gòu)。這里提示你如果沒(méi)有特殊 SQLMapper 接口和 XML 其實(shí)可以精簡(jiǎn)但因?yàn)?XML 里保存了最完整的字段列信息后續(xù)寫聯(lián)表查詢時(shí)可以直接復(fù)制字段清單所以建議保留。三是UserController生成的是一套最原始的 CRUD 接口比如RestController RequestMapping(/system/user) Api(tags 系統(tǒng)用戶表) public class UserController { Autowired private UserService userService; PostMapping public Result save(RequestBody User user) { ... } DeleteMapping(/{id}) public Result delete(PathVariable Long id) { ... } GetMapping(/{id}) public Result getUser(PathVariable Long id) { ... } GetMapping public Result list(RequestParam(defaultValue 1) Integer current, RequestParam(defaultValue 10) Integer size, User user) { ... } }這段代碼能跑但離能上線還差得遠(yuǎn)事務(wù)、數(shù)據(jù)權(quán)限、參數(shù)校驗(yàn)、日志、實(shí)際的分頁(yè)查詢條件都要自己補(bǔ)。我的定位是Controller 生成出來(lái)當(dāng)接口骨架參考或給內(nèi)部管理后臺(tái)用真正對(duì)外的業(yè)務(wù)接口還是要手工精寫。而實(shí)體類、Mapper、Service 這三層生成完成度很高基本可以原樣使用。5. 改模板比改代碼更劃算自定義生成模板的實(shí)戰(zhàn)5.1 把官方模板摳出來(lái)改成自己的代碼生成器默認(rèn)的模板功能很全但不可能滿足所有團(tuán)隊(duì)的定制需求。比如有的團(tuán)隊(duì)要求實(shí)體類必須繼承一個(gè)BaseEntity有的要求在 Controller 的每個(gè)方法上加PreAuthorize權(quán)限注解有的要求在 Mapper 接口里追加自定義查詢方法。這些需求如果生成完再手動(dòng)改每張表都要改一遍太痛苦。正確做法是改模板讓生成的結(jié)果從一開(kāi)始就符合團(tuán)隊(duì)規(guī)范。模板文件在哪如果你用的是 Freemarker模板文件就在mybatis-plus-generator的 jar 包里的/templates目錄下。文件命名大概是這樣entity.java.ftl、mapper.java.ftl、service.java.ftl、serviceImpl.java.ftl、controller.java.ftl、mapper.xml.ftl。你可以從本地的 Maven 倉(cāng)庫(kù)把依賴 jar 解壓出來(lái)把需要的模板文件復(fù)制到項(xiàng)目src/main/resources/templates目錄下再按需修改。然后在生成器配置里加一段讓代碼生成器使用你的自定義模板.templateConfig(builder - { builder.entity(/templates/entity.java.ftl) .controller(/templates/controller.java.ftl) .mapper(/templates/mapper.java.ftl) .service(/templates/service.java.ftl) .serviceImpl(/templates/serviceImpl.java.ftl) .xml(/templates/mapper.xml.ftl); })5.2 在實(shí)體模板里埋入 Swagger 與專屬注解舉個(gè)我自己改過(guò)的例子。項(xiàng)目里實(shí)體類要統(tǒng)一加一個(gè)ApiModel注解并且要在類注釋里記錄對(duì)應(yīng)的表名和表注釋。我改entity.java.ftl模板在類定義位置加入#if swagger ApiModel(value ${entity}對(duì)象, description ${table.comment!}) /#if TableName(${table.name}) Data public class ${entity} implements Serializable { private static final long serialVersionUID 1L; #list table.fields as field #if field.comment!?length gt 0 /** * ${field.comment} */ /#if #if swagger ApiModelProperty(value ${field.comment}) /#if TableField(${field.name}) private ${field.propertyType} ${field.propertyName}; /#list }模板里用到的${entity}、${table.name}、${field.propertyName}這些變量是生成器內(nèi)部渲染模板時(shí)上下文中提供的。如果你不熟悉模板語(yǔ)法先大致理解成占位符 條件判斷即可改的時(shí)候主要關(guān)注 HTML 標(biāo)簽之外的那幾行 Java 結(jié)構(gòu)是否滿足需求。這里最關(guān)鍵的是模板文件的存放路徑和配置里的builder.entity(...)路徑必須一致否則會(huì)靜默使用默認(rèn)模板你改了半天的東西根本不生效。另一個(gè)常見(jiàn)的模板改造是把TableId的主鍵策略改成指定類型。默認(rèn)生成器會(huì)根據(jù)數(shù)據(jù)庫(kù)主鍵判斷IdType.AUTO但如果你用的是分布式 ID比如雪花算法可以在模板里強(qiáng)制寫出TableId(value id, type IdType.ASSIGN_ID)。這樣生成出來(lái)的實(shí)體類新增數(shù)據(jù)時(shí)即使不手動(dòng)設(shè)置idMyBatis-Plus 也會(huì)幫你生成一個(gè)雪花 ID很省心。5.3 裁剪輸出不需要的東西不生成模板改造解決的是生成的不夠好的問(wèn)題還有一類需求是生成得太多了。比如很多內(nèi)部接口根本不需要 XML 文件或者單表操作完全不需要 Service 層哪些代碼不生成可以直接在strategyConfig里關(guān)掉.strategyConfig(builder - { builder.serviceBuilder().formatServiceFileName(%sService) .controllerBuilder().enableRestStyle() .mapperBuilder().enableBaseResultMap(); })更徹底一點(diǎn)可以通過(guò)templateConfig把某個(gè)模板置空.templateConfig(builder - { builder.xml(null); })這樣生成之后 XML 文件就不會(huì)出現(xiàn)。我遇到的情況是項(xiàng)目里允許 MyBatis-Plus 的BaseMapper直接提供單表 CRUD確實(shí)沒(méi)有必要為每張表都放一個(gè) XML 文件。只有那些包含復(fù)雜 SQL 的表才需要單獨(dú)生成 XML 并手工加工。所以我在團(tuán)隊(duì)里的默認(rèn)做法是先不關(guān) XML等確認(rèn)表里不需要復(fù)雜 SQL 了再刪掉 XML避免后期排查問(wèn)題少一個(gè)環(huán)節(jié)。你可以根據(jù)自己項(xiàng)目的口味來(lái)習(xí)慣極簡(jiǎn)就關(guān)掉習(xí)慣保守就留著。6. 生成之后的必修課掃描、XML、邏輯刪除與分頁(yè)6.1 Mapper掃描與XML路徑最常見(jiàn)的兩個(gè)啟動(dòng)報(bào)錯(cuò)代碼生成完不代表項(xiàng)目能直接起來(lái)我見(jiàn)過(guò)太多人激動(dòng)地跑main生成完代碼一啟動(dòng) Spring Boot 就報(bào)錯(cuò)然后一臉懵。最典型的兩個(gè)錯(cuò)誤都跟 Mapper 相關(guān)。第一個(gè)是 Mapper 接口沒(méi)被掃描到。生成出來(lái)的UserMapper只是普通接口它要實(shí)現(xiàn) MyBatis 的動(dòng)態(tài)代理必須被 Spring 容器掃描到。兩種常見(jiàn)處理方式在啟動(dòng)類上加MapperScan(com.example.demo.**.mapper)或者在每個(gè) Mapper 接口上標(biāo)Mapper。我個(gè)人推薦MapperScan因?yàn)橐粡埍硪粋€(gè)注解太啰嗦還容易漏。如果你生成的包名里有moduleName記得把掃描路徑寫對(duì)比如com.example.demo.system.mapper。第二個(gè)是 XML 文件位置不對(duì)或沒(méi)被加載。Spring Boot 項(xiàng)目里MyBatis-Plus 默認(rèn)會(huì)去classpath*:/mapper/**/*.xml找 XML 文件。如果你用上面的路徑配置生成在src/main/resources/mapper下那默認(rèn)就能被掃描到。如果你的 XML 放在別處或者明明放在resources目錄卻沒(méi)生效多半是應(yīng)用配置里缺少這一段mybatis-plus: mapper-locations: classpath*:mapper/**/*.xml type-aliases-package: com.example.demo.system.entitytype-aliases-package配置好之后XML 里的resultType、parameterType可以用短類名不用寫全限定名是個(gè)好習(xí)慣。6.2 邏輯刪除、樂(lè)觀鎖、分頁(yè)插件不配好等于半殘生成器把TableLogic和Version寫在實(shí)體類上了但如果你沒(méi)在 MyBatis-Plus 配置里注冊(cè)對(duì)應(yīng)的攔截器這兩個(gè)注解的作用其實(shí)是部分生效。邏輯刪除比較特殊TableLogic只要在字段上標(biāo)了MyBatis-Plus 的通用刪除方法就會(huì)自動(dòng)改成邏輯刪除不需要額外插件。但有個(gè)細(xì)節(jié)邏輯刪除的全局配置和字段默認(rèn)值的對(duì)齊。你在實(shí)體類上標(biāo)了TableLogic如果刪除時(shí)沒(méi)有在 SQL 里設(shè)置刪除值默認(rèn)是 1未刪除是 0數(shù)據(jù)庫(kù)里也得跟模板保持一致的約定。更穩(wěn)妥的方式是在application.yml里顯式聲明mybatis-plus: global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0這樣即使實(shí)體類忘了標(biāo)TableLogic只要字段名匹配MyBatis-Plus 也會(huì)自動(dòng)識(shí)別。樂(lè)觀鎖就需要顯式注冊(cè)插件了。在配置類里加一個(gè)MybatisPlusInterceptorBeanBean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; }這里我把OptimisticLockerInnerInterceptor和PaginationInnerInterceptor放在一起注冊(cè)了。分頁(yè)插件基本是 MyBatis-Plus 項(xiàng)目的標(biāo)配生成器生成的page方法如果不配分頁(yè)插件selectPage返回的數(shù)據(jù)不會(huì)真的分頁(yè)而是查出全量數(shù)據(jù)再包裝這在數(shù)據(jù)量大時(shí)是性能隱患。所以建議一次性把這兩個(gè)攔截器都注冊(cè)上。7. 把生成器變成團(tuán)隊(duì)基建批量執(zhí)行與日常維護(hù)心得7.1 全表生成還是精確生成我的取舍原則用代碼生成器時(shí)間久了你會(huì)發(fā)現(xiàn)它不僅能提高單次開(kāi)發(fā)效率還能沉淀成團(tuán)隊(duì)的基礎(chǔ)設(shè)施。但怎么用好它還是有一些原則要守住。我的取舍原則是Controller 少生成或不生成Service 和 Mapper 能生成就生成。Controller 這層代碼往往跟具體業(yè)務(wù)接口設(shè)計(jì)強(qiáng)相關(guān)用戶權(quán)限、接口命名、返回結(jié)構(gòu)、參數(shù)校驗(yàn)全是定制化的生成器給的東西只能算雛形。如果團(tuán)隊(duì)風(fēng)格是把業(yè)務(wù)寫在 Controller 里那生成器生成的 CRUD 也許勉強(qiáng)夠用但如果你們有嚴(yán)格的分層規(guī)范Controller 應(yīng)該手工控制。我在日常開(kāi)發(fā)中生成器默認(rèn)只輸出entity、mapper、service、serviceImplController 開(kāi)著是為了看接口結(jié)構(gòu)參考但往往生成完我會(huì)直接刪除。Service 這層是值得生成的。因?yàn)?MyBatis-Plus 的IService已經(jīng)提供了大量現(xiàn)成方法Service接口和實(shí)現(xiàn)類生成后幾乎零成本可用后續(xù)加業(yè)務(wù)邏輯就在對(duì)應(yīng)方法里擴(kuò)展不會(huì)影響整體結(jié)構(gòu)。7.2 表結(jié)構(gòu)變更后如何優(yōu)雅地重新生成數(shù)據(jù)庫(kù)表結(jié)構(gòu)不是一成不變的加了字段、改了注釋、換了索引都是家常便飯。這時(shí)候重新跑一遍生成器會(huì)遇到一個(gè)問(wèn)題覆蓋還是保留我的建議是實(shí)體類、Mapper 接口、XML 這三類文件可以直接覆蓋。因?yàn)樗鼈兊暮诵膬?nèi)容來(lái)自數(shù)據(jù)庫(kù)表結(jié)構(gòu)不包含業(yè)務(wù)邏輯重新生成后只要沒(méi)有手工動(dòng)過(guò)結(jié)果一定是對(duì)的。但 Service 接口和實(shí)現(xiàn)類、Controller 就不建議直接覆蓋了因?yàn)檫@里大概率已經(jīng)寫過(guò)業(yè)務(wù)方法覆蓋一次丟一大堆代碼心態(tài)直接就崩了。實(shí)際操作上我通常只讓生成器重新生成實(shí)體類和 Mapper 接口跑之前用addInclude指定變更過(guò)的表跑完之后再手動(dòng)把新增字段補(bǔ)到業(yè)務(wù)代碼里。這樣可以最大程度避免生成器覆蓋手寫代碼的慘案。如果你真的希望生成器完整重新生成一套那就把項(xiàng)目里對(duì)應(yīng)的手寫類先備份生成完再對(duì)比合并。這不是最優(yōu)雅的方式但勝在可控。7.3 我遇到過(guò)的幾個(gè)冷門坑最后分享幾個(gè)我踩過(guò)的、不太容易在文檔里看到的坑。第一個(gè)是表名大小寫問(wèn)題。MySQL 在 Windows 下表名大小寫不敏感但在 Linux 下敏感addInclude里寫的表名必須跟數(shù)據(jù)庫(kù)里的大小寫完全一致。比如庫(kù)里的表叫Sys_User你在addInclude里寫sys_userWindows 上能生成Linux 上就會(huì)提示找不到表。第二個(gè)是生成器連接數(shù)據(jù)庫(kù)超時(shí)。如果數(shù)據(jù)庫(kù)地址是內(nèi)網(wǎng) IP且serverTimezone沒(méi)配或者配錯(cuò)連接耗時(shí)可能長(zhǎng)達(dá)幾十秒。我遇到過(guò)一次生成器卡住不動(dòng)排了半天才發(fā)現(xiàn)是時(shí)區(qū)問(wèn)題驅(qū)動(dòng)一直在嘗試解析本地時(shí)區(qū)。把serverTimezoneAsia/Shanghai加上之后立刻恢復(fù)正常。第三個(gè)是關(guān)于模板文件后綴。如果你用 Freemarker模板文件后綴必須是.ftl如果用 Velocity后綴是.vm。配置templateConfig時(shí)路徑對(duì)應(yīng)關(guān)系要對(duì)得上否則運(yùn)行時(shí)會(huì)直接拋模板引擎不匹配的異常。這個(gè)錯(cuò)雖然好定位但第一次遇到時(shí)確實(shí)會(huì)愣一下。第四個(gè)是關(guān)于enableSwagger()的連鎖反應(yīng)。這個(gè)選項(xiàng)一旦開(kāi)啟生成器不但會(huì)在實(shí)體類上加 Swagger 注解還會(huì)在 Controller 的方法上加ApiOperation、在類上加Api。如果項(xiàng)目里沒(méi)有 Swagger 依賴編譯直接失敗。所以我在生成器跑之前都會(huì)先確認(rèn)項(xiàng)目的pom.xml里有沒(méi)有springfox或springdoc相關(guān)依賴沒(méi)有就先不開(kāi)生成了再手動(dòng)補(bǔ)注解反而更快。用了幾年代碼生成器我最深的體會(huì)是工具解決的是重復(fù)勞動(dòng)不解決設(shè)計(jì)問(wèn)題。表結(jié)構(gòu)設(shè)計(jì)得亂七八糟生成器只能幫你把亂象原樣搬到 Java 世界表設(shè)計(jì)得規(guī)范清晰生成器產(chǎn)出的代碼也賞心悅目。所以每次跑生成器之前我都會(huì)先花十分鐘看一遍表的注釋、字段命名、類型選擇確認(rèn)沒(méi)問(wèn)題再動(dòng)手。與其說(shuō)生成器提高了我的寫碼速度不如說(shuō)它逼著我先想清楚數(shù)據(jù)庫(kù)設(shè)計(jì)——這大概是它在工程之外給我?guī)?lái)的最大價(jià)值。如果你正打算把代碼生成器引入項(xiàng)目建議從一個(gè)邊界清晰的業(yè)務(wù)模塊開(kāi)始小范圍試點(diǎn)跑通一條最小路徑后再鋪開(kāi)會(huì)比一次性全量生成順手很多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美一级AAAAAAA| 欧美色狠| 国产成人一级av88| 精品女人999| 亚洲国产中文字幕| 波多野结衣先锋影音| 九九九九九九九精品视频| 97精品中文字幕| 中文字幕一二三| av凤凰久久久| 超碰午夜| 国产精品一区午夜福利| 极品内射| 国语av狠狠色丁香婷婷综合激情| 欧美在线视频99| 丝袜美腿射精91| 中国操逼无码| 日韩97超碰中文字幕| 久久精品无码不卡| 国产精品久久久久婷婷二区次| 偷窥自拍亚洲| 亚洲av无码成人精品国产| 色欲人妻一区二区在线| av强奸乱轮| 磁力99AV| 免费精品中文字幕| 亚洲视频小说| 人人看人人摸人人色| 精品999日本| 国产又黄又爽| 久久久穴999| 欧美不卡五十路| 偷窥自拍亚洲色图| 国产AV色黄看到爽| 尤物视频偷拍免费| 色情乱伦AV| 九九九九九九九| 国产午夜无码片在线观看影视| 91美女視頻| 亚洲精品蜜桃久久久久久久| 少妇无码av专区线| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 国产精品一区二区麻豆| 久久久97| 亚洲高清男人天堂| 五月婷婷色| 久久精品国产97欧美精品亚洲| 成片免费播放| 偷拍精品一区二区三区| 久久久久久大| 99re久久| 亚洲成人激情小说视频| 亚洲欧美天| 91粉芽高清在线一区二区| 精品九九九九| 日日日骚女人精品| www.狠狠操| 91国产操逼视频| 色悠久久久av| 伊人网av| 色色色色日本| 日韩射图| 4141514逼喷水三级片| 强奸乱伦AV一天堂网| 亚洲视频,小说| 国产后入式在线观看| 老司机福利青青草| 无码九九九九| 香港成人一级视频在线青青草| 成人无码电影在线观看网| 欧美夜夜骑视频| 婷婷伊人网| 大逼色网站| 嗯嗯啊啊亚欧精品| 成人日韩欧美| 老子午夜伦不卡影院| 91超碰在线播放| www.99热| 国产男女无套视频免费观看| 亚洲成人贴图| 国产suv精品一区二区四区999| 操逼无码操逼| 密臀在线视频| 日本男人插女人的逼黄色| 超碰av在线| av网站在线观看了| 大香蕉伊人网| 超碰久超碰久| 96国产污污污丝袜| sss视频华人在线| 日本免费中文字幕在线| 国产精品白领在线观看| 天美av在线| 日韩天天本| 91天天日| 天天综合AV| 欧美视频一区二区在线| 国产精品自拍xxxx| 日韩一级成人毛片免费观看 | 日韩偷拍色图| 国产精品久久久久无码AV会牛| 丰满人妻aA一区二区三区| 国产91专区| 亚洲精品天天影视综合网| 99热18| 精品国产乱码| 伊人一区二区在线播放| 亚洲另类小说卡通动漫| 日韩av免费一级电影| 啊啊啊啊啊好多水| 久操国产在线| 日本二三四区| 色九久| 欧美在线|亚洲| 99精品人人爽| 绯色AV粉色AV蜜臀AV| 国色天香av| 任你爽视频| 九九黄色视频在线观看| 91丨九色丨东北熟女| 亚洲国产成人精品无码专区| 91在线视频免费播放| 五月天伊人| 欧美一区二区男人天堂| 国产成人精品日本亚洲语言| 91丝袜美女视频| 狠狠入| yazhououmeizongya| 亚洲人91| 天美传媒在线一区| 久久人妻无码毛片A片麻豆| 亚洲丝袜天堂| 九一综合网| 欧美999999| 人妻内射一区二区在线视频| 日韩精品电影| 综合情欲网| 男女香蕉一区二区| 六六久久日韩不卡| 99精品久久久久久久婷婷蜜桃| 亚洲s色图| 五月丁香社区婷婷日韩欧美精品影院| 变态另类专区| 免费看黄片现成| 中文字幕一区电影在线观看| 十八禁视频一区二区| 欧美福利视频啊啊啊啊| 亚洲欧美在线观看2021 | 嗯嗯啊啊操死我| 久久久久密| 中美日韩毛片| 亚洲色图伊人网| 密臀成人视频久久久| 欧美在线|亚洲| av橘色网站| 色姑娘综合网| 26uuu国产成人综合| 日韩不卡a级视频专区| 亚洲精品三| 精品四五区| 国产盗摄美女如厕大神作品在线观看| 丰满欧美放荡少妇在线| 一本色道久久综合精品婷婷| 欧洲综合无码| 五月天黄色激情视频| 97精品97久久| 97舔舔| 少妇干B| 99爱精品| 亚洲综合九| 亚洲脚交| 一个国产在线综合网站| 大奶啊啊好爽| 男人的天堂日韩| 青草精品视频日本久久久久网站在线| 欧美日韩精品一区二区三区高清| 91亚洲黑人| 无码人妻系列少妇| 91综合网在线| 97视频900| 丰满人妻一区二区三区| 亚洲视频1区| 欧美极度丰满熟妇hd| 国产超碰国产97| 成人在线午夜视频一区| 欧美一级A一级a爱片久久| 人人玩人人添人人澡免费| 婷婷六月色开| 91艹| 亚洲一区在线观看欧洲 | 欧美特黄视频网站| 日本女优在线视频福利| 色狠人在线99| 日韩欧美加勒比| 欧美日本国产日韩激情视频| 97大色网| 欧美精品三区| 激情五月激情综合网| 精品制服美女中文一区二区三区| 两女互慰AV高潮喷水在线观看| 久久综合激情| 中文字幕国产| 亚洲无码?第一页| 亚洲男人天堂网久久| 午夜噜噜噜| 欧美性爱中文字幕无线码| 丰满少妇一区二区三区四区观看| 外国91| 日韩在线观看中文字幕视频| 4虎在线视频| 国产精品一区av在线| 少妇免费视频| 日韩熟女操逼| 夜夜狠狠躁日日躁色视频| 伊人麻豆传媒| 美日韩一卡二卡三卡免费人妻精品| 夜夜夜爽www精品视频| 国产女人操逼视频| 十八禁一区二区无码观看| 亚洲AV秘无码一区..| 日本一区二区电影网站| 香蕉欧美| WWW.加勒比人妻一区不卡.com| 精品九九| 久久精品72| 久久 国产 无码| 伊人久久大香线综合无码| 啪啪性爱免费视频| WWW.加勒比人妻一区不卡.com| 国产免费一区2区3区| 亚洲天天艹| 水多多映视AV| 伊人丝袜美腿高跟在线观看高清 | 国产丝袜高跟美女av免费观看| 能看的av| 久久成人国产| 九月丁香| 97亚洲精品| 欧美精品另类人妖xxxx| 91丨九色丨国产丨人妻在线 | 粉嫩av一区二区三区天美传媒| 黄片无码在线制服| 麻豆 亚洲 97| 人人扣人人操| 性天堂| 久久综合中文国产| 在线观看亚洲专区| 97视频在线| 91网站18在线观看| 色综合av男人天堂| 日韩人妻无码不卡网站| 蜜臀久久99精品久久久久免费观| 2019久久久久久久久福利| 久久超碰av在线| 操99| 操逼视频色| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 欧美se亚洲| 天天操天天干一区二区| 青青草在线视频播放器| 久久久久久久 九九九九九九九| 美女熟妇色| 人妻美腿丝袜日韩| 97内射偷拍| 久久肏大逼| 99av| 激情文学小说一区二区| 青苹果影院男人的天堂| 色爱国产| 国产一区二区在线电影| 偷拍 欧美 日韩| 中精品一区二区三区| 超碰人人妻| 久久伊人亚洲AV无码网站| 神马久久免费电影观看| 国产亚洲精品美女| 天天影视色香色欲| 夜间福利片1000无码| 校园春色五月天| 日本高清一本二本免费不卡| av中文在线| 成人三一级一片aaa| 好爽视频在线观看视频| 老熟乱一区二区三区四区| 亚洲色久| 97超碰中文在线| 黑人粗大V S日韩女优视频| 91天美传媒精品| 超碰av人人人| 襙一襙| 六六久久日韩不卡| 白嫩国模丰满一二三区| 先锋影音av先锋一区| 99热伊人| 另类图片五月天| 天天综合网1| 夜夜高潮夜夜爽高清视频一| 蜜桃久久综合视频| av国产无码| 新久久AV| 国产久久成人| 欧美18老人禁| 亚洲中文字幕精品一区| 九七超碰| 久久久91| 免费在线视频97| 久久九九精品一区二区| 精品人妻一区二区三区蜜桃视频| 91色五月俺来也| 精品四五区| 99操| 日韩综合97P| 欧美成人国产精品| 91精品伊人久久久大香线蕉91| 久久久久久一日韩字幕无码| 中文字幕人妻色偷偷久久皮| 另类综合另类| 国产最新AV| 美女刺激久久国产欧美| 色狠狠色| 五月天丁香网| 天天舔天天 | 99热精品青草在线| 亚洲天堂 视频你懂的| 天天色播亚洲综合网站| 久久人妻精品| 欧美大码在线视频| 免费9 1久久| 中文字幕日韩人妻视频一区二区三区交换夫妻| 超碰在线人妻不卡| 亚洲吊色| 亚洲亚洲亚洲天堂天堂| 精品人妻一区二区三区四区| 91白嫩| 日夜精品| 国产精品久久妻无码网站| 久久精品熟女亚洲AV麻豆软件| 国产成年女黄特黄| 午夜传煤十二区精品| 日夜干射色啊| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | yazhouzaixian| 夜夜嗨绯色| 4虎在线视频| 国产久9| 亚州男人天堂| 国产精品视频麻豆入口| 乱人伦 国语对白:视频直接看| 怡红院视频在线| 亚洲不卡av在线| 欧美青青视频| 色眯眯av| 99999精品| 青娱乐国产盛宴视频| 国产成人+综合亚洲+天堂| 亚州精人品大香蕉| 亚洲色图 图片| 色狠狠一区二区三区香蕉| 国产60页| 99久久久er直播网址| 69人妻精品一区二区绯色| 麻豆AV短剧| 国产91丝袜在线播放蜜月| 欧美中文综合| 欧美色女人| www.99中文字幕| 婷婷综合久久| 嫩草影院永久在线制服丝袜| 久久久久久久久一区二区三区| 操逼操2| aⅴ日韩成人电影av在线免费看av大全 | 白丝1区2区3区| 91男同| 三上悠亚在线毛片91| 色黄色美女大长腿午夜视频| 美国一区二区免费视频| 另类天堂| 亚洲图片 欧美电影| 亚洲欧洲无码bt精品合集| 五月丁香色色网| 欧美日韩大陆黑人少妇99| 91热热色| 国产亚洲精品玖玖玖在线观看| 日本天天人人狠狠在线日美女| 超碰 欧美| 日韩性爱1级片视频| 亚洲 欧美 中文 日韩超碰| 国产suv精品一区| 亚洲国产美女久久久久| 男人的天堂2010| 五月天九九日国产精品一区二区三区| 中文字幕五区| 欧美亚洲丝袜美女电影| 亚洲综合在线91| 一本一道人妻久久一区二区三区 | 78综合网| 国产日韩美女小穴视频网站不卡| 免费操逼视频下载| 久久一本大香蕉 | 青春草A| 91激情| 天天干天天干天天干| 91久久国产精品| 日韩不卡a级视频专区| 超碰碰激情97+久| 97超碰磁| 夜夜狠狠躁日日躁色视频| 亚洲人体视频在线观看| 小草三级久久观看| 亚洲天堂另类| 天天爱天天韩国日本牛牛牛牛| 高精欧美色| 岛国毛片在线观看免费| 四虎国产成人精品免费一女五男| 岛国黄片网站| 青娱乐导航AV| 无码动漫av中文字幕| 美女尤物福利视频| 国产综合在线视频网站| 久久久专区| 国产中文精品一区二区在线观看| 日韩中文9| 91在线无码精品秘 软件| 夫妻AV网站| 成人情色一区二区| 1769一区| 日影院久久婷婷夜夜网| 五月天黄色激情视频| julia国产在线 | 亚洲国产日韩精品久久久| 天天日天天爽| 欧美成熟性爱精品| 欧美激情黑人| 夜夜嗨AV蜜臀av| JULIA一区二区三区在线播放| 精品1区2区3区| 伊人久久88国产女| 69XX一中文字幕人妻91| 99色在线| 丝袜制服字幕在线| 女人 A一级| 午夜在线播放| 亚洲最大网站av| 国产黄色动态精品| 黄网色一区二区三区四区精品| 久久男人| 色欧洲97| 丁香啪啪| 中文字幕五月婷婷免费| 欧美日韩天堂| 欧美熟爽综合| 亚洲av综合色区无码一| 精品人妻一区二区三区四区不卡在| 97色论| 久久九九网| 日本孕妇一区二区视频操逼免费看 | 国产专区第一页| 久久久555| 欧美老妇女内射网址| 欧美午夜视频免费观看| 91天天综合日韩欧美| 啊啊啊不要啊啊受不了了视频在线| 亚洲精品人妻吞精av| 日日夜夜骑| 91精品婷婷国产综合久久竹菊| 五月香婷婷| 91精品国产日韩欧美综合| 亚洲人精品午夜不卡| 欧美三级一级| 熟妇熟女视频一区二区三区| 九月丁香婷婷色| 国产精品福利资源在线尤物| 97天天| 少妇人妻在线| 2020中文字幕在线| 日韩av电影网站| 久久久∴| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 亚洲久久久久| 亚洲久9| 美女十八禁| 后入福利视频| 人澡逼| 欧洲精品欧洲精品| 97欧美久久久久久久| 超碰欧美在线欧美| 无码人妻系列少妇| 国产精品九九| 少妇熟女视频一区二区三区| 久久久国产护士丝袜美腿一| 欧美日本不卡| 无码精品啪啪啪一区二区三区三州| 日韩视频小说在线观看| 亚洲999综合| 97超碰免费生活| 欧美玖玖爱免费玖玖| 中出后入| 啊啊啊轻点在线观看| 久久超碰天天| 91性片| 亚洲色图欧洲| 欧美性爽xyxOOOO| 国产精品不卡一区二区电影| 岛国免费视频在线| 亚洲免费在线探花| 一级A片女人高潮叫床| 色爱三区| 日韩高潮一区| 99re69综合| 天天摸夜夜操视频| 青草伊人久久| 91老熟妇| 操迟操逼在巾线Fre看| 日韩国产成人自拍视频| av一区二区三区 中文| 免费观看有码高清视频| 欧美一区二区三区大综合| 天天天天做夜夜夜夜做| 天天性射网| 国产熟妇 码视频户外直播| 免费成人在线观看91| 国产91乱伦| 在线不卡视频| 91撸色网 玖玖网 欧美| 亚洲文学偷乱拍啪啪啪啪 | 欧美页片| 久久久涩| 欧美一二三级精品在线| 亚洲熟女中文字幕在线| 一区久久久二区| 91欧美综合在线| 97亚洲色图| 人人操 欧美| 久久男女激情视频网站| 视频在线观看一二三区| 91少妇通奸网站| 亚洲国产精品成人久久蜜臀| 日韩亚洲国产视频| 亚洲有码 视频一区| 九九自拍伦理| 啊啊啊啊啊好多水| 99性爱在线观看| 国产精品久久久亚洲一区| 免费成人在线熟妇网| 大奶的诱惑| 亚洲免费成人在线高清无码视频| 六月激情网| 精品无码久久久久| 亚洲成a人v欧美综合天堂下载| 精品丰满熟妇人妻一区| 精品久久久久,69国产成人精| 操逼999| 国产九九九九九九| www.av家庭乱伦| 成人乱码一区二区三少妇| 偷拍网站久久男女男| 超碰久热| 六六久久日韩不卡| 欧美成人精品一区二区男人蜜臀| 久久亚州精品成人Av无| 污啪啪啪视频| 96久久久| julia在线观看久久| 97国产精品久久久久| 97精品一区二区视频| 亚洲精品乱码久久久久久蜜桃麻豆 | 99热久| 天天操夜夜操狠很操| 日本护士高潮| 大香蕉欧美国产日韩高潮| 国产极品馒头逼| 久热无码| 久热99999| 午夜精品久久久久久久久久蜜桃| 97天天搞在线| 欧美啪啪色吧在线| 99热在线播放| 婷婷20月天青娱乐| 国产动漫操逼视频| 一级免费精品| 黄色片大香蕉| 久久影视二区三区行押| 国产区91柔拿会所技师| 97在线青| 91亚洲图片| 欧美特大AA级黄片| 色婷婷aV一区二区三区麻豆综合 | 国产AV激情无码久久无码| 亚洲 se图 欧美电影| 99久久99久久免费精品蜜臀| 色99在线| 男人的天堂久久久| 久久久人体| 好属操| 999在线电影香蕉| 狠狠爱夜夜| 欧美熟女少妇| 中文字幕三四区| 少妇无码太爽| 成人av毛片在线观看| 亚欧美天堂在线| 一级性爱视频免费在线| 艳尻美人妻| 熟女久久久| 亚洲综合春色| 综合五月天| 男人的天堂不卡一区二区 | 精品一区二区啪啪啪| 亚洲图片另类| 日han少妇无码| 成人av影院在线观看| 99热日| 五月丁香综合| 国产福利合集| 性欧美天天| 国产亚洲精品美女久久久久久2021| 大香蕉之青青草原| 人人扣人人操| 成年无码动漫av片无尽在线| 少妇同性| 中出789在线视频| 四虎国产精品永久地址入口| 最新9久久久9免费视频| 色五月综合| 久久精品福利影院| 九九九只有精品| 亚州综合色| 国产美女激情| 亚洲午夜AV| 久久啊啊| 人妻酒店出差被中出免费在线播放| 日韩精品在线视频在线观看| 九九九国产精品| 97超碰69| 强奸乱伦αv片| 性综合网| 夜夜做夜夜爽精品视频| 一二三啪啪专区| 亚洲最大网站av| 操国产逼| 日韩日韩日韩-国产乱码精品一区二区| 97午夜剧场日韩| 欧美精品1区2区3区| 人人么人人操| 男生通女生屁股| 青娱乐蜜桃臀AV色婷| 五月天色色色| 日va操| 极品白嫩美少妇在地板上位骑射淫水泛滥| 天天操人人操骚逼网站| 艳美熟妇先锋一二三区| 在线观看黄色电话| 欧美亚洲一级在线观看| 天天cao在线| 亚洲天堂资源在线| 天天综合网91入口| 九九aV| 影音先锋新男人| 天久久久噜噜噜久久国产精品爽爽 | 在线中文AV| 无码一区二区三区四区五区六区七区八区九区十区视频 | 91n欧美| 精品大全99999| 亚洲自拍一区夜夜操| 野狼激情网| 人妻AV在线| 国产超碰| 尤物一级在线免费观看| 国产99精品一区二区三区免费| 狠日欧美| 伊人在线大香蕉二。| 国产精品久久久视频| 奸色色 男人天堂 天天射| 偷拍自拍在线视频观看| 丁香六月激情| 波多野结衣一级视频| 另类图片综合| 激情小说五月天| 国产在线能看的你懂的| 91动漫操逼视频| 国产日韩欧美操逼视频| 日韩欧无码一区二区三区免费不卡| 亚洲性刺激| 欧美偷偷网| 国产丸一视频| 熟女露脸激情自拍视频| 久久夜精品一区二区三区| 玖玖爱一区在线| 欧美性爱一区| 1204金沙人妻懂旧版免费| 性色高清在线| 欧美色一二三| 97视频www| 天海翼久久| 骚逼自拍99| 东京热AV男人的天堂| 久草综合网| 欧美性高潮| 五月情色天| 久久人妻| 九九热在线视频| 99久久久久| 国产按摩一区二区三区| 91色鬼| 熟女天天干| 精品久久久不卡一区二区| 天天躁狠狠躁av| 91模特在线观看| 澳门色噜噜色噜噜色噜噜色噜噜色噜噜| 玖玖久久久| 中国AAAAAA黄色片| 亚洲天堂一区二区久久| 性爱精品一区| 精品久久久久久亚洲| 亚洲天堂另类小说男人| 欧美一区二区成人一卡| 免费男人的天堂| av中亚| 久久riav中文精品| 日本一级黄色电影| 高树玛利亚无码流出| 青草视频人妻在线观看| 久久线上视频免费看| 日本国产欧美一区三区二区| 去干网最新版| 久久超碰网| 欧美性爱91| 五月天色综合| 91色伦综合| 91高潮| 日本欧美一区二区三区免费| 婷婷久久综合| 福利天堂| 伊人网免费视频| 日韩99精品视频综合区| 一区二区娱乐网站| 啊啊啊不要啊啊受不了了视频在线 | 人人爱人人乐人人操| 国产午夜激片Av毛片不卡| 女同亚洲欧美一二三区久久电影| 热热热热日日漂亮永久永久国产日| 欧美九九九| 天天弄天天操| 最新加勒比丝袜在线| 97草草| 日韩视频精品在线观看| 久久久久人妻| 99这里都是精品| 青娱乐老司机视频| 欧美激情综合色综合啪啪五月| 四虎免费看黄| 精品无码欧美三级| 人妻熟女一区在| 欧美一二级| 国产精品点击进入在线影院| 91爽啪| 欧美综合亚洲| 99re公开精品免费视频| 色91综合网| 九九热九九| 无套内射性感少妇视频| 大香蕉之青青草原| www亚洲免费| 肥臀熟女福利视频一区二区| 另类图片天天影视| 99热91| 亚洲中字慕不卡| 久久美女国产| 亚洲AV无码久久精品蜜桃小说| 九热中文字幕| 婷婷久久综合久| 精品十八在线观看| 影音先锋中文字幕日本好一区二区| 伊人aaa| 精品无码不卡视频| 久久精品国产99国产精品亚洲| 国产精品不卡av免费在线观看| 激情五月天色播| 精品日日人妻| 五月丁香六月| h色99999| 欧美日韩国产三级黄色| 台湾大香蕉99热| 久热精品在线国产| 中文字日本乱码| 九九视频黄色片| 2019AV天堂| 成人乱人伦一区二区| 天美精品一区二区三区四区在线观看| a片自拍直播视频| 中文字幕乱码人妻一区二区三区,99精品| 九九九九免费| 超碰激情808| 国内毛片无遮挡国产| 精品网站99999| 美女极品一区二区三区| 熟女精品一区二区在线观看| 久久亚洲精品成人av| 九九超碰综合网| 五月天激情小说| 美女诱惑一区| 免费人人搞97| 十八禁成人网站在线观看| 男人的天堂日韩| 亚洲五月婷婷| 97爱爱爱| 熟女欧美日韩综合婷婷| 久久九九视频九九视频| 99久在线精品99re8| 噜噜噜狠狠色综合| 中文字幕精品探花视频| 啊啊啊在线观看免费视频| 国产熟女完整版中字| 夜夜骑日日| 91在线页| 亚洲伊人a线观看视频| 久久久精品久久| 丝袜 亚洲 偷拍| 26uuu国产亚洲综合| 60秒免费视频| 玖玖综合.com| 在线观看高清AV| 中文字幕欧美精品亚洲日韩蜜臀| 性爱动态120秒| 国产一区二区三区白丝| 成人夜夜| 麻豆乱码久久精| 大香网站| 人妻夜夜爽天天爽三区麻豆AV网站| 欧美日韩精品国产91| 日本三级R| 日本久久女同性恋视频| 亚洲丰满很很操| 精品久久久av| av天堂手机版追回| 超碰在线人人射| 2020中文字幕在线| 天堂麻豆天美| 99久在线精品99re8热| 欧美一区二区福利在线| BBBBB97COM| 久啪| 午夜激情床戏激情| 新版天堂中文资源8在线| 78精品| 亚洲熟女性高潮久久久| 成人国产二区三区在线,男女精品。| 国产久久日韩网站导航| 另类小说五月天| 精品久久久久久中文| aa片毛片| 久久久久久久9999| 日韩av情韩国爱禁区av一区二区| AV天堂丝袜| 色婷婷久久| 丰满人妻无码一区二区三区| 97日韩欧美| 日日骚网站| 色97综合中文字幕| 中文字幕-区二区三区四区视频中国| 天天日天天爽| 男男H黄动漫啪啪无遮挡网站| 97资源视频| 97精| 麻豆成人影音在线| 黑人精品欧美一区二区蜜桃| 青青伊人久久| 欧美一级欧美三级在线观看| 亚洲色婷婷| 视频分类 国内精品| 思思热免费在线视频| 秋霞一集毛片观看| 超碰97人妻在线| 一区二区影视| 91日韩网站| 国产91丝袜 在线播放| 亚洲男人天堂视频| 91国产在线精品| 日本不卡二三区| 国产青视频| 久艹伊人精品综合在线| 天天看少妇| 少妇免费视频| 国产亚洲 中文欧美久久| 五月天色图影视| 亚洲少妇喷视频看| 99只有精品| 污啪啪啪视频| 欧日韩不卡视.频| 无码免费一区二区三区啪啪| 大香樵伊人网| 国产黄a三级三级三级av在线看| 九九Av| 99视频只有精品| 99热精品在线播放| 欧美有码激情视频一区二区三区| 六月丁香网| 天天摸,夜夜摸| 久久9精品视频| 夜夜夜夜夜夜夜夜夜狠狠狠狠狠狠狠| av婷婷色网| 91中文精品日韩欧美在线| 78久久久| 成人天天爽| 加勒比性爱成人在线| 亚洲男人天堂视频| 9 1果冻精品视频| 日韩15p| 亚洲中文字幕熟女| 岛国色情视频在线观看| 国产人妖视频一区在线观看| 激情久久久| 丁香六月综合激情| 怡红院视频在线| 欧美日韩少妇色情| 亚洲偷91色| 欧美情色亚洲| 精品免费视频国产一区| 成人精品电影| 亚洲精品欧洲精品| 天天日美女的B| 人妻久久| 一个色导综合| aⅴ日韩成人电影av在线免费看av大全| 欧美性爱在线无码| 日韩av女优在线免费一区| 91麻豆天美传媒HD| 久久久熟女一区| 中日韓欧美高清| 国产精品盗摄 偷窥盗摄| 国产91啪| www久久久| 天色综合网| 亚洲中文字幕久久无码精品| 欧美夜夜| 日韩人成网站在线播放| 中文字幕精品一区二区精品| 亚洲永久AV无码精品秋霞| 蜜臀va69| 影音先锋每日最新资源在线观看| 草草影院最新网址| 99热这里只有精品9| 好吊色一区| 综合五月天| av强奸乱轮| 亚洲欧美精品一区天堂久久| 天天澡天天爽日日av| 天天天干977| 人人看欧美性爱| 韩国久久97| 日韩精彩视频| 黑人精品一区二区在线播放| 超碰免费人人| 在线亚洲丝袜视频网站| 国产久久久久久| 91三级理论片播放器| 色一射色一射| 草B在线| 狼狼色丁香久久婷婷综合五月| 99成人| 97超级色碰碰| 久久久精品中文字幕爱豆| 人妻av在线| 91麻豆一二三区| a片自拍直播视频| 天天插天天插| 超碰伊人在线| 亚洲春色欧美激情自拍| 人妻天天夜夜爽一区二区| 在线播放中文字幕| 国产精品嫩草久久久久| 97天天搞在线| 九久久精| 日韩少妇一区二区三区| 97久久免费| 三上悠亚在线毛片91| 国产乱伦性爱AV| 久久久男人的天堂| 日韩黄片影院| 九九九综合精品| 久九色| 色啪网| 日本ZZ高免费A级视频| 国产高清MV操逼视频| 亚洲蜜臀懂色| 亚洲一区中文精品| 青青草原狼av| 偷拍 亚洲 欧美| 加勒比大香蕉视频在线| 欧美丝袜中文字幕07在线| 在线观看精品国产免费| 中文字幕久久亚州无码| 国产又黄又爽又刺激久久久久久| 亚洲最大黄网| 国产高清成人免费视频| 91黑丝少妇| 国产精品人妻无码久久久老鸭窝| 天美av在线观看| 91色图| 久草久热| 色欲Av人妻精品一区二| 黑人中出21连凳花野真衣| 国产无码久久高清| 日韩精彩免费| 成人精品久久久午夜福利| 国产一区麻豆免费观看| 思思视频免费看网站| 亚洲色图美腿丝袜| 亚洲最新中文字幕免费| 久久久久久久六六 | 日本中文字幕一区| 黄片免费久久久久久久| 一级黄碟| 91天堂色男人的天堂| 青青草一本道福利视频| 婷婷五月av| 综合色一区三区二区| 青青操97| 性久久久| 国产一| 综合激情婷婷| 91骚熟女| 国产中文福利| 久久国内| 欧美第五页| 丝袜美腿诱惑亚洲欧美视频在线观看| 色五月AV| 91艹逼精品| 亚洲图片欧洲图片aⅴ| 日本97久久| 日本午夜久久电影| 免费视频一二三区| 少妇诱惑视频| 一类av片在线看| 国产91丝袜 在线播放| 亚洲欧美精品一区天堂久久 | 97爱啪| 天天爱天天韩国日本牛牛牛牛| 亚洲国产综合视频| 精品九九九九九九九九九| 国产 v乱码一区二| 精品人妻一区二区三区四区不卡在| 操我啊啊啊啊啊| 亚洲色图日韩精品| 欧色网址| 亚州色图欧美| 在线播放成人网站| 99久久精品无码一区二区毛片免费 | 丁香六月东京热| 91 丝袜在线播放| 久久综合超碰| 中文字幕 码 自拍 视频 区| 1000部熟女视频在线观看| 中文字幕一品色图| 大香蕉伊人亚洲| 333kkkk·亚洲com久久| 黑人猛交| 亚洲91综合| 蜜桃中文字日产乱幕4区| 无码高清专| 中文字幕精品探花视频| 后入福利视频| 美腿色图| 9久久精品| 无遮挡一级毛片视频免费的| 日本三级网页| 伊人加勒比| 日本 情色 1区2区3区| 狠肏骚人妻| 99热精品在线| 亚洲色 国产 欧美 日韩| 色激情综合网站| 丝袜视频网国产90| 亚洲天堂人人妻| 天天看综合网| 国内三级自拍小视频在线观看| 自拍内地三级在线观看| 一本久久久精品| 传媒免费一区二区三区| 亚洲欧美大香蕉| 91狼人| 国产三级多多影院2022国产AA一级毛片无码| 另类欧美色| 33044男人的天堂深夜备| 男生女生啊啊啊啊| 蜜桃成人1区2区3区| 91精品大奶人妻| 园内精品自拍视频在线播放| 高清有码一区二区| 夜夜欧美| 欧洲站一级二级三级h| 亚洲色资源| 青青操少妇| 精品少妇后入一区二区三区四区人妻巨乳 | 黄色二级片网站| 久久无码成人| 欧美一区二区三区互相| 99热在线播放| 操久久久久| 久久久久久无码人妻中文字幕| 久热久| 97色诱| 午夜性| 久久久久久久78| 亚洲 图片 欧美 色图| 婷婷日韩一区二区三区中文字幕在线| 午夜精品视频777| 91精品无码人妻系列| 性开放中文AV高清无码免费看| 亚洲 日本 国产 综合| 男人女人18禁片免费看网站| 久久久一区二区三区四区五区| 婷婷8月天青娱乐| 国产超碰欧美| 欧美另类天堂| 中文字幕欧美精品亚洲日韩蜜臀| 国产熟女高潮一区二区三区| 北野未奈加勒比av| 亚洲极品| 久久久久久久久久久精| 午夜操操操| 久久线上视频免费看| 日韩91网站| 天天综合~91| 亚洲 小说 欧美 激情 另类| 免费成人自拍视频在线| 欧美性爽xyxOOOO| 亚洲啪啪视频免费| 亚洲AV无码翔田千里网站| 日本性爰一道本| 国产精品自在线发布| 九九无码视频| 五月丁香影视| 韩国一区二区精品亚洲| 91人妻丝袜无码| 四虎视频在线观看| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 国产日韩怡红院| 久操电影| 人妻9117c| 操操逼操操逼操操逼逼| 入口操逼网站| 天天插天天干| 婷婷三区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 午夜操一视频一区| 伊人五月天婷婷| 97色色国产视频| 亚洲丰满很很操| 国产精品白丝www| 亚洲天堂欧美| 高潮的A片激情扒开一区| 在线中文字幕极品av| 久久曰曰| 黄色成品网站| 色五月激情AV在线| 中文字幕视频在线观看| 精品亚洲一区在线观看| 日韩无码黄色片| 免费精品99|