久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码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
返回資訊列表
精品国产乱码久久久久久蜜臀| 国产福利小视频高清在线观看| 久草视频观看视频在线| 五月婷婷激情网| 亚洲色图大香| 少妇人妻在线| 多毛小伙内射老太婆 | 蜜臀视频网站| 精品国产肉丝袜在线拍国语| 欧美色图99| 日韩欧美性吧婷婷乱伦大香蕉| 综合一区二区影视| 100啪啪视频大全| 婷婷久久五月天| 色在线69堂| 明星性猛交ⅹxxx乱大交| 国产乱码精品一区二区三区四川| 青青草吊丝| a人欧美综合天堂麻豆| 久操国产在线| 亚洲综合婷婷| 96国产精品| 欧美高清18A片| 国产欧美一区二区| 免费自拍三级综合| 亚洲有码第一页| 91被操| 欧美日韩高潮喷水91| 中文区中文字幕免费看| 超碰97爽| 一起草三级AV电影在线观看 | 日日AAvv| 操高情无码| 精品久久久久瑟瑟| 欧美性爱日韩性爱| 精品一二三区女同| 天天操夜夜嗨| 亚洲无限观看| 亚洲国产一区二区三区四区国产| 岛国999| 一区操逼日比视频| 在线观看A啊啊啊| 免费a级毛片av无码久久精品中文字幕| 国产精品久久泡妞网站| 99热色精品| 哈哈操 大香蕉| 4399成人黄A片| 欧美少妇色综合| 欧美顶级黄色大片免费| 91痴汉| www.99热| 欧美国产精品| A级片一区| 精品国产99| a片自拍直播视频| 美女诱惑在线一区| 六月婷婷激情| 无码 黑人一区二区三区| 97色欧州| 人妻精品视频一区二区| 欧美色图成人网一区二区 | 中文字幕十五区| 久久精品午夜国产亚洲AV无码| 久久久久久久久九九久孕交| 日韩女模中文造逼| 亚洲av噜噜噜噜噜噜| AV天堂电影网| 大香蕉黄色一区| 97碰碰色| 青青草成人视频在线观看二区| 日韩人成网站在线播放| 欧美在线播放| 99国产精品| 欧美亚洲成人在线一区二区三区| 99热这里都是精品| 一区二区影院| 免费操逼91| 国产熟女二区| 大香伊人在线一区| 综合网色| 亚洲蜜乳av| 久久久久久9| 久久夜夜夜| 综合网色| 曰本人妻人人澡人人夹| 九九九九免费| 安微少妇操BBB| 熟妇艹鸡八| 91粉嫩萝控精品福利网站_精品影音先锋国 | 色69大色97香蕉| 精品国产一区二区久久| 精品超碰国产| 日韩av不卡在线看| 亚洲视频中文一区| 国产女人视频三四五区| 一级黄碟在线观看| 最新av中文字幕高清| 亚洲成熟国产精品美女| 看一级特黄a大一片| 婷婷爽人人婷婷爽视频| 9丨久久九九九| 超碰97在线中文| 精品无码一区二区| 久久性爱视频| 91精品91久久久中77777| 国产精品成久久久久午夜午夜| 久久久久久久久国产| 中文字幕丝袜美腿| 少妇一区二区三区在线观看| 男人天堂久久精品| 91色艳| 久久9视频| 十八岁啪啪视频免费看| 国产又黄又爽又刺激久久久久久| 一中国女人毛片水真多| 无套后入双马尾| 少妇丝袜在线观看AV| 91丝袜美女国产| 我爱大香蕉| 免费中文在线| 综合激情五月丁香| 一区二区三区激情在线观看| 绯色一区二区三区不卡少妇| 中文字幕视频二区| 亚洲天堂久久久久久粉红视频| 国产91丝袜 在线播放| av东京热男人的天堂| 国产白嫩精品久久| 久久午夜伦| 欧美在线干| 免费成人在线观看91| 国产精品美女| 九九九热| 密乳AV免费观看| 26uuu国产亚洲综合| 偷拍精品一区二区三区| 无码一区免费在线不卡| 久久综合国产精品国产| 一,爱啪啪,在线免费视频| 午夜超爽| www.激情| 欧美色图亚洲特色| 久久熟女久| 玖玖大干人妻| 夜夜欧美| 久久久久久99AV无码免费网站| 无遮挡男女激烈动态图| 国产最新小视频在线播放下载 | 欧美日韩丝袜 | 成·人免费午夜在线观看| 丝袜美腿亚洲| 国产探花精品在线| 欧美毛片在线网| 嗯嗯啊在线视频| 蜜桃久久久久久久| 久久宗合亚洲| 99re视频在线播放青草| 黄色免费网| 97精品熟女少妇一区| 91动漫操逼视频| 日本 欧美 国产一区| 五月天丁香网| 天堂蜜桃无码视频一区二区| 精品国产一区二区三区久久久蜜臀| 97色涩| 天堂亚洲精品| 九九九九久久久久| 国产精品女久久久久av爽| 久久婷婷综合国际产色怕| 国产毛片精品一区二区色欲黄A片| 日韩免费人妻色情网站| 裸体1区| 78操B| 超碰在线人妻中文字幕| av国产无码| 亭亭丁香激情| 美女十八禁| 日韩激情无码影院| 中文一区二区婷婷视频| 一区二区国产视频在线观看| 久久久96精品| 日本高清免费一本视频在线观看| 亚洲各类熟们中文字幕| 国产精品久久久久久久久久久久久久久久久久| 亚洲黄网在哪免费看| 婷婷成人五月天| 中文97国产| 久久熟女嫩草成人片免费| 国产精品第一页国产大屁股视频免费区 | 精品日韩人妻视频| 农村妇女一级二级三级视频| 激情婷婷丁香| 99少妇| 日韩无码三级影院| 精精夜夜| 韩国三级色呦呦| 亚洲中文字母在线播放| 女人的天堂大香蕉网| 青青操国产夫妻| 综合操逼| 中文字幕久久亚州无码| A 天堂| www.婷婷六月天| 综合网亚洲1| AAAA级日本片免费视频| 色好看av| 草草电影院| 精品一区二区人妖| 1204金沙人妻懂旧版免费| 亚洲影视综合| 精品人妻一区二区三区-国产精品 一个人在线看的黄色电影网站 | 国产精品一区二区麻豆| 日本三级A片网站com| 九九毛片这里只有精品| 91久久青青草原精品| 大香蕉免费乱伦视频| 亚洲欧洲色情高清| www.亚洲黄色| 人妻激情偷乱视频一区二区三区| 麻豆一区二区AV天美| 日韩中文字幕二区| 麻豆色约约| 天天躁日日躁AAAXX| 国产91专区| 97国产成人精品免费视频| 日本加勒比无码专区一二三| 日韩亚洲国产视频| 嗯~啊~快点 死我视频免费看网站| 国产隔壁老王影院在线| 久热大香蕉网站| 一区二区三区 日韩欧美| 欧美性,亚州色| 精品九九九九| 久偷拍| 欧美精品日韩久久久九| 精品人妻视频一区二区在线播放 | 亚洲宗合网| 欧洲欧美视频一区二区| 欧美少妇色综合| 国产欧美日韩一区二区三区| 日韩本不卡视频在线观看| 久久久中文| 立川理惠被中出无码| 色蜜AV| 91丝袜在线观看| 91一起操| 亚洲国产精品无码AV久久久| 色欧洲97| 91精品国产综合久久久蜜臀| 网站A V在线| 91网18| 国人欧美精品一区二区| 青娱乐黄色录像| 欧美日韩人人精品| 亚洲国产一级精品毛一级精品看免费视频| 操逼逼福利视频| 综合一区二区影视| 丁香久久| 草草影院日本第一页| 亚洲中字慕不卡| 欧美日韩m| 性饥渴少妇av无码毛片| 亚洲情色 无码专区| 九九热精品视频在线观看| 日本操逼视频在线| 亚洲情色 自拍| 任我爽视频在线观看| 中国大陆国产高清AⅤ毛片| 欧美激色| 天天日日日射| 日韩精品在线观看网站| 国产亚洲99久久精品熟| 99热精品在线观看| 精品一久久久| 一品道视频一区二区三区| 欧美精品成人在线播放| 国产毛片毛片4p懂色| 日本999精品| 色99色| 911av网站免费观看| 日韩欧美传媒一区国产| 亚洲区小说| 欧美另类自拍| 日韩三四五区| 中文字幕成人| 五月天激情四射| 久久亚洲中文字幕视频| 久久香蕉国产线看观看亚洲女人 | 黑白配性爱AV成| AV高清一区| 日本久久99| 黄片aaaaa一区| 久久久久久久九九九九九九| 91无遮挡| 少妇高潮一区二区三区在线| 1二区9| 欧美成人9797| 欧美性猛交美女自慰91| 99激情视频| 立川理惠加勒比无码| 国产理论视频在线播放| 国产精品自在线发布| 日韩性爱免费观看视频| 78久久| 99re99在线视频| 久久宗合亚洲| 久久久99999久网站| 亚洲综合另类欧美久久久| 男人天堂2012| 亚洲另类久操网| 婷色五月| 国产人妻精品久久久一区二区三区 | 久久久久久午夜男人的天堂| 五月丁香婷婷色| www久久99| 人妻少妇av在线观看| 日韩丝袜二区| 国产超碰在线| 亚洲国产成人精品无码专区| 1禁看欧美黄片免费看| 日韩综合无码色欲vv| 国产日韩欧美操逼视频| 人妻中文字幕精品无码| 欧美午夜一区二区三区| 4399成人黄A片| 激情五月天视频| 女优免费一区二区永久| 97人肏| 91亚洲不卡一区| 狠狠搞 亚洲91| 一牛影视久久久一区二区三区| 亚洲国产激情国产av| 5月婷婷6月六月丁香| 日韩欧美tv一区二区在线观看| 国产一区二区成人av在线播放| 男人的天堂免费| 国产在线播放成人免费| 日本东京热久久久电影| 欧美偷拍区| 精品亚洲国产成人精品| 欧美在线观看综合国产| 九九热视频在线观看| 99精品无码| 国内91熟女人妻丝袜天天精品视频在线| a一区二区三区乱码在线| 脫衣舞一区二区三区| 国产精品亚洲美女久久久久| 日韩素人无码一区二区三区三州| 男人的天堂2018.| 欧美综合777| 激情文学小说一区二区| 天美传媒AV在线播放| 国产一区免费午夜视频| 久久这里只精品99re66图| 日本色色色视频| 伊人AAA| 10000部十八禁看电影| 五月天色电影| 97亚洲精品超碰| 国产野战露脸在线播放| 熟女精品一区二区三区| 日韩人妻精品中文字幕| 久久久久久加勒比| 中文字幕中文字幕一区二区| 男人的天堂2019AV| 欧美亚洲清纯| 日韩三A大片在线观看| 久久婷婷六月综合| 亚洲情色综合网| 亚洲精品久久久久毛片A片拉屎 | 国产视频第二页| 亚洲国产精品99久久久| 九九精品热| 97色色,97综合| 91色宗合| 亚洲欧美日韩精品久| 香蕉综合网| 欧美亚洲宗合色性图| 亚洲人久久久久日| 久久黄色性爱视频| 黄色十八禁网站| 深夜国产福利| 综合色99| 亚洲中文字幕久久无码精品| 亚洲av综合色区无码一| 天天看特黄的免费网站| 9久久久久久| 免费啪啪一级视频| 好爽免费视频,| 中文字幕精品免费一区二区| 成人婷婷丁香| 好涩综合| 99热这里只有精品8| 超碰97首页| 午夜国产乱伦视频| 国精品一区二区三| 日韩兔费看黄片| 亚洲国产欧美中文永久| 试看福利| 中文字幕高清20页视频| 看日韩操逼| 嗯嗯,好大,好爽,好骚| 国产精品一区二区密臀| 大香蕉久操| 草B在线| 色情乱伦AV| 2017大香蕉国产精品久久| 免费观看成人www精品视频| 大香蕉免费乱伦视频| 亚洲色香| www.久久最新地址| 成人一级二级| 亚洲夜夜欢无码一区二区 | 成人无遮挡毛片免费看| 久久天天躁日日躁狠狠躁| 夜夜欢天天干| 人人色97| 日韩一区二区精彩视频| 99精品伊人| 一本久道在线综合视频| 亚州色图狠狠干| 中文人妻av高清一区| 艳尻美人妻| 欧美日韩免费性爱| 天天肏夜夜肏| 国产精品欧美日韩久久| 色色青青久久| 五月婷婷久久综合| 亚洲精品97| av操操不卡| 十八禁视频一区二区| 国产乱人妻精品入口| 嗯啊抽插大香蕉网页| 日韩二三区| 手机在线播放国产福利| 国产白丝网站| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 久久久久久性爱视频| a片 xxxx受爽视频| 97精品视频免费| 欧美十八禁导航成人| 亚洲人码13| 99热综合| 欧美夜夜骑视频| 国产女生在线| 欧美欧美啪啪视频| 亚洲自拍小说| 日日夜夜骚| 家庭乱伦国产| 伊香蕉综合久久久久久久噜噜噜| 日日夜夜骚| 波多野结衣一级视频| 国产久久久久影院老熟女| 久久久中文| 国产91av在线播放| 97超碰欧美精品| 亚洲日韩av一区二区三区百合| 黄色AAAAAAAAAAA大片| 国产91美女视频| 男女激情中文字幕| 久9视频| 亚洲天堂2020| 青操影院| 亚州 综合 色图| 九月婷婷| 亚洲一区二区性爱电影| 在线人成亚洲视频免费观看| 这里都是精品| 综合一区二区影视| 99re69综合| 九九Av| 国产精品婬乱一级毛片彝族| 天天综合欧美| 日比av无码| 中文字幕诱惑制服人妻丝袜美丝袜美 | 九九九九九用不成了| 丁香五月激情啪啪| 91干熟女| 色爱三区| 老司机射| 人人摸.人人色| 亚州综合色| 亚洲春色欧美| 一二三四视频在线社区中文字幕| 日韩在线女优天天干| 99精品在线播放| 无码人妻丰满热妇又大又粗| 亚洲欧洲综合av在线| 日韩性爱一级片| 精品制服美女中文一区二区三区| 综合91网| 97一本大道亚洲一区| 丁香五月激情综合| 97干在线| 男人的天堂2019AV| 亚洲日韩一区电影| 精品精品精品| 亚洲第一页色| 国产一区二区三区中文字幕| 婷婷六月天| 狠狠干综合| 人妻久久久久久| 五月婷久久| 欧美在线干| 国模不卡| 亚洲 欧美 手机在线观看| 日韩Va亚洲va欧美Ⅴa久久| TS人妖另类精品视频系列| 色色青青久久| 欧洲一区二区| 大香蕉伊人75| 亚洲精品一区二区日本| 国产又黄又爽又刺激久久久久久| 人人么人人操| 日日插夜夜| 老司机老司机午夜影院| 国产久久av| 色婷网| 精品国产人成在线| 岛国成人av在线播放网址| 偷窥自拍亚洲天堂网爆| 亚洲综合五月天婷婷丁香| 玖色AV| 亚洲综合影视| 久久中出在线| 欧美极品色| a啊啊啊啊啊啊啊啊一区二区| 91色插| 欧美性爱精品七区| 国产理论视频在线播放| 亚州免费啪啪视频| 色婷婷影院| 久久久久久久人妻| 蜜臀久久一区二区| 色香阁在线| 极品久久久久久久久久久久久久| 欧美精品欧美精品系列| 欧美色青| A一区片| 最近2019中文字幕国语免费版| 四虎影院成年人片| 欧美少妇一区二区三区| 99久在线精品99re8热视频在线| 噜噜噜噜天天狠狠| 18禁无码永久免费无限制| 欧亚乱色熟女一区二区| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 久久激情视频| 加勒比日本在线| 亚洲成人在线乱码色午夜| 成人国产视频在线观看| 久草免费在线一区二区| 少妇无码太爽| 爱丝福利| 国产家庭乱伦性爱视频| 欧美综合区| 亚洲棕合电彰| 蜜臀99久久精品久久久久久| 极品综合| 欧美熟妇视频| 日韩本不卡视频在线观看| 亚洲一区在线观看欧洲| 丁香五月激情网| 亚洲色图自拍| 天天看天天日天天操| 天天看,天天做| 亚洲人在线| 密臀在线一区尤物| 色噜噜人妻丝袜a∨先锋影| 嗯~啊~快点 死我视频| 午夜亚洲| 熟女人妇一区二区三区| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 久久一区二区三区入口| 欧美 综合| 中文字幕在线免费观看 | 疯操AV| 免费?级毛片无码?∨蜜芽试看| 五月天激情小说| 欧美另类天堂| 国产大学生口爆吞精合集| 天天看人人操屄犊摸阴| 探花视频免费观看国产专区| 五月婷婷六月天| 97日韩欧美亚洲| 日韩中文字幕在线视频观看| 日韩熟女精品无码专区一区二区| 在线天堂资源亚洲| 操婷婷逼| 中出20p| 秋霞无码av鲁丝片一区| 人妻在线大香蕉| 国产亚洲精品A在线观看下载| 超碰日本97美女人妻人人玩人人爱| 日韩综合第八区国产精品| 天天视频黄网站| 二三四区精品| 色综合av男人天堂| 91无码人妻| 97欧美性爱| 亚洲drav色图| 3D污黄视频在线观看| 欧美人人天天网| 欧美一区二区三区另类精品| 少妇精品久久久| 精品少妇人妻av久久免费| 美女诱惑在线一区| 韩国一级婬片A片无码天美| 白丝jkav| www.91理论| 天美一区在线| 亚洲欧美中文日韩视频中国语| 亚洲骚男同com| 色999五月色| 中文字幕成人乱码熟女精品国50| 秋霞视频一区二区 | 97玖玖人妻| 国产精品久久久久久高清无码免费看| 亚州色站 日韩电影| 久久久久久久九九九九九九| 久神马| 丰满的三级少妇欧美久久久| 97欧美综合| 久久久99久9| 国产成人自拍视频视频| 精品欧美日韩在线观看| 99无码视频| 亚洲色91| 亚洲男人的天堂网| 99热精品在线| 黄色免费一级在线毛片| 屁股久久久久久久久| 99热这里是精品| 免费中文综合精品| 91亚洲欧美综合高清在线| 丁香五月天堂网| 欧美18老人禁| 久超碰这里只有精品| 青青11操操操操操操操操| 亚洲色欲天天天堂色欲网女| 在线电影亚洲色图| 色婷婷综合久久久久中文一区二区| 国产精品视频麻豆入口| 国产熟女无套内射| 欧洲小说色图视频另类| 日日夜夜干| 欧美一区二区三区入口| 日本媚薬中文字幕在线| 亚州高清色综合| 婷婷激情五月| 男女激情黄色网址| 国产精品女aA片爽爽视频| 97草草| 日韩天堂av电影在线观看| 亚欧国产无码精品在线| 亚洲 无码 偷拍| 97人人色| 91久久精品国产| 亚洲人妻在线一区| 99这里只有精品| 乱老熟女一区二区三区| 五月天激情网图片| 秋霞免费AV| 婷婷伊人五月| 天堂成人网| 亚洲诱惑天堂 | 国产精品视频精品一二| 欧美色涩| 精品日日人妻| 嗯~啊~快点 死我视频免费看网站| 九色97| 99久久9| www亚洲免费| 男啪女色黄无遮挡免费观看| 婷婷人妻激情| 国产精品白丝AV| 精品久久九| 无码视频一区二区| 中文字幕少妇色| 欧美.亚洲.另类.丝袜.制服.诱惑| 欧美自拍偷拍综合图片| 久久久96| 亚洲不雅视频1区二区| 久久亚洲日韩国产欧| 九区国产| 玖玖爱综合| 伊人97色天使| 成人av免费观看| 91干熟女| 伦伦成年午夜免费视频| 国产成年女人免费视频播放a| 国产视频人人网| 色噜噜国产精品视频一区二区| 久久精品六区| 亚洲好色人妻| 久草草一二三四区久久| 亚洲自拍一区夜夜操| 欧美亚洲丝袜美女电影| 欧美色图片91| 97天天综合网| 久干网| 色综合20p| 激情综合网一盗摄| 人人澡综合涩| 四季AV综合网址| 欧美亚洲影视| 后入式在线免费观看60秒| 蜜桃久久久久久久久久久久| 大香蕉欧美国产日韩高潮| 91高跟美女在线播放| 亚洲自拍一区夜夜操| 天天看高清麻豆| 少妇99| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 国产无码久久高清| 亚洲成a人v欧美综合天堂下载| 啊啊啊好多水| 男女做爰猛烈动高潮A片免费应用| 综合久久久久久久久91| 亚州一区二区成人片免费| 户外裸露刺激视频第一区| 男人的天堂一区三区| 91狠狠综合久久| 欧美性爱97超碰| 天天综和| 久操av在线| 99热销国产这里有精品| 天堂网亚洲区手机版| 欧美天天弄| 欧美自拍偷拍综合图片| 国产女s强制榨精视频| 嫩草一区二区在线观看| 国产精品宅男免费| 五月婷婷综合激情| 一区二区精品更新提醒| 久久久精品一区二区| 男人的天堂kva| 人妻夜夜爽天天爽三区麻豆AV网站| 亚洲天堂男人天堂网| 影音先锋日本一区二区| 天堂种子在线www网资源| 丝袜熟女2P| 欧美 综合 亚洲| 96麻豆精品一区二区三区| 综合久久97| 操逼视频亚洲| 天天综合网国产| 夜夜久久| 国产精品久久久久久久久久久久久久吹 | 国内自拍 日韩激情 99| 69AV女优男人的天堂| 美女网站黄页| 国产自制av蜜乳| 日本色色色视频| 九九亚洲视频| 丁香婷婷激情五月天无毒不卡| 91色伦| 成人国产二区三区在线,男女精品。| 国产91 丝袜在线播放00-百度| 欧美日韩*字幕一区| 色综合色色| 亚洲综合图片在线| 91亚洲综合| 思思热免费视频观看| 嗯嗯啊啊用力视频免费| 日韩欧美中文字幕搭讪巨乳美人妻视频| 九久9热| 曰本特级特黄特色黄色A级网站高清在线免费看| 插老姨肥穴| 91路www| 18禁看网站一区| 日本片日本片祼观看网站在线看中文版网页在线看 | 激情五月天婷婷| 国产在线精品电影观看| 骚日日av| 亚洲无吗在线视频| 国产四虎在线| 欧美性五月| 中国一级操逼视频| 国产农村妇女精品一| 嗯嗯不要视频| 人妻一区视频| 黄资源| 综合激情二| 狼人综合婷婷激情四射| 中文乱码字幕观看视频| 717影院理论午夜伦八戒| 97免费视频在线观看视频| 女欧美一区二三区| 亚洲另类久操网| 亚洲天堂加勒比| 免费黄色视频网址| 夜夜爽夜夜摸夜夜操免费视频| 老司机天天操| 操操操操网黑人| 国产婷婷综合在线观看| 五月天黄色av| 99re这里只有精品2| 激情专区综合| 97ai亚洲| wwwss在线观看| 91天堂| 国产成人亚洲精品自产在线| 超碰97COm中文| 国产日韩欧美三级片| 亚洲玖玖爱| 99啪啪视频| 麻豆av一区二区| 亚洲中文字幕av| 97视频900| 色综合久久88色综合久久天天| 亚洲诱惑天堂 | 人妻一区二区三区| 日本成熟少妇A∨网站| 妇女视频网站| 国产精品一级特黄aaa大片在线观看| 目产99999久久999| 无码天天操| 亚洲色图第一页| 亚洲精品人妻吞精av| 精品成人久久久人人亚洲| 色色婷| 欧美97| 欧美72网页| 国产精品无码久久久久2025| 亚洲黄色网址| 亚洲一区中文字幕一区| 久久婷婷成人综合色怡春院| 粉嫩国产精品久久粉嫩| 啊啊啊久久| 亚洲另类色图片| 操操逼操操逼操操逼逼| av橘色网站| 激情久久久| 伊人91| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 1204人成网站色www| 亚洲国产日韩欧美熟妇在线| 精品少妇999| 欧美 日韩 国产传媒| 久久国内| 亚州欧美在线| 国产精品久久久蜜臀| 国产乱人伦AVA麻豆软件.| 男人的天堂视频精品乱在线| 国产人伦精品一区二区三区| 国产日韩欧美亚洲精品95 | 少妇大屁屁| 麻豆天美电影一区二区| 日本性爰一道本| aV中文麻| 国产福利夜| 69精品久久久久中文字幕| 免费试看60秒| 国产丰满熟夫69mpp| 国产一区二区三区影片| 欧美视频一| 久久久91福利姬| 亚洲精品亚洲人成人网| 欧美18 在线观看| 后入合集| 不卡九肏| 色狠狠色| 综合欧美激情网| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 国产精品人妻熟女aⅴ| 人妻少妇精品久久久久久| 久久精品天美| 日本天天色| 黄色AAAAA欧美| 免费精品无码一级毛片牛牛影视| 夜夜做夜夜爽精品视频| 蜜臀AV成人精品蜜臀AV久久| 久久黄片国产一区二区| 亚洲欧美第一页| 人妻夜爽夜夜爽| 91色堂| 久久精品一区| 91原创在线观看| www.狠狠| 午夜影美女日鸡鸡天天视频国产| 搡老熟女免费视频| 超碰97综合网| 97视频新免费| 一二三啪啪专区| 亚洲色图大香| 欧美视频在线视频免费va| 国产高清成人mv在线观看| 欧美v亚洲v综合v国产v妖精| 九色黄站| 麻豆区久久久久亚| 天天干人妻| 蜜臀AV成人精品蜜臀| 色好看av| 五月婷婷综合在线| 女人高潮大叫一级毛片| 少妇高潮对白在线观看| 蜜乳Av成人片网站| 国产亚洲精品A在线观看下载| 色综合一区二区三区| 久9久9久9久9久9久9| 色网1| 青青三级视频| 久久精品中文| 自拍二页| 欧色性第一页| 日本中文字幕一区| 人妻熟妇久草在线| 日韩人妻丝袜美腿中文| 中文字幕人乱码中文字的预防方法 | 久久久久国色αv免费观看| 欧美日韩国产色五月综合在线| 亚洲综合一| 超碰午夜| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊 | 每日更新AV| 亚洲一曲日韩精品| 亚洲一级性爱视频免费看| 啪啪AV导航| 新婚人妻扶着粗大强行坐下| 国产综合操逼高清| 狠狠狠狠狠狠| 久久99国产综合精品女同| 人妻日日夜夜精品| 佐山爱中文字幕| 亚州色图欧美| 久久久久久少妇| av橘色网站| 亚洲人久久久久日| 97精品视频| 国产av激情无码久久天堂| 一级毛片久久久久久久女人18| 艹精品| www.91逼逼.com| 久久免费精品视频免一| 婷婷91| 99热99re超碰精品| 亚州综合图片| 中出20p| 日本阿v天堂在线观看| 热99这里有精品综合久久| 国产无码久久高清| 日本狂喷奶水在线播放212| 一本一道波多野毛片中文在线| A片 AV一级在线播放观看免费| 69精品人人人人| 久草视频制服诱惑| 丝袜天堂网| 日韩丝袜高跟制服在线观看| 成人精品欧洲亚洲| 无卡一区=区| 男人综合网| 91老司机视频| 精品久久久久久无码| 91free福利| 丁香五月婷婷基地| av午夜玫瑰| 超碰97.com| 在线观看亚洲成人精品| 国产精品成人蜜臀AV在线| 日韩久久三区| 天天摸天天舔天天操| 啊啊啊久久| 嗯啊抽插大香蕉网页| 亚洲中文字幕噜噜噜久久久| 国产精品丝袜久久亚洲不卡| 男人天堂网手机版婷婷| av网站在线看| 色婷婷五月综合激情中文字幕| 中文字幕 国产 精品| 精品国产91久久久久久一区黄无| 日本精品一区二区三| 天堂v无码免费视频| 一区在线国产播放| 久久一二三四五六七八九区区| 可乐操在线| 国语国产操逼伊人AV网| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 嗯嗯啊啊的视频| 国产内射爽爽大片| 国产精品国产拍高清AV| 九九九影院| 色99999| 99在线精品观看99| 久久中日麻豆| 欧美乱欲| 99热啪啪| 日韩人人精品| 制度丝袜99| 狠狠干综合| 噜噜噜噜天天狠狠| 国产精品久久久久中文字幕| 六月丁操逼| JuliaAnnXXX888| 婷婷丁香五月天亚洲天堂网| 中文一区二区婷婷视频| 97超碰欧美精品| 婷婷五月天影院| 亚洲图片 91| 久久久久久十| 国产一区二区三区导航| 久久久专区| 亚洲最大成人a毛毛片| 午夜欧美J进J出白浆流出久久久| 亚洲影视综合| 久久久蜜桃一区二区三区| 少妇精品久久| 色老汉玖玖爱| 亚洲中文字幕在线视频一区二区| 四虎 精品 WWW| 综合网91| 少妇高潮99p| a片亚洲一本通视频| 熟女乱伦A| 老女人老91妇女老热女| 中文字幕天堂在线| 内射黑人| 天天狂操夜夜狂日| 屌色在线97视频| www久久精品| 国产成人精品日本亚洲语言| 中文字幕熟女人妻丝袜丝| 黄色片大香蕉| 后入人妻无码| 亚瑟国产精品久久无码| 自拍大香蕉乱插| 狠狠图片青青草| 少妇高潮流水av免费| 亚洲免费精品一区| 一级久久性爱视频| 亚洲情色欧美| 男人天堂一区二区| 男人天堂毛片| 五月综合激情网| 啊啊啊啊好爽好舒服一区二区易域| 五月婷婷六月丁香| 日本天天干天天操一区| 伊人影院在线理论播放| 粉嫩av久久一区二区三区| 果冻传媒A片一二三区| 综合久久中文字幕综合日韩精品| 夜夜欢天天干| 影音综合网| 国产福利在线视频网站| 日日夜夜骚| 精品人体无圣光凹凸| 亚洲精品九九九九九九| 一区二区激情国产熟女| 亚洲高清无毛一区二区| 亚洲美女 晚间男人天堂| 久久久久国产一区二| 18+91网站| 日本熟妇熟色97一本在线观看| 亚洲天堂一区二区久久| 春色综合免费| 蜜臀久久99精品久久综合| 白丝被操91| av日韩中文字幕| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 99久久精品欧美国产| 嗯嗯啊啊视频一区二区三区| 欧美性巨大╳╳╳╳╳高跟鞋| 日韩欧美女求操每天更新| 天天综合,91综合永久| ji熟女.com| 91热| 亚洲综合888| 欧美日韩99| www.av家庭乱伦| 日韩成人人妻网站| 亚91亚洲网| 5月婷婷6月六月丁香| 黄视频免费| 欧美三级偷拍| 午夜精品久久久久久久99热影院| 久久丁香五月婷婷| 人妻偷拍一区二区三区| 国产伊人精品在线| 亚洲精品国产av天美传媒| 日本91白丝| 殴美在线AⅤ| 国产精品直播在线观看直播| 色老大| 久久久99999久网站| 花野真衣| 久久久成人国产精品无码| 亚洲自拍偷拍视频在线| 香蕉色网| 亭亭丁香激情| 你操综合| 色色色综合网| 岛国在线一区二区三区| 八人操人人摸人人看| 亚洲成?V人片在线观看福利| 色综合五月天| 中国人高清www色视频免费| 亚洲91大片| 97超碰jingpin| 婷婷五月色| AV网站高清无码在线观看| 亚洲欧洲成人在线电影| 本道在线| 99RE在线视频精品,这里只有精品| 97亚洲性爱| 色丁香五月婷婷| 亚洲操操| 国产一级片| www成人啪啪18秘 免费| 亚洲日韩精品一区视频在线| wwwxxx日本爽| 人妻献身系列第54部| 2023天天操夜夜操| 五十路熟女人妻一区二区在线观看| 精品人妻15区| 330dv亚洲成年视频网| 91伊人大香蕉| 美骚妇av高清在线| yiren97| 青青草在线成人视频| 青娱乐亚洲热| 91大胆欧美| 亚洲丝袜色| 日韩人妻资源网| 精品 码产区一区二-1080P高清在线www-B029AV | 日本久久女同性恋视频| 亚洲国产精品久久久久婷婷老年| 青青伊人加勒比海| 色眯眯av| 偷拍色图| 97超视频在线观看| 日本九九久久99| 男人的天堂日韩| 日日干夜夜骑| 久久华人网| 久久精品一区二区三区蜜桃臀| 精品人妻一区二区三区-国产| 超碰碰97资源站| 大吊色| 国产成人精品日本视频| 亚洲丝袜二区在线| 色女综合| 欧美经典一区二区三区| 91美女国产在线| 色官网在线| 国产一区二区二区按摩精品啪视频| 殴美,日韩国产伦精品| 啊啊啊啊啊啊啊国| 超碰97最新人妻| 啊啊啊啊啊舒服| 男人的天堂久久| 欧美色图电影| 国产成人亚洲精品无码最新在线| 日韩簧片免费看| 精品亚洲一区在线观看| 亚洲系列第一页| 久久久久亚洲?V片无码V| 五月婷婷爱六月丁香色| 91女在线观看| 性色av一区二区| 91在线国产后入风骚翘臀美女素人|