色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合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
返回資訊列表
男女啪啪网站免费视频| 久久一区,青青青青草视频在线播放| 久久99999| 日日骚av| 老熟女乱子伦中文字幕一区二区| 夜夜操91744565| 亚洲人妻色图| www.狠狠| 久草资源欧美在线视频| 成人性交免费视屏| 五月天婷婷综合| 2019AV天堂| 久9精品| 嫩草一区二区在线观看| 人人操天天爽| 91美女视频| 久久宗合97| 婷婷三区| 青青草视频导航官网| 婷婷av在线中文字幕| 日韩三级天堂在线观看| 久久产精品一区二区三区电影| 青青草在线视频美女| 一级婬片120分钟试看| 日本不卡二三区| 亚洲另类综合欧美| 91 国产丝袜在线播放-百度| 日韩 人妻 精品| 97人人中文网| 老熟女91av| 97香蕉网| 亚洲中文字母在线播放| 涩涩久久精品| 九月激情婷婷| 中文字幕乱妇免费视频| 熟女精品一区二区三区| 午夜福利一区二区影院| 18禁看网站一区| 日本91白丝| 这里只有精品97| 亚洲天堂,男人| 日日躁夜夜躁狠狠躁超爽| 亚洲成av人片色午夜乱码| 97精品97久久| 色婷婷亚洲婷婷| 热99这里有精品综合久久| 人妻夜夜爽天天爽麻豆三区网站 | 女同性恋中文字幕| 丁香六月综合激情| 热无码中文亚洲H一道本一区二区| 欧美在线伊人色| 亚欧性爱无码| 91色综合激情| 亚洲欧洲精品视频发布| 日本精品五区| 五月天色电影| 日本中文字幕在线视频| 欧美性爱第1 页| 日本 欧美 亚中文字幕| 成年人黄色小视频网站| 日本黄页视频在线观看| 色色色综合网| 99久久精品无码一区二区毛片免费| 欧美色66| 尤物网址| 加勒比色99999| 超91综合网| 国产亚洲女v在线观看| 成人欧美日超碰| 日韩不卡av一二三| 丰满少妇精品一区二区| 一二三啪啪专区| 97碰在线视频| 97天天摸天天碰| 亚洲阿v天堂在线| 免费亚洲国产精品久久一区| 国产极品999| 久久性爱网站| 国产亚洲精品一区二区三区| 人妻另类| 久久熟女久| 超碰色图| 午夜欧美J进J出白浆流出久久久 | 日韩欧亚太美不卡| 亚洲AV永久无码精品成人调教| 精品国产精品一区二区| 亚洲情色在线| 国产精品久久久无码AV网站| 男人的天堂网页| 日韩中文字幕二区| 色色色五月婷婷| 日韩视频精品在线观看| 久久这里只精品| 上床不卡网站| 囯产乱伦一区二区三女 | 色999;丁香五月| 搞中出久久| 易易A毛视频| 久久99精品九九久久久婷婷| 日本欧美国内在线| 精品毛片久久久精品毛片| 免费精品国偷自产在线在线| 日日骚AV| 中文字幕欧美丝袜07资源| 色哟哟AV| 九九九九欧美| 热久久99999| 久久伊人在线五区| 国产AV高清AV无码| 青娱乐国产精品| 国产91福利小视频在线观看| 欧美亚洲手机在线| 久草成人影片| 国产人妻一区二区三区欧美毛片| 成人情色一区二区| 国产小黄片在线免费观看| 国产日本顶级一区二区三区| 亚洲高清在线se| 91爰爱欧美| 高凊专区人人操| 国产无码久久高清| 欧美91精品国产自产| 天美91| 久久久月天| 无套后入双马尾| 一区二区三区四区五区久久久久久| 久久久久免费少妇| 色噜噜狠狠色综无码久久合欧美| 日韩精品中文字幕二区| 久久9视频| 色月天AV导航| 日韩熟女精品无码专区一区二区| 久久111| 日本不卡二三区| 欧美日动态视频| 操一区| 蜜臀无码一区二区| 午夜啊啊| 人妻中文字幕精品无码| 97爱爱| 高清国产精品无码| www亚洲免费| www..com操老师| 熟妇操花| 最新日本中文字幕| 国产美女精品| 欧美人人AAA| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 欧美综合第一| 国产AV超爽| 国产精品不卡少妇白| 中文字幕国产| 综合干干干av久久久综合网| 后入内射蜜桃臀| 日韩在线观看中文字幕视频| 中文字幕日产av人| 国产懂色精品国产av| 乱伦1色页| 偷拍盗拍亚洲色图图片 | 91激情| 日韩欧美性吧婷婷乱伦大香蕉| 成人熟女视频一区二区三区| 亚洲性网| 精品成人av一区二区三区在线| 大象AV在线| 亚洲国产另类在线中文| 国产日韩无码一区二区三区久久区| 青青网三级视频| 免费农村成人少妇人妻Aa一区二区视频| 亚州中文字幕超碰97| 综合大香蕉美。| 日本久久久久久久久久| 黄色片一区二区三区四区五区 | www.男人的天堂| 亚洲日韩视频二区| 青草视频在线看看看看看看看看看| 超碰 另类 欧美| 白丝AV| 欧美亚洲美少妇一区二区| 极品后入免费视频| 亚洲97在线| 成人av影院在线观看| 亚洲天堂AV在线播放| 国语国产操逼伊人AV网| 91一区二区| 丝袜喷水在线| 91亚洲欧洲| 69少妇一区二区| 中文字幕成人| 日日干夜夜欢| 国产精品白丝在线播放| 大香蕉久久| 色九九九综合| 欧美极品色| 日日夜夜骑| 特级丰满少妇一级AAAA爱毛片| 97AV爱| 成人草草视频| 一区二区三区精品黑丝白丝酒店对鸡 | 一级啊性爱在线视频| 激情五月天色色| 97就爱干| 99999亚洲| 国产日韩在线播放av| 九九久久精品| 日本亚洲嫩草影院啪啪| 国内毛片国产专区二| 性色高清在线| 亚洲精品无码成人久久久99| ai欧美亚洲小说| 91中出在线| 爆操无码| 中出人妻中文字幕91在线| 26uuu欧美日韩| 99热这里只有精| 日本顶级天天操狠狠操夜夜操中文字幕| 老熟女综合| 在线A日本| 天天影视色香色欲| 国产精品嫩草影院午夜两性 | 91精品丝袜久久久久久无码人妻| 大学生美女口爆| 婷婷激情五月综合| 亚洲图片另类| 试看福利| 亚洲无码免费看| 女人妻一区| 亚洲电影中字一区二区| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 欧美综合1性辶| 91超级碰碰碰| 伊人热综合| 性性久久| 五月天婷婷成人网| 欧在线一二区| 黑人中出21连凳花野真衣| 中文字幕av亚洲精品| 激情五月婷| 色姑娘综合网| 久久久久密臀一区二区| 日韩精品一区的| 国产精品第一页国产大屁股视频免费区| 性站| 日韩欧美成人性爱在线| 乱操9999| 超碰人人乐97| 国产成人一级av88| 可乐操亚洲蜜911| 久操高青| 新久久AV| 亚州色综合| 亚洲综合码| 你想操日本小逼吗| 美女诱惑久久| 日本99一区二区| 第一高清av中文字幕| 美女久久久久久久久久久| 97玖玖人妻| 日韩啊V| 伦理日韩国产久久| 黑丝91视频| 99久久精品国产高潮| 久久久久久九九九九| 亚洲诱惑| http://qxhbdz.com| 萌白酱自拍视频| 一区二区三| av大香蕉网站| 91足交| 免费a v| 懂色影视久久| 老熟女91av| 在线啊v一区| 国语对白露脸XXXXXX | 巨爆乳肉感一区二区三区竹菊影视| 欧美一区二区男人天堂| 9I1性色影院| www. 男人天堂成人在线| http://qxhbdz.com| 日人妻视频91| 奇米四色网| 日本人妻A片成人免费看片| 日韩成年人性爱视频| 91痴汉| 天天影视之亚洲综合网| 中文字幕97色| 91jk色拍| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 日韩欧美国产高清视频| 操逼日批| 亚洲国产美女久久久久| 大逼色网站| 爱丝福利| 天天性射网| 天堂综合| 日韩91网| com 首页 18岁 禁区 女优 免费 精选 同城 | 九九热九九| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 人妻日日干| 成人26uuu| 精品视频一区二区| 友优传媒精品在线一区二区| 国产伊人精品在线| 丝袜AV一区二区三区| 少妇高潮一区二区三区在线| 综合天天网| 欧美 亚洲 大香| 一区二区三区日韩欧美| 精品久久久久黄少妇| 欧美熟爽综合| 丝袜综合| 开心六月色| 国产久久久9999| 丰满搜索结果 -第18页- 久久高清无码 | 国产蜜臀在线| 青青草华人在线欧美在线| 久草线上视频免费看| 欧美激情久久久久| 999 久久久| 欧美一级专区免费大片| 九九九只有精品| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 久久久久久九| 性色AV蜜色av色欲av| 91站街按摩店老熟女熟女| 人妻乱仑一区二区三区| 亚洲1区| 乱精品一区字幕二区| ss久久| 亚洲熟妇极品| 96免费视频在线| 男人的天堂日本东京热| 热热色91| 以及麻豆国产入口在线观看免费| 亚洲av综合色区无码一| 嗯嗯啊啊视频在线看| 欧美日韩人人精品| 9999九九九久久久| 91欧美经典| 999精品久久久久久久| 男人的天堂2019| 日韩av不卡在线看| 99视频在线| 夜夜操av亚洲一区二区| 大但人体久久久久| 欧美人与动性人交a| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 蜜臀AV成人精品蜜臀AV久久| 加勒比综合a∨| 91丨人妻丨国产丨丝袜| 岛国大片在线观看网站入口| 嗯嗯啊啊视频在线看| 9 7超碰在线免费观看| 久久久九九| 在线天堂资源亚洲| 欧美国产精品| 男同专区一区二区三区在线| 人人爱人人操人人性| 亚洲AV秘 精品久久老牛影视| 日本性爱视频一级| 中文AV制服乱伦| 国产白丝AV| 青青草成人视频在线观看二区| 日日妻色网| 久久久精品视频欧州站| 中文字幕蜜乳av| 日本五十路熟女一区二区| 色情五月丁香| 国产成人精品一区| 6080YYY午夜理论片在线观看| 婷婷丁香久久| 天天躁狠狠躁av| 久操视频在线观看| 口爆综合网| 土豪酒店各种姿势玩弄极品幼稚| 秋霞色色影院| 精品夜夜澡人妻无码| 亚洲色图第四色| 日本伦乱九九九综合| www色色色com| 91精品微拍福利| 91久久精品蜜臀| 精品一区二区2| 精品中文字幕一区二区| 综合网~91综合网| 亚洲久久久久| 色区久久| 97超碰大| 亚洲麻豆精品二区三区| 超碰偷拍| 精品偷拍13p欧美dodk视频| 天天爽天天| 骚熟女AV网| 日韩不卡毛片Av免费高清| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 超碰色大香蕉| 欧美性爱精品一区二区| 欧美淫乱视频| 91在线视频免费播放| 中文字日本乱码| 成人女人国产| 97国产超湿| 伊人精品国产| 久久欲| 色小视频蜜乳| 91夜夜蜜桃臀1区2区3区| 97摸视频| 91人妻人人妻| 女人与公拘交酡2020视频| 天天综合香 ld视频| 91综合天天| 色婷婷综合久久久久中文一区二区| 国产三级在线现体验区| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 免费看片黄| 欧美性综合| 无码伊人久久大杳蕉中文无码| 天堂岛av| 97色欧州| 免费看黄片现成| 一级片视频啪啪| 精品人成视频在线观看| 这里是精品| 偷拍 欧美 日韩| 午夜无遮挡男女啪啪视频| 清纯唯美亚洲另类| 亚洲精品黑丝| 久久美国毛片| 肥臀熟女福利视频一区二区| 91搞逼视频| 囯戸精品高潮呻吟旡码| 婷婷综合伊人一区| 午夜男人一级A片7777| 欧美一区二区三区入口| 北约熟女超碰| 高清不卡国产| 久欲AV| 亚洲av乱伦色图网站| 男人综合网| 9999伦理视频| WWW黄片COM| 天天日夜干| 中文字幕人妻色偷偷久久皮| 久久这里只精品99re66图| 青青草视频爽一爽| 91精品丝袜在线观看| 99色网| 91人妻丝袜无码| 国产成人欧美一区二区三区的国产| 青青草国产一区二区三区| 校园春色 男人天堂 | 91AV入口| 欧美—性—交—色| 国产激情久久久| 中文字幕一区二区韩| 密臀视频一区二区三区| 91福利网在线观看| 大香蕉久久| 国产精品丝袜在线| 人人摸人人添人人操 | 人妻少妇精品久久久| 色天使大香蕉| 免费超碰97久久| 蜜乳av一区二区三区| 欲综合网| 精品人体无圣光凹凸| 狠狠色狠狠色狠狠五月| 一本道综合色图| 欧美久久久15P| 婷婷亚洲综合| 一类无码操逼视频| 久久精品国产亚洲AV嘿嘿| 欧美色九九九| 亚洲高清色综合| 日本不卡中文| 一区二区三区在线日韩影院观看| 亚洲棕合电彰| 91欧美经典| 家庭乱伦性爱av| 久久久久性熟视频| 狠狠干妹子| 黑人免费福利视频| 精品无码不卡视频| 久久久久久免费电影| 日韩15p| 97激情97激情| 岛国网址国产| 啊操爽品善一区二区三区| 一区二区三区精品黑丝白丝酒店对鸡 | 激情四射五月天| 97精品全部| 欧美亚洲尤物久久| 国产白嫩漂亮KTV在线| 国内精品嫩模A∨私拍小视频| 91色夜| 97se亚洲| 男人天堂综合| 国产九九九九九九| 五月天人妻综合| 制服丝袜第二页| 狠操91,com| 亚洲一区二区中文字幕| 国产91 丝袜在线播放| 青青久草| 国产精品福利视频| 人妻精品视频一区二区三区 | 亚洲高清无毛一区二区| 国产精品盗摄 偷窥盗摄| 久久性生大片免费观看性| 插入逼91| 久久久久久久久久久六六| 曰韩精品九九无码| 按摩中文字幕| 99精品久久久久久| 殴美色网| 97国产精品| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 婷婷久久网| 久久99操天天日| www.操| 国产精品suv一区| 啊灬啊灬啊灬啊灬高潮奶出了免费视| 亚洲,欧美,综合网| 后入式免费视频| 富女玩鸭子一级毛片| 为用户提供免费看黄网址在线观看| 色翁荡息又大又硬又粗又爽| 亚洲另类电影| 色好看av| 成人AV在线网站| 精品亚洲| 91精品亚洲内射孕妇| 国产AV高清AV无码| 不卡超碰护士AV在线免费播放| 欧美另类自拍 | 欧洲亚洲综合| 丁香九月婷婷| 一区二区三区 日韩欧美| 99这里只有精品| 色大师网站www永久网站视频| 99www.bibizy香蕉资源国产一区二区三区高清 | 99啪啪| 无卡一区=区| 91老熟女视频| 尤物国产一区在线观看| 爱干爱射网啊啊啊| 亚洲国产亚洲天堂| 日韩性爱啪啪视频| 欧美精品久久久久久久久88| 女人爽到高潮久久久| 亚洲凸凹超碰成人| 黄片免费日韩| 婷婷成人五月天| 日本男人插女人的逼黄色| 国产精品久久泡妞网站| 亚洲成人久久一区二区| 日韩精品人妻中文字幕有码午| 日本精品国产视频| 中文字幕欧洲有码| 国产日韩精品无码去免费专区国产| 97福利视频| 天天操av懂色| 91精品久久久久| 岛国片国产成人亚洲播放| 夜夜高潮夜夜爽| 国产精品一区二区密臀| 午夜无码精品免费看性色| 亚洲城人男人的天堂| 中文熟女五十乱码在线| 熟女乱伦A| 欧美午夜色妇色鬼| 日韩精品在线视频,日韩精品……| 手机看片1024你懂的国产| 日韩午夜国产| 精品亚洲成人免费在线| 97人妻色| 97在线免费观看| 日本黄 R色 成 人网站| 波多野结衣之双飞调教在线播放| 超碰99在线| 蜜桃臀一区二区aV| 黄在线| 1024午夜激情男人的天堂| 免费观看性欧美一级| 麻豆av一区二区三区| 97干色| 亚洲激情网一二三四区| 伊人网在线点播| 插欧洲美女欧美精品| 色五月AV在线| 黄色毛片A片| 亚洲天天天| 97最新在线播放视频| 中文字幕第95页| 日韩午夜精品一区二区三区电影| 久噜噜| 少妇无码av专区线| 精品中文一区二区| 人人操人人摸人| 成人资源中文字幕在线观看| 人妻久久久久久| 97伊人网| 在线天堂999| 欧美真人抽搐一进一出gif| 中文字幕人妻色偷偷久久皮| 日本免费一级AAA大片器| 久久同城AV| 国产真实野战在线视频| 中日韩久久久免费看| 啊啊啊啊嗯嗯嗯用力好爽 | 国产美女精品| 欧美在线观看综合国产| 色原狠狠天天天| 大奶啊啊好爽 | 春色综合网| 青青操97| 51久久夜色精品国产麻豆| 台湾佬中文娱乐网久久久久久久久久com| 国产精品无码av| 偷拍99| 久热色情精品| 又粗又长又大国产不卡| 久久久久久久久久久久久久久久9| www.99中文字幕| 欧美日韩精品青青| 情色日播放AV| 操逼逼福利视频| 亚洲色交| 91精品国久久久久久无码| 亚洲偷拍自拍在线视频| 懂色av一区二区三区天美传媒| 一区二区视频你懂的| 亚洲黄色影视| 亚洲国产成人精品999| 日本高清熟女久久一区| 5278欧美一区二区三区| 岛国黄片网站| www男人天堂| 91九九九逼| 欧美日韩成人在线| 国产精品久久久久中文字幕| 蜜臀久久99精品久久久久久婷婷 | 九九热精品| 日韩免费高清大片在线| 人妻激情视频| 成人久久精品| 欧美图片偷拍| 黄网色一区二区三区四区精品| 91视频综合| 色五月AV在线| 无码粉嫩白虎一线天b区| 91成人在线| 99综合网| 伊人网综合在线视频| 97亚洲欧美| 青青草无码视频| 9999伦理视频| 欧美性爱五月天| 精品久久久久久中文| 色哟哟 日韩精品| 91宗合网| 国产伊人精品在线| 锕锕好爽 死我在线观看| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 欧美国产一区二区三区麻豆传媒| 亚洲欧美精品一区天堂久久| 丝袜剧情| 天天操天天干一区二区 | 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 亚洲午夜福利视频| 人人潮人人摸| 日韩中文字幕国产| 最新日本中文字幕| 国产欧美在线观看免费观看| 后入式免费视频| 四虎884| 熟女高潮精品一区二区| 日韩97视频| 超碰欧美97资源| 久久骚| 国产性爱欧美性爱在线 | 六月天婷婷| 亚洲国产尤物yw在线观看| 老司机深夜18禁污污网站| 无码精品久久久久久亚洲| 久久精品店| 中文字幕AV中出| 日本高清一本二本免费不卡| 国产深喉| 亚洲图片 欧美电影| 婷婷激情五月综合| 208天天久久九九九| 97国产精品久久久久| 亚洲诱惑天堂 | 九九九九免费高| 天堂伊人久久| 日日嗨AV一区二区夜夜| 久久中久文96| 国产suv精品一区| 97日韩欧美亚洲| 91精品导航| 噜噜噜噜久久久精品免费| 91热热色| 天天综合~91| 国产高清午夜成人在线观看| 亚洲欧美日韩制服另类| 日韩高清黄片| 热99这里有精品综合久久| 亚洲日韩视频二区| 国产91乱伦| 精品国产乱码久久久久久口爆网站| 少妇高潮对白在线观看| 亚洲av乱伦色图网站| 深夜操逼网| 久久精品老司| 亚洲一区制服诱惑| 亚洲精品国产拍免费91在线| 九月伊人中文字幕| 另类天堂| 日韩三级天堂在线观看| 九九色精品| 91久青| 欧美熟女丝袜| 人人操人人叉人人插人人| 自拍鲍鱼一区在线高清观看免费| 九月婷婷| 欧美色997| 国产亚热在线久久| 香蕉人欧美综合| 日本色色色视频| 欧美操人| 亚洲视频一二区| 欧美最婬乱婬爆婬牲视频| 日本天天干天天操一区| 国产精品视频内谢女人| 特级丰满少妇一级AAAA爱毛片| 色色激情| 伊人一区二区三区| 99re99在线视频| 日韩欧美大片免费高清啪啪| 亚洲一区二区三区在线激情| 乱色视频中文字幕| 双插在线| 东京太热男人的天堂久久久| 欧美1区二区三区公司 | 插入逼91| 婷婷亚洲五月***久久| 亚洲AV资源| 亚洲 欧美 日韩另类 麻豆| 翔田千里无码一区| 99热官网| 久久亚洲色图中文字幕| 午夜传煤十二区精品| 熟女精品va中文字幕| 操狠狠| 亚洲自拍青操视频| 操婢日韩| 爱爱动态120秒| 大香蕉琪琪日本女优不卡| 秋霞免费无码视频日韩A片| 亚洲国产日韩欧美熟妇在线| 校园春色综合色| 国产精品天堂| 国产AV高清AV无码| 男人天堂.AB| 欧美激情高清性猛交| 国产精品极品美女视频| 色婷婷综合网站| 婷婷久草| wwwxxx日本爽| 美女诱惑在线一区| 久久精品国产亚洲AV清纯| 制服乱伦| 四虎免费视频| 嗯啊抽插大香蕉网页| 亚州伊人色综台| 精品日韩| 狠狠久久亚洲欧美专区| 中日韩久久久免费看| 秋霞无码av鲁丝片一区| 禁十八久久| 国内偷拍精品一区二区| 97超碰国产精品| 香蕉99秘 一区精品蜜桃臀| 日本性爱网址| 男人的天堂2018东京热啪啪啪| 亚洲黄色电影| 欧美在线播放aaaa| 9ⅰ久久久天天| 亚洲欧综合另类无码一区| 成人久久精品| 亚洲九月丁香| 亚春色色| 狠狠干婷婷| 久久久久久久久久久久97| 91麻豆va国产精品| 伊人精品国产| 99熟女| 91熟女网| 综合影院亚洲| 性色AV蜜色av色欲av| 啊啊啊好湿久久| 中文日本免费高清| 青青爽| 一级做a爰片性色毛片久久| 婷婷伊人一区| 91碰超| 久久九操在线观看| 天天插天天操| 97色香蕉| 嗯阿好爽好紧| 亚洲综合91| 色五月天AV| 日韩亚洲中文有码视频| 91欧美巨乳| 99久久久久| 欧美人妻少妇| 日韩人妻大香蕉| 国产家庭乱伦表演| 乱欲性色| 九九九九九九九| 五月天婷婷基地| 麻豆尤物视频网| 99九九久久| 国产色呦呦| 91女日逼| 国产传媒日本欧美专区| 国产一级不卡在线观看| 97久久精品不卡| oumeisetu综合| 亚洲春色欧美激情自拍| 欧美最大综合网| 色婷婷网| 熟女激情综合网| 97精品第3页| 男人天堂一区二区| 精品日韩中文在线| 日本1区2区不卡视频| 91欧美成人色站| 91免费看一区二区三区| 伊人热综合| 先锋色眉乱伦资源| 久久久无码国精品无码三区三区| 欧亚洲精品有视频| 天天摸夜夜操视频| 欧美熟妇精品黑人巨大91| 国产一区二区精品久久99| 久久99网站| 天美传媒AV国产在线| 99www.bibizy香蕉资源国产一区二区三区高清 | 婷婷伊人五月| 亚洲成人性爱网站在线播放| 另类视频在线| 婷婷激情五月天小说网| 伊人青青一区成人视频在线观看区| 国产成人精品必看 | 欧美日韩另类在线播放| 无马一区二区| 性生活无遮挡纯毛片在线看| 丁香六月激情| 亚洲图片欧美| 伊人久大| 欧美色天堂网在线视频| 黄色AV影视| 在免费jIzzjIzz在线视频| 九九九九九九视频免费| 中文字幕午夜精品久久久| 欧美日韩淫加| 开心五月天激情网| 在免费jIzzjIzz在线视频| 国产精品福利资源在线尤物| 亚洲天堂电影网99999| 久久大线蕉一区| 久久怡红院| 福利在线黄片| 可以在线观看的黄色网址| 麻豆精品一区二区三区四区免费观看| 超碰日韩美妻| 国精综合一二三区影视| 日本不卡卡一区| 蜜臀操逼黄色视频操的好爽| 久久人人爽爽人人爽人人片αV| 久久产精品一区二区三区电影| 四虎精品亚洲| 亚洲极品| 操少妞在线视频| 天天α片| 一区 欧美 日韩 麻豆| 久久xx| 老外又粗又长一晚做五次| 尤物av网站免费在线播放| 一本色道综合久久欧美日韩精品| 亚洲交换| 超碰视97中文| 在线五区| 五十路人妻在线| 国产少妇高潮| 欧美最婬乱婬爆婬性视频 | 亚洲视频中文一区| 国产 日韩 欧美一区| 日韩97| 欧美日韩性爱精品| 中国女人内射6XXXXX| 欧美亚洲一级在线观看| 久久综合国产精品国产| ,成人免费啪啪视频| 国产成人自拍视频视频| 国内精品a| 亚洲AV无码乱码| 成人线上超碰| 超碰在线人妻中文字幕| 欧美日韩另类在线| 中文字幕三四区| 欧州一区二区三区四区| 午夜亚洲WWW湿好大| 人人看人人插| 天天弄天天操| 日本高清_区二区三区| 成人八戒网站| 全球成人中文在线| 成人看片网站| 操一区| 天色综合网| 麻豆一区在线| 亚洲天堂一区二区| 久热伊人| 1人人看人人摸人人操| 手机看av网站在线看| 亚洲成人av色网| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 成人情色一区二区| 好看的91视频| 婷婷丁香人妻 | 少妇一级无码精品| 91动漫操逼视频| 婷婷激情啪啪| 大香蕉男人的天堂| 国产精品成人午夜福利| 韩国免费播放一级毛片| 亚洲国产婷婷在线播放| 色五天伊人| 在线强奷到舒服的无码视频| 日本熟妇一区二区三区| 日韩钢筋无码高清啾啾啾| 国产精品乱码久久久久久久| 久久αⅴ| 国产日韩在线播放av| www…国产操逼| 天天做天天爱天天爽| 少妇毛片久久| 99热国产精品| 91久久久亚洲| 97国产高清视频在线观看| 欧美成人都市人妻| 嗯嗯啊啊好大好爽| 中文字幕精品码亚洲| 小视频国产| 亚洲制服欧美另类内射| 日本一二三高清| 东方亚洲在线操逼天堂| 国产97免费视频| 人人操,操人人| 欧美超碰9798| 天堂精品一区| 日韩免费三级黄片电影| 久热久| 嗯……啊…嗯嗯…啊…好舒服| 青青草日韩免费观看高清在线| 九九九九热| 久久久久成人亚洲国产| 日本九九久久99播| 国产在线激情| 亚洲av综合色| 久久免费看高潮毛片韩国| 91n处女在线观看| 色黄色美女大长腿午夜视频| av天天在线观看| 亚洲自拍欧美色综合| 亚洲欧美另类小说| 一区二区三区机械有限公司| 亚洲色性情三级| 免费国产视频| 国产精品午夜高潮呻吟久久av| 人妻美腿丝袜制服诱惑综合天堂-| julia国产在线| 日日碰狠狠添天天爽超| 91熟女.com| 搡老女人老妇女AAA一VU麻豆| 午夜欧美J进J出白浆流出久久久| 无码天堂| 青娱乐av在线| 精品九九九| 久久久久密| 男人天堂久久精品| av操操不卡| 小说区 图片区色 综合区| 欧美男人一区| 亚洲性天堂| 日韩有码免费视频| 97超碰中文在线| 国产熟女少妇一区| 男人的天堂 在线一区| 在现视频女上位好爽| 91精片| 四虎影视在线| 9国产超碰| 久久999久| 18禁美女裸体无遮挡啪啪| 乱久久久| 日韩性爱视频免费在线 | 射丝袜高跟鞋99| 91视频伊人| 色 亚洲 91| 久久精品国产亚洲AV无码电影| 加勒比人妻综合| 亚洲偷拍自拍在线视频| 国产精选视频| 日韩美脚一区二区网站| 日韩性爱小视频| 精品96久久| 蜜臀久久精品久久久久视频| 操我无码| 亚洲视频精选| 熟妇艹鸡八| 探花熟女,姿勢到位,體驗感也到位| 亚欧操逼片在线观看 | 国产精品爽爽va在线观看98| 国产夫妻性生活视频| 伊人成人中文字幕久久网| 亚洲日韩人妻中文字幕一区| 久草男人天堂| 成视频在线观看免费看| 一区二区三| 欧美色图 人妻| 五月天婷婷色色| 亚洲麻豆av一区二区| 激情欧美日韩女同久久| 亚洲各类熟们中文字幕| 欧美人黑A片无码免视费| 日本东京热大香蕉a片| 欧洲熟妇xxXx欧美老妇裸体| 97色碰| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 东京热双插| 国产成人主播| 九九AV| 国产日韩精品人妻久久久久色欲网站| 国产日产欧产美韩系列麻豆免费| 乱精品一区字幕二区| 影音先锋视频在线| 欧美精品一二三| 伊人网在线视频| 长长久久曰曰夜夜成人网| 日本一区视频在线观看| 久热伊人| 日影院久久婷婷夜夜网| 天天综合精品| 无码操逼网| 天天色图| 深喉吞精| 青木玲在线不卡| 丰满人妻一区二区三区在线| 欧美日韩操逼嗦吊| 第四色奇米影视777| 久久粉色| 国产熟女自拍| 天天影视射综合网| 午夜精品99久久久久传媒| 亚洲综合中文字幕有码| 国产高清视频无码在线| 久久精品区| 国产日产欧产美韩系列麻豆免费| 人妻美腿丝袜制服诱惑综合天堂-| 99热只有这里有精品| 老司机天天操| 亚洲中文字幕在现观看| 九九九不卡| 久热大香蕉网站| 九九九九日本| 国产有码一区| 欧美日韩性感| 国产AV高清AV无码| 国产欧美一级在线观看| 九九精品无码专区免费| 激情色图| 超碰在线一区| 国产精品农村妇女| 91男人综合| 九9精品| 岛国不卡超碰护士AV在线播放| 91色黑人少妇| 男人天堂.AB| 超碰97欧美在线| 啊啊啊好爽快点啊啊啊嗯嗯| 精品国产精品一区二区| 最新日产中文在线麻豆| 欧美日韩在线国产在线| 伊人久久综合影院| 吖在线不卡一区二区国产剧情| 亚洲加勒比久久日本道| 97视频免费播放| 91岛国动作片| 激情欧美97| 加勒比综合88| 亚洲激情视频| 久操免费在线| 国产精品九九九| 啊啊啊好想要| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 99热网站| 狠狠色综合网| 国产欧美日韩在线观看麻豆传媒公司| 人人爱操| 亚洲有码 欧美精品| 天天添天天干电影| 青青操97| 婷婷丁香一区二区三区| 操死我了嗯嗯嗯| 亚洲色图 综合| 加勒比性爱成人在线| 天天干夜夜操一区二区| 美女t无毒不卡不卡| 亚洲AV无码天美传媒一区| 天天狂操夜夜狂日| 国产精品久久泡妞网站| 色区97| 啊啊啊啊操死我| 午夜舔阴达高潮视频免费看| 一区AV| 上海一级黄片| 成人日本视频人妻在线| 超碰在线91| 91色艳| 超碰人妻中文在线| 91n免费处女| 日韩无码第3页| 国产精品白丝| 91香蕉视频在线观看免费| 在线综合色| 婷婷综合久久| 少妇毛片久久| 色拍偷亚洲| 精品国产99999| 亚洲 无码 偷拍| 美国一区二区三区视频| 日韩人妻无码专区| 67914在线精品观看| 天天综合网~91入口| 天堂网亚洲区手机版| 日日摸天天爽夜夜欢| 欧美日韩国产另类综合| 亚洲国产激情国产av| 亚洲中文字幕有码视频一区二区三区| 99xav| 国产精选视频| 国产精品爱欲| 婷婷丁香六月| 人妻爽爽啪视频| AV有码在线|