亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

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
返回資訊列表
劲爆欧美人妖三区91| 性爱1区| 激情另类激情| 青青草国产盗摄一二三区| 超碰成人最新最好看| 蜜桃网熟妇| 亚洲AV无码乱码在线观看性色| 91无码人妻精品一区二区三区蜜桃| 色色色99| 免费观看网黄| 亚州黄站| 麻豆一区在线| 国产精品一二三免费网站| 黄片免费日韩| 热久久无毒不卡| 午夜欧美J进J出白浆流出久久久| 欧美日不卡| 国产极品精品美女视频| 久久久三区二区一区| 欧美视频在线第3页| 一区二区三区精品久久| av一区二区三区四区| 色噜噜日韩精品| 亚洲天堂情色| 欧美一级欧美三级在线观看| 精品久久99| 亚洲自拍天堂| 都市久久精品激情亚洲| 中文字幕后石码四区五区| 大香蕉综合在线| 97色冈| 国产一区二区三区影片| 天天爽夜夜爽夜夜爽精| 囯产精品久久久久久久久久梁医生| 欧美中字不卡| 性爱AV天堂| 亚洲……91| 婷婷91| 91在线精品| wwwxxx日本爽| 尤物视频一区| 国产日韩精品无码去免费专区国产| 精品91| www.91视频网| 男啪女色黄无遮挡免费观看| 亚洲精品九九九| 五月天精品| 毛片99-全集电影手机免费观看完整-B029AV | 日本性爱欧美性爱| 在线免费观看日韩一区| 国产无码高清操逼视频| 自拍偷拍 日韩欧美| 色吧5亚洲| 欧美激情专区| 日韩操啪| 国产一级作爱毛片| 丁香五月久久| 97精品国产97久久久久久免费| AA丁香综合激情| 4399成人黄A片| 99热官网| 9999伦理视频| 美性中文综合网| 人妻无码久久一区二区三区免费| 操曰本熟女| 亚洲se电影| 国产熟女一区二区| 97爱爱| 51国产午夜精品视频| 久久伊人亚洲AV无码网站| 中文精品一区二去| 日本欧美国内在线| 97天天搞在线| 欧美熟女妇同| 青青久日| 香蕉黄色一级视频| 91 亚洲 欧美 日韩 国产 综合| aaaa少妇高潮大片| 欧美1727免费观看视频| 亚洲国成人情色好看电影| 老熟女熟妇| 骚熟女吞| 又黄又硬又粗又长国产视频| 欧美综合网| 午夜操逼不卡| 欧美亚洲玖玖玖| 久久久九九九九| 99re在线视频国产| 欧美日韩1234| 家庭乱伦网站国产| 婷婷激情五月| 任你干在线视频| 亚洲色图欧美色18直播在线| 亚洲av无码成电影在线播放| 色综合色色| 91久久18禁| 久久妇| 久久久一区二区三区四区五区| 亚洲av综合色| 成人熟女视频一区二区三区| 1769一区| 九九在线视频| 亚洲少妇免费视频\| 精品国产一区探花在线观看| 九月婷婷综合| 中亚黄色三级大片| 国产丝袜欧美在线视频| 五月综合色| 超碰97在线中文| 九九九九九九视频免费| 综合五月婷婷| 九热超碰| 国产精品无码论坛| 国产精品日日摸天天碰| www.人人cao| 99操| 日韩成人在线性爱视频| 神马久久久久眼| 欧美激情亚洲情色| 操逼天美3区| 肥臀熟女福利视频一区二区| 亚洲色综合| 在线观看综合精品亚洲| 亚洲色入欧美| 亚洲欧美激情在线视频| 粉嫩久久久极品| 日韩欧美成人性爱在线| 综合天天网| A级在线视频| 久久久久无码| 97超碰碰| 91偷拍欧美亚洲| 啪啪自拍九九综合| 男女打扑克高清网站| 亚洲九九视频| 91精品伊人久久久大香线蕉91| 性爱1区| 人妻干天天| 97色色网| 精品九九九| 日韩精品区二区三区不卡| 欧美爱国产综合、| 99只有精品| 97中文热色| 99色色网| av黄图片在线观看| 免费观看的av| 日本欧美中文字幕| 99热在线不卡| 黄在线| 国产后入内射| 久久久精品国产亚洲伊人| 九九久久久| 日韩天美| 日韩成人在线性爱视频| 福利天堂| 久久九色| 国产精品视频内谢女人| 欧美在线大香蕉| 国产成人欧美一区二区三区的国产| 四季AV一区二区凹凸精品小说| 老外又粗又长一晚做五次| 欧美韩国你懂得在线 | 成人在线午夜视频一区| 国语对白在线播放视频| 久久少妇| 欧美色图片91| 久操网址| 成人av影院在线观看| 亚洲日韩乱码中文无码蜜桃臀网站| 1级午夜影院费免区| 国产精品suv一区| 色yeye成人免费视频| 欧美在线|亚洲| 99综合视频一体| 乱伦色图网址是多少| 啊啊啊啊在线播放| 97二区四区| 国产欧美一级在线观看| 97精品免费| 亚洲精品蜜桃久久久一区二区三区| 亚欧毛片基地国产毛片基地| 就去色综合| 国产传媒1234区| 手机看片1024你懂的国产| www.婷婷五月天| 激情小说成人日本无码一| 欧美丝袜美女电影一二三四区| 99自拍视频| 四虎在线视频| 怡红院网站在线视频| 国产免费大片| 五月丁香色色网| 亚洲最新中文字幕免费| 国产精品大屁股999| 色五月婷婷网| 爱爱60秒免费视频| HEYZO高无码国产精品227| 亚洲欧美综合| 欧美色网络| 色亚州人久干视频在线观看免费版| 男人天堂2019亚洲| 黄色小视频日本txt| 少妇色| 亚洲色棕合| 日韩超碰精品综合| 青青草原人妻| 日本青青草在线| 色色国产| 日本在线一二| 国产欧美美女免费观看视频| 91在线视频免费播放| 婷婷激情四射| 91影视亚洲| 亚州熟妇精品| 男人的亚洲天堂| 亚洲一二三四区机械| 综合一区中亚洲国产成人综合精品| 少妇厨房愉情理伦片bd在线观看| 色原狠狠天天天| 999 久久久| 99只有精品| 天天肏美女| 欧美综合骚| 久久精品亚洲婷婷| 色哟哟-国产专区| 久精品无码av一区二免费国产在线观看| 在线a亚洲视频播放在线| 9Ⅰ超碰| 人妻天堂网| 色九久| 亚洲综合97| 国产精品午夜AV完会免费| 婷婷探花久久精品一区| 72av视频| 欧美成熟性爱精品| 人人操人人摸人人看人人干| 女人喷水视频在线观看| 熟女人妇一区二区三区| 91精品大奶人妻| 99精品在线观看| 啪啪视频mP4| 久草视频制服诱惑| 91精品国产乱码| 亚洲在钱| 国产和美国毛片| 亚洲综合贴图91| 国产精品动态一区二区三区四四| 91殴美| 翔田千里爆乳巨臀无码| 国产麻豆福利av在线播放| 干干干天天| 性爱1区| 天天影视综合网欧美精品| 日韩精品区二区三区不卡| 九九九午夜| 亚洲永久AV无码精品秋霞| 天天插天天射| 精品999日本| 亚州黄站| 国产女s强制榨精视频| 欧美激情中文字幕另类小说| 青青草日本无码| 精品一久久久| 熟妇人妻精品一区二区| 热思思免费视频| 无码精品蜜桃一区二区三区ww| 亚洲中文字幕精品久久久久久直播| www.99热| 后入式999| 精品久| 国产美女mm131爽爽爽爽| 黄色一级视| 黄色二级片网站| 中文字幕欧美日本乱码一线二线| 婷婷九月丁香| 亚洲精品99999| 日韩欧美操逼xxx| 国产一区二区三区精品观看啪| 六月婷激情福利天堂69| 91在线丝袜| av亚欧| 久久久久久AⅤ无码免费肉站| 亚洲综合色男人网| 婷婷探花久久精品一区| 韩三级a视频在线观看| 久久亚州精品成人Av无| 青春草A| 国产福利合集| 狠狠欧美| 妇女一区二区三区| 99热精品在线观看| 97操在线| www.伪伪| 国产女人9999| 中文一区在线视频| 国产精品国产| 久久精品国产72国产精品福利 | 区日韩亚洲乱码av电影| 欧美性第1页| 95自拍视频在线观看| 亚洲人成色9999精品久久| 久久久78| 亚洲综合五月天| 色噜噜狠狠色综无码久久| 青娱乐欧美激情一区二区| 9久久9综合| 酒色综合网| 久久99久久99久久99人受| 超碰社区97| 人妻熟女av国产网站| 天天综合网~91综合网| 久久久久久精品免费看A级| 97摸视频| 黄片www.| 亚洲不雅视频1区二区| 精品久久人妻成人网| 精品国产一区二区三区久久久蜜臀| 欧美亚洲| 操逼999| 乱伦1色页| 天天摸天天插天天日| 东北女人性交| 超碰成人最新最好看| 九九九综合精品| 天天插网| www.男人天堂| 中文字幕免费看大片| 大香蕉手机在线| 人人操AV| 1769国内精品视频| 亚洲高清内射| 黄色香蕉视频网站一区| 性欧美精| 色噜噜狠狠色综合日日| 另类欧美色| 精品国产自在在线99| 成人26uuu| 久久久久婷婷精品av电影| 最新啪啪视频| 3PAV乱伦视频| 91AV天美在线视频| 婷婷视频网| 久九九九| 日韩青久久| 99热色这里只有精品| 久久午夜鲁丝片| 亚洲加勒比色图| 天天爽天天操| 久久夜黄色无码A级大片| 欧美桃色网| 老熟女91av| 狠狠色噜噜狠狠狠狠狠色综合久久 | 黄色成品网站| 国产自产自拍| 无码动漫av中文字幕| 91久久久久久久| 网友自拍第一页| 在线情色电影 91大 | 日韩欧美午夜视频在线| 一区二区影视| 欧洲自拍色图gif在线| 欧美一级久久久久久久大片动画| 超碰天天去日穴| 综合日韩激情另类图片| www亚洲免费| www.91视频网| 日韩精品一区,二区 九九...老司机| 婷婷伊人綜合中文字幕| 秋霞免费AV| 五十路三区在线| 91熟女.com| 亚洲情色婷婷五月天| 国产女人操逼视频| 国产久久成人| 久操操AV电影| 亚洲在线观看| 国产精品午夜精品| 超碰538| 欧美老熟另类| 97干日韩| 免费看毛片操穴| 免费中文在线| 国产精品无码AV网站| 日韩综合成人免费视频| 一二三区操逼国产91| 四虎在线观看网站| 极品五月天噜噜| 99亚洲天堂| 天堂8在线新版官网| 尤物网站91| 久久精品熟妇丰满人妻99| 九九九只有精品| 国产精品不卡一区二区三区| 大香网伊人久久综合网eew| 韩国久久97| 国产精品色| 九月婷婷久久| 激情五月综合网| 东北丰满熟女国产一区| 亚洲成人福利电影免费| 在线无码操| 97人妻免费中文字幕| 日本淫乱女一区二区三区视频| 国产精品天堂| 国产一区二区成人av在线播放| 欧美色999| 亚洲另类天堂| 国产精品一区av在线| 欧美天天弄| 国产成人欧美精品在线| 亚洲精品国产精品成人| 超碰国产精品无码| 隔壁邻居波多野结衣中文字幕 | 人妻激情另类| 精品网站9999| 欧美熟女激情| 亚洲丰满很很操| 久久婷婷一区| 偷拍 欧美 日韩| AV在线性爱| 久久久久亚洲熟妇熟女| 国产亚洲美日韩Aⅴ中文字幕无码成人| 成人自拍三级在线观看| 最近的最新的中文字幕视频| 少妇超碰在线| 婷婷成人久久久精品| 自拍盗摄一区| 综合亚州欧美| 午夜啪| 丝袜美腿制服人妻二区中文字幕| 99ri视频| 中文字幕少妇色| 久久久久9999精品九九九| 人妻人久久精品中文字幕| 九月伊人中文字幕| 久操网无码在线| 婷婷综合网| julia在线观看久久| 国产精品第二页| 久久女女| 亚洲97综| 99视频内射三四| 精品久久久九九九孕妇| 人妻免费观看| 亚洲一区二区AV| 久久久久久亚洲Av无码| 91狠| 一区二区播放| 欧美日本中字另类在线| 欧美性天天影视| 97视频在线视频| 超碰在线一区| 久久久无码国精品无码三区三区| 风月影院男女十八禁| av毛片aaaaa免费看| 很黄很色的视频在线观看| 亚洲一区二区麻豆影院| 亚洲综合夜色| 性色生活片久久毛片婬片免费放女人一级毛片 | 国产在线视频二区| 97AV爱| 91久久久久| 在线观看成人性爱免费小视频| 99热精品在线播放| 亚洲天堂男人天堂网| 久久久久久九九九九九九| 欧美在线|亚洲| 26uuu久久| 亚洲第一无码播放立川理惠| 蜜桃在线观看一区二区三区 | 亚洲久9| 中日高清无码操逼视频| 大香蕉在线免| 影音先锋日本乱伦| 国产欧美一区二区| 国产400孕妇孕交群| 久综合国内精品自在自线| 夜夜嗨一区二区| 人妻精品综合中文字幕在线 | 性在久久久久久| 高清不卡一二三区视频......| 狠狠入| 精品国模无码| 青青草伊人久久| 永久免费观看的毛片的网站| 亚洲精品丝袜-不卡成人免费……| 夜夜国自区| av优播| 亚洲小说视频| 丁香五月av| 嗯嗯啊啊啊好爽| www99热| 亚洲精品九九九| 91久久精品蜜臀| 男女无套 免费网站| 亚洲国产欧美日韩人妻日中文| 97亚洲中文| 天天综合~91入口| 成人小电影网站tex| 操逼天美3区| 久久久禁| 噜噜吧,噜噜色,噜噜| 久久久国产护士丝袜美腿一| 99色在线视频| 97综合| 干b在线性社区| 色翁荡息又大又硬又粗又爽| 操学生天天| 精品少妇人妻av久久免费| 中文字幕第23区| av最新免费中文字幕| 日本高清加勒比| 欧美亚洲日本激情在线| 人妻欧美| 亚av顶级裸体一区二区三区四区五区 | 日韩探花精品在线视频| 97色操| 天美国产精品| 乱欲一区二区| 99av| 10000部十八禁看电影| 欧美18老人禁| 中出20p| 91九色丨国产丨爆乳| 中文字幕一区电影在线观看| 九九操久久国产免费视频| 久久久久久中文字幕中文字幕最新| 天天做天天爱夜夜爽毛片试看| 青青草色插素人| 这里只有精品久久| 亚洲国产精品9999在线观看| 久插综合| www.99色| 日韩视频中文字幕| 加勒比无码毛片| 欧美亚洲素人制服精品| 亚洲AV无码AV吞精久久久久| 密臀在线一区尤物| 夜夜骑天天燥| 亚洲男人天堂2019| 少妇厨房愉情理伦片bd在线观看| 熟女熟妇伦久久影院毛片一区二区 | 欧州91高潮| 免费超碰97久久| 精品无码一区二区| 破苞ⅩXXX性无码动漫无码| 操逼视频国产无套| 超碰97 线线 在现| 狠狠亚洲| 青青国产在线拍揄自揄拍| 久9热| 黄色av片三级三级三级免费看| 天天综合亚洲综合| 天天草AV| 亚洲限制级| 国产超碰国产97| 国产高清成人传媒影视| 97在线观看播放视频| 超碰97欧美日韩| 大吊色| 午夜久久一区二区无码中出| 99无码精品| 日韩性爱电影一区| 99热只有这里有精品| 日韩性爱视频在线免费观看| 青娱乐999| 伊人操| 四虎影视精品| 亚洲人妻色图| 大香久久| 欧美超碰97| 久久97精品久久久久久久不卡| 亚洲综合有玛| 免費黃色視頻觀看一| 操逼天美3区| 被男人吃奶很爽的毛片| 精品欧美老熟女一二区| 成人av性爱电影在线观看| 久久久9 9 9精品| 天天热精品| 激情文学亚洲| 精品一区二区三区蜜桃| 国产91 丝袜在线播放00-百度| 久久精品国产精品| 中文字幕性感少妇av| 日韩字幕一区| 99re国产精品视频| 国产69精品久久久久99尤物| 大香蕉久| 95精品在线| 婷婷激情一区二区三区俺也去| 成人片视频| 欧美A√综合网| 成人在线永久| 大香蕉日亚洲日本亚大| 99在线视频播放| 欧色性第一页| avav青青草久久夜| 天天久久| 日韩中文字幕国产| 3p国产欧美99热| 国产精品区在线12p| 欧美日韩淫加| 久久99草| 欧洲视频在线| 92久久| 老司机午夜精品视频| 欧美成人A√在线一区二区| 午夜激情成人在线观看| 一区操逼| 综合色啪| 亚洲色图 欧美热图 清纯唯美 另类自拍| 操少妇很爽av| 超碰97玖玖爱| 撸无码不卡免费视频| 天天干人人看综合| 天堂8在线新版官网| 色噜噜国产在线| 清纯唯美综合亚洲| 一级婬片120分钟试看| 女人双腿搬开让男人桶| 青青草在线视频人人想人人上| www久久精品| 日本操逼aaaaa| 久久久国产成人一区二区三区在线| 日本三级韩三级99久久| 免看60秒涩涩视频| 无码人妻一区二区三区色欲aⅴ| 懂色AV蜜臀无码精品APP| 国产夜夜艹| 亚洲欧美内射| 天天摸夜夜添无码小视频| 亚洲男人bt天堂| 少好三P| 成人一道本免费视频| 99成人| 精品9999| 精品九九国产无码| 99999精品成人| 97这里有精品| 99操碰| 欲女人妻性色av| 东京热男人的天堂网| 任我爽视频在线观看| 美女91网| 亚洲精品乱码久久久久久蜜桃麻豆| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 大香蕉草草| 激情小说日韩无码| 精品人妻二区三区| 91精品人妻一品二品三品| 人人摸人人摸人人干| 色婷婷久久综合超碰| 精品人妻免费观看| 欧美最婬乱婬爆婬性视频| 天天综合网在线观看| 午夜色婷婷| 亚欧操逼片在线观看 | 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 国产农村妇女精品| wwwss在线观看| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 国产一级137片内射麻豆| 亚洲AV无码| 男人的天堂网页| 国产 热久久久久国产精品| 性爱AV天堂| 18禁中文字幕| 久久AV色| 亚洲国产一区二区入口| 欧美骚少妇| 久久久精品成人国产| 91热色| 日韩一区二区高清在线观看的| 91 亚洲 欧洲| 欧美精品精品一区二区| 99国产在线绯色一区| 免费少妇一区二区| 91总综合网| 欧美性巨大╳╳╳╳╳高跟鞋| q2午夜理论片夜色av| 亚洲精品三| 嗯嗯啊好爽| 欧美天天综| 岛国AB视频| 91高清欧美| 少妇99成人麻豆| 久久精品国产99精品亚洲蜜... | 亚洲欧美校园| 亚洲 欧美 手机在线观看| 蜜臀Av一区二区三区| 日韩pv中文| 亚洲精品国产专区在线观看| 97国产综合欧美| 一区二区激情国产熟女| 亚洲天堂五月天国产| 美女的肌被草喷水视频| 超碰在线91| 熟妇乱伦一区二区| 中文字幕女同在线| 99色热| 蜜臀99久久国产| 亚洲天堂另类小说男人| 中日韩欧美精品无码AⅤ一区二区| 97资源站久久| 一本久道久久综合狠狠爱| 久久成人国产精品| 欧美日韩狠狠爱| 久久久久亚洲一区女同性恋中文字幕| AV一二区| 亚洲日韩美国人妻| 白嫩少妇| 国产AB视频| 中文久久一区| 亚洲激情久久| 黄色AAAAA欧美| 中文字幕乱亚洲美女精品一区| 四虎884a| 精品久久久久黄少妇| 日本中文字幕在线视频| 91久久九九精品国产综合| 日韩成人人妻网站| 后入式在线免费观看60秒| 久久99热这里只频精品6学生| 岛国激情视频在线观看| 精品超碰色| 麻豆激情综合| 欧美嗯啊……在线观看视频免费| 午夜影美女日鸡鸡天天视频国产| 国产强奸乱伦无码视频| 亚洲 欧美 日韩另类 麻豆| 天天看特黄的免费网站| Av色五月| 一本道综合色图| 日韩性爱视频在线免费观看 | 99热婷婷一区二区三| 久久草视频污视频| 欧美老妇综合网| 狠狠中文字幕| 97五月天| 欧美特大黄一级片片免费| 一级日本牲交大片好爽在线看| 不卡日本一区二区| aV中文麻| 无码久| 91久久堂| 中文字幕人妻色偷偷久久皮 | 99久久久无码国产精品性男| 12一15性XXXX粉嫩国产| 亚洲色图一区二区三区| 成人小电影网站tex| 加勒比色99999| 97久久精品不卡| 中文字幕伊人| 亚洲清纯唯美| 好一吊区二区| 久久久青青草| 欧美一级二级三级| 欧美性夜| 午夜超碰| 亚洲一区日韩精品中文字幕| 亚洲欧美成人网站AAA| 人人操人人93| 欧美日韩大香蕉| 97无码视频在线播放| A一区片| 最新岛国大片| 91爆操视频| 亚洲第一综合| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 国产在线强奸视频| 久久久久久电影| 国产亲戚伦亲在线| 日本高清久久| 国产伊人自拍| 东北老女人的激情视频| 啊啊啊啊好大好硬啊啊啊啊啊 | 99视频这有这里有精品| 国产AV精久久| 欧美日韩性爱精品| AV不卡在线| 日韩国产欧美伦理在线| 天天看,天天做| 91neishe| 综合网~91综合网| 91操人| 人人插人人搞人人操| 久久久久久亚洲精品中文字幕人妻| 92性色国产午夜福利在线661| 色呦呦国产精品免费看| 欧美精品日韩久久久九| 久久毛卡| 水野优香在线观看| 久久99热这里只频精品6学生| 熟女丰满人妻一区| 国产精品视频在线播放 | 免费公开人人操| 国产精品熟女丝袜一区二区| 艳美熟妇先锋一二三区| 九九九影院| 夜夜嗨一区二区三区直播内容| 国产老太乱伦一区| 国产乱色国产精品免费视| 国产吞精a级片激情电影| 天综合中文| 欧美亚洲涩涩| 成年人黄色| 日韩色欲久久一二三四区| 色一情一乱一乱一区91Av| 99免费视频| 91欧洲入口| 精品九九九| 人妻丰满熟妇一区二区三| 超碰人人在线| 欧美夜夜骑视频| 亚洲欧美91| 三级AV入口| 狠狠久久亚洲欧美专区| 亚洲色图欧美色图制服诱惑| 日韩探花精品在线视频| 久久啊啊啊视频| 蜜桃狠狠色伊人亚洲综合 | 国产第12页| 亚洲drav色图| 欧美拳交在线播放| 91久久国产精品| 91综合色噜噜| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 韩国手机不卡无码三级视频| 久久久久9999| 色综合久久夜色精品国产天堂| 凹凸视频在线一区二区| 丁香五月大香蕉| 欧美激情精品久久久久久| 欧美性爱视频免费一区一A| 免费看污网址| 26uuu偷拍亚洲欧洲综合| 狠狠狠一区二区三区| 97欧美日韩| 色女女女导航| 超碰2017| 伊人久久亚洲中文字幕| 中文字幕蜜乳av| 国产av尤物| 蜜臀久久99精品久久久久久无删减 | 国产欧美后入| 中国国国产一级特黄毛片| 好舒服视频| 国产乱码精品一区二区三区四川| 9999伦理视频| 国产精品久久久久久久久久梁医生| 日本三级人妻a人妻一在线| 国产精品久久久 | 欲色影视综合吧| 欧美的性爱网站免费| 日韩美女久久一区二区三区| 亚洲图片欧美色| 韩国女主播青草福利视频| 97精品免费视频网站| 极品五月天噜噜| 五月天伊人网| 国产激情综合五月久久| 综合欧美亚洲| 91逼逼女人91| 老子午夜伦不卡影院| 九九九精品一区二区无码| 日本东京热加勒比久久| 激情黄色五月天| 岛国视频免费在线观看| 91青青| 好吊色在线观看| 毛片久久| 九九九草| 免费看毛片操穴| 久久大黄片| 精品免费一区二区三区在线亚洲人成| 亚洲一级性爱视频免费看| 大香蕉手机在线| 久久婷婷五月天| 天堂69亚洲精品中文字| 丝袜色综合| 日本99热| 日本东京热久久久电影| 久久精品一区二区三区蜜桃臀| www超碰| 综合av社区| 久热网| 久九干| 日本在线激情一区二区三区| 97视频在线免费观看| 大香蕉在线视频重口味毛片在线| 日本日逼视频网| 人妻少妇久久中文字幕一区二区 麻豆| 久久久久久久久九九久孕交| 2024人人操人人摸| 色香天天| 加勒比色综合| 国产美女91视频| 91干熟女| 天天艹天天日| 东京热一区二区中文字幕| 无码人妻系列少妇| 亚洲男人天堂网久久| 亚洲欧美国产中文视频| 加勒比色综合| 久久国产视频专区一二三| 国产色精品午夜大片| 久久天堂| 欧色网址| 久草精品一区 | 67194国产| 亚洲五码一区二区三区| site:sinbotex.com| 久久精品中文字幕女同| 日韩情色AV| 蜜桃色色网站视频三区| 欧美成人性爱视频免费观看| 日本大香蕉综合网红本杳社区| 精品96久久| 狼人综合婷婷激情四射 | 午夜福利合集| 国产噜噜噜噜噜久久久久久久久| 第二页中文字幕| 九九色逼| 久久久麻豆精品| 殴美在线AⅤ| 中欧人妻丝袜中文字幕| 熟女久久| 日日躁狠狠躁天天躁精品| 国产白嫩漂亮KTV在线| 亚洲国产欧美一区二区潘金莲| 久久AV无码AV| 人人妻人人澡人人爽久久av| 熟妇人妻丰满久久久久久久无码 | 999久久久免费精品国产牛牛| 欧美性色欧美| 女生看匆91网站| 中文字幕av片| 国产高清在线自在拍69| 天操天操夜操夜月月年年操操| 精品人妻视频一区二区三区蜜桃视频| 乱人伦 国语对白:视频直接看| 天天天天操| 懂色中文一区二区三区| 日欧操屄| 亚州综合色| 97超碰总站| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | www.99在线| 玖玖爱免费观看视频| 国产精品网址| 日本性爰一道本| 操逼视频亚洲| 日韩欧美亚洲一区二区三区影院| 无码操逼网| 高清无码国产亚洲| 一区二区三区机械有限公司| 91粉嫩萝控精品福利网站_精品影音先锋国| 亚洲操人| 99色综合| 96久久科窝| 一区二区三区 丝袜高跟| 狠狠躁AV| 欧美一二在线| 亚州精品人妻一二三区| 伊人麻豆传媒| 国产成年女黄特黄| 一类av片在线看| 精品国产精品一区二区| 亚洲无码99| 操人妻逼91| 国产av色网| 亚洲欧美综合网| 熟女乱3伦999| 久久久久亚洲Aⅴ无码| 欧美精品日韩一区二区| 一区二区三区网站日日骚| 成人十八禁日韩欧美一二三| julia ann久久| 亚洲久久久久| 乱伦av.com| 婷婷五月成人| 欧美精品双插| 中文字幕黄色一起草| 草草草视频在线免费看| 婷婷99狠狠躁天天躁| 啊嗯好大视频在线观看| 色阁阁AV综合网| 国产熟女无套内射| 国产女人与拘做受视频免费| 韩国一级婬片A片AAAAA| 囯产乱伦一区二区三女 | 综合亚洲欧美| 国产精品又黄又猛又粗| 欧美精品日韩一区二区| 91九色丨国产丨爆乳| 大香蕉2017| 熟女乱3伦999| 999国产精品999| 欧美天堂日韩三级国产传媒| 国产吹潮女在线观看| 欧美色图色综合| 人人透人人操| 美女91在线观看| 超碰吊日色| 欧美另类精品xxxx| 激情看片网站| 日韩人妻无码精品系列| 丝袜亚洲综合| 色婷婷成人| 天美传媒av一区二区| 欧美国产精品久久九九| 色吧综合网| 天天操女人| 91N综合网| 人人干人人搞人人摸| 啊啊啊快操我视频| 熟女人妻精品一区二区视频 | 九九自拍伦理| 亚洲在饯| 乱伦熟女专区| 台欧久久精品视频| 婷婷10月天青娱乐| 欧美亚洲日本激情在线| 丁香婷婷激情五月天无毒不卡| 日韩精品 欧美激情| 狠狠激情综合狠狠操中文字幕| 九月AV| 婷婷五月天激情四射| 五月天激情四射| 欧美高清91| 国产一区在线免费播放| 男人的天堂久久狠| 亚洲国产精品无码AV在线| 91狠狠综合久久久| 玖色av| 久久精品三级影视| 精品超碰色| 激情五月天丁香社区| 亚洲国成人情色好看电影| 亚洲综合第一页| 国产免费一区二区在线A片视频| 久久久一二三四区| 精品性爱一二三区| 91精品免费| 操逼操操操91| 欧美春色| 收看日本人日bb| 国产盗摄美女如厕大神作品在线观看| 麻豆国产精品午夜视频| 国产精品乱人伊人网| 久久超碰97| 午夜福利久久久噜久噜久久综合 | www国产天美久久久| 色五月AV在线| 亚洲性爱电影| 日本熟妇色熟妇在线视频播放| 国产亚洲女v在线观看| 丝袜色综合| 国产精品一级片在线看| 中出91视频| 天美传媒av 在线| 精品少妇一区二区三区| 九九Av| 91av熟女人妻| 日韩 成人 有码| 国产亚洲精品农村妇女 | 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 亚洲男人天堂网久久| 啊啊啊好舒服视频| 97久久精品亚洲| 国产9 9在线 | 亚洲| 是还免费视频1727我| 国产尤物AV尤物在线观看不卡| 国产搭汕a级片| 色妺妺在线视频| 久久69精品久久久久久久| 国产女人9999| 亚洲 无码 偷拍| 啊啊啊啊啊啊啊啊啊在线观看| 黄色av网站在线播放| …中文字幕亚洲乱,97人妻无码费视…| 色小视频蜜乳| 亚洲春色一区二区三区| 91国产美女丝袜足交精品视频| 亚洲国产婷婷在线播放| 天天综合网~91| 大香蕉综合| 日韩精品人妻一| 97国产|免费| 亚州中文字幕超碰97| 久久久久久电影| 国产区在线| 久久久久久久久久久久黄色| 久操不卡视频| 久久久免费高清中文视频| 激情自拍 校园春色| 日韩精品亚洲专区在线影视| 天天躁日日躁狠狠躁| 亚洲男人的天堂网| 日本亚洲vr欧美不卡高清专区| 秋霞影音一区二区三区| 一起草三级AV电影在线观看 | 屁股久久久久久| 裸体美女久久久| 67194无码不卡| 久久久久9| 欧美性爱免费短视频| 3P丝袜熟女 色综合| 一区二区视频你懂的| 激情四射五月天| 神马久久久久久久| 国产不卡的视频| 91日产欧美| 台湾佬中文娱乐网久久久久久久久久com | www…国产操逼| 曰韩操B| 免费精品无码一级毛片牛牛影视 | 成人黑料社久久| 欧美性爱综合,免费| 欧美激情久久久久| 久久久久久性爱片| 25国产精品免费观看| 久久毛卡| 思思热在线视频免费| 午夜操一操| 色噜噜狠狠色综无码久久合欧美| 2017天天透天天通天天擦| 99.色网| 超碰 另类 欧美| 116美女午夜| 久久性爱视频| 夜夜夜夜爽| 欧美91久久久久| 美女毛片999| 久悠悠av| 日韩有码一区三区| 色婷婷丁香五月天| 97欧美视频| 97 国产精品| 热热色色综合| 人妻黑丝袜电影| 97久久精品国产| 黄网站黄视频网站进入口| 2011国产精品| 日韩美一区| 亚洲中文字幕97久久精品少妇| 99热这里只有精品8| 99日精品欧美国产| 自偷自拍的亚洲视频| 无码免费精品高清| 国产一级做a爰大片免费久久| 中文精品一区二去| 最新岛国大片| 自拍偷拍亚洲熟女妇人精品| 91人妻最真实刺激绿帽| 妇女性内射冈站HDWWWCOM| 99超碰碰| 亚洲图片91|