色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合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
返回資訊列表
成人一级二级| 欧美综合天天| 人妻酒店出差被中出免费在线播放| 人妻熟女一区在| 又黑又大又粗| 啊啊啊啊啊操我视频| 青青草在线视频人人想人人上| 宅男91视频在线播放| 日韩 国产 欧美自拍| 中日韓欧美高清| 大吊色| 欧美v日韩v亚洲v最新在线| 国产免a费看黄片在线| 顶级丝袜熟女一区二区三区| 大香蕉久操| 亚洲欧美97| 欧美成人性爱视频在线播放 | 99老司机精品视频在线观看| 亚洲AO在线| 嗯嗯啊好大| 久操免费观看| 日操粉逼逼| 欧美色图亚洲色图成人在在线| 亚洲熟女乱熟乱熟妇综合网二区| 久久久精品,3| 影音先锋每日最新资源在线观看| 国内精品久久久久影院亚洲| 97免费免费视频网| 午夜操一视频一区| 乳欲人妻办公室奶水| 色色五月丁香| 嗯嗯嗯啊啊在线观看| 欧美精品精品一区二区| 日本在线一二| 九九这里只有精品| 欧美超碰96| 天天影视色香色欲| 绯色AV粉色AV蜜臀AV| 97人人爱人人做人人乐| 1000部熟女视频在线观看| 性欧美天天| 综合五月天| 舔足天天操天天射| 激情AV| 717影院理论午夜伦八戒| 久久粉色| 色综合V| 日本三级一区二区 在线| 99热只有这里有精品| 日本久久天堂| 超碰99热中文字幕| 久久草视频污视频| 欧美91在线| 日本丝袜人妻内射| 丁香婷婷九月| 亚洲自拍另类丝袜综合| 久久久久久少妇| 视频二区美腿制服人妻欧美| 成人久久久| 亚洲国产奇米影视久久| n1038 一二三区| 美女黄色91| 国产成人午夜视频网址| 日本人妻A片成人免费看片| 97超碰免费人人性爱| 欧综合网| 久久香蕉国产线看观看猫咪av| 男人天堂2019亚洲| 日韩91网站| 国产AV超爽| 色婷婷A V一二三四区麻豆综合| 91色图| 天堂九九九九九九九九九| 中国少妇啪啪视频| 色婷婷网| 色超碰综合| 亚洲精品91| 色情五月丁香| 国产精品夜夜夜| 免费精品无码一级毛片牛牛影视| 亚洲欧洲日韩国产自在线| 天天操天天看| 人人操,操人人| 91热| 中文字幕av久久爽Av| 人人看人人插| 色97综合中文字幕| 天天综合日韩网| 日韩性爱小视频| 啊啊啊啊啊在线视频| 操操操操网黑人| 免费在线观看AV无码网站| 一本色道综合久久欧美日韩精品| 激情综合二| 久插综合| 色777999综合| 欧美激情综合| 东京热一区二区中文字幕| 久热超碰| 日韩精品资源专区二区| 久久久久久久国产| 亚洲黄色网址视频| 97综合| 91欧美另类| 91精品女厕偷拍视频| 99热国产精品| 91是天天| 色综合网1| 久久99国产精品| 精品国产久久乱码| 艳美熟妇先锋一二三区| 欧美一区二区日韩三区| 91亚洲狠狠色| 中文字幕在在线观看网站| 国产女人高潮嗷嗷嗷叫小说| 久久夜黄色无码A级大片| 久久婷婷成人综合色怡春院| 男人天堂最新手机版在线青青草| 欧美日韩婷婷中文| 精品人妻一区二区视频| 情侣开房子拍 日韩无码 女的很漂亮| 日韩国产精品人妻无码久久久| 亚洲伊人a线观看视频| av黄图片在线观看| 综合久久97| 全国男人天堂网| 日韩少妇在线视频| 久久9精品| 91高清日| 精品传媒在线一区| 91另类| 成人一二| 亚洲AV噜噜狠狠网址蜜桃动漫| 亚州一区二区成人片免费| 欧美精品成人一区二区在线观看| 亚洲精品一区二区精品| 日韩乱伦影音先锋| 台湾佬激情综合| 操人妻少妇中文| 999久久久九| 99国产精品人妻人伦| 欧美另类色图片| 久久久草成人网站久久久草成人久久久草久久久 | 日韩一区二区三区四区五区| 爱我干综合| 四虎影视在线| 黄站在线免费观看| 在线播放免费av福利片| 日韩欧美女优电影| 黄页av| 天天看天天在线精品| 人妻-91porn| 青青操少妇| 60秒不遮不挡| 国产亚洲综合欧美一区| 欧美久久人妻少妇一区二区| 综合久久9| 亚洲AV成人无码一二三久久| 婷婷五月丁香五月| 伊人网一本| 日本男人天堂| 丁香九月激情啪| 99re6国产精品99re| 性猛交| 国产日本久久免费精品| 91丝袜在线观看| 91三级理论片播放器| 国产女主播视频在线观看| 国产成人无码高清| 午夜精品视频777| 91视频综合网| 劲爆欧美人妖三区91| 人妻献身系列第54部| 免费视频无码| 国产精品原创巨作?v网站| 极品少妇99| 涩五月婷婷| 久久久无码视频| 天天看片麻豆| 中文字幕人妻丝袜| 国产精品探花视频| 91操熟女| 人妻91少妇| 精品九九九九九九九| 国产一国产一级毛片古装| 日本精品一区二区不卡| 婷婷五月色| 日韩少妇丰满亚洲| 8050午夜少妇无码| 91人精品妻入口| 男人的天堂视频精品乱在线| B049AV在线播放| 97精品一二区| 人妻天堂综合网| 亚洲五月婷婷| 精品一二三区久久AAA片| 日本性交操一区二区不卡系列| 97欧美色| 97精品一区| 亚洲,欧美,综合网| 综合九九| 日本性一区| 人妻大香蕉| 亚洲蜜臀精品视频久久| 少好三P| 91黑丝操| 日本啊啊啊啊啊视频| 一区二区三区在线日韩影院观看| 少妇极品熟妇人妻无码| 中文字幕一区av| 97视频新免费| 91色夜| 白丝AV| 午夜性生活av免费在线看| 国产精品不卡一区二区三区| 国产区91柔拿会所技师| 欧美激情另类一区二区| 日韩一级二级三级在线不卡观看完整| 白丝少妇一区二区| 久久久久久久久久久久黄色 | 欧美熟女丝袜| 亚洲日韩美国人妻| 国产精品电影大全| 热99这里有精品综合久久| 噜噜噜亚洲精| 亚洲AV人人澡人人爱| 91老熟女老女人国产老太| 亚洲一二三精品久久网| 日韩欧美麻豆大片| 大奶啊啊好爽| 欧美 亚洲 制服 精品| 亚洲国产欧美中日韩成人综合视频| 精品人妻1区| 国产乱伦亚洲色图高清无码| 欧美少妇性爱网站| 欧美激情中文字幕另类小说| 影音先锋中文字幕日本好一区二区| 国产精品探花视频| 婷婷99狠狠| 成人资源中文字幕在线观看天天| 无码heyzo高清一区| 亚洲天堂性爱| 日韩精品大香蕉伊人在线| 情色五月天网| 91成人精品| 高清孕妇孕交 交| 日韩一级二级三级在线不卡观看完整| 91综合网| 巨爆乳肉感一区二区三区竹菊影视| 天天爽人人综合免费7799| 日本 成 人 小说 电影 一区二区| 岛国色情视频在线观看| 色播综合| 精彩久久中文| 国产Aα| 综合欧美日本三级| 成人精品视频一区二区| 欧美黑人性猛交91| 91人妻丝袜无码| 少妇久久久久久久久| 园内精品自拍视频在线播放| 91狠狠综合久久久久久| 人妻大香蕉| WWW.操逼.COM| 日本狠狠干| 国产欧美日韩臀| 一区二区三| 岛国视频免费在线观看| 操人妻逼91| 熟妇熟女一区二区三区| 色色国产| 欧美天天搞| 久久精品三级影视| 日韩精品人妻中文字有码在线| 丰满人妻区一区二区三| 大香蕉伊人久久| 亚洲人91| 久久精视频美日韩在线视频| 超碰在97| 人人摸人人叼| 一级免费精品| 国产成人无码网站在线视频| 性九九九九九九| 亚川综合视频| 国产精品一级二级在线| 国精精品无码一二三区水多多| 国产精品乱码久久久久久久久久久久| 青青草综合在线| 国产亚洲精品玖玖玖在线观看| 欧美se综合| 蜜桃在线观看一区二区三区 | 欧美性第一页| 美女淫穴| 久久精精区一区二区一蜜桃一区二区| 女人天堂av在线播放| 成人日韩欧美| 尤物黄色在线观看网站| 亚洲欧美91√| 嗯嗯啊啊亚欧精品| 人看人人摸人人操| 91国产丝袜白虎| 亚洲吊色| 国产精品免费视频不卡| 岛国激情视频软件| 91欧美色| 一区二区不卡免费| 啊啊啊在线观看免费视频| 日本九九九九| 丰满高潮18xxxx| 天天日天天干天天色| 青青草这里只有精品| 欧美亚洲涩涩| 目产99999久久999| 久操综合在线| 日韩激情中文字幕有码| 日韩欧美午夜一区二区| 黄色香蕉视频网站一区| 370p日韩欧美亚洲精品| 欧美日韩激情无码专区| 亚洲午夜福利在线影院| 色五月av| 99r九九| 久久大陆| 国产91丝袜 在线播放| 老熟妇91| 久久精品国产亚洲AV无码做| 亚洲图片偷拍视频区| 人妻天堂综合网| 91爰爱欧美| 色淫网站优优视频| 超碰在线人妻中文字幕| 大香蕉中文aV在线| 中出20p| 粉嫩av平台| 自慰白浆在线观看| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 青青伊人久久| 亚洲激情av| 欧美综合1性辶| 激情婷婷黑人91| 成人久久久精品| 夜夜爽夜夜| 91综合网站| 福利视频一区二区微拍| 又黑又大又粗| 另类图片五月天| 小日子操bb在线看| 91原创在线观看| 精品丰满熟妇人妻一区| 中文字幕人妻资源在线| 操逼操操操91| 91AV天堂| 影视综合无码少妇| 混色激情av| 亚洲自拍97| 美日韩成人| 加勒比av网| 全球成人中文在线| 啊啊啊久久久视频| 黄色免费网页无码| 精品九九淫乱男| 国产精品呦一区二区三区| 情色五月天久久久| 免费黄色片。| 入口操逼网站| 婷婷丁香成人| 国产强奸乱伦欧美| 狠狠操狠狠爱| 九九九九97| 狠狠色综合网| 日本色色色视频| 国产拍偷精品网站| 夜色97| 国产精品ⅴ无码大片在线看.| 欧美综合综合| 少妇二级| 国产精品成人午夜福利| 久久精品中文字幕无码l| 伊人991| 口爆综合网| 97亚洲精品| 亚洲综合另类欧美久久久| 午夜福利无毒不卡| 激情内射| 校园春色亚洲欧洲| 操比国产| 国产 亚洲 一二三四| 国产综合久久久鬼色| 成人免费在线网站| 亚洲欧美综合| 亚洲欧美变态| 欧美曰韩国产精品| 一起草AV| 一级啊性爱在线视频| 另类图片综合| 97色操| 亚洲九九视频在线观看| 午夜欧美J进J出白浆流出久久久| 婷婷AV一区二区三区| 十八禁视频一区二区| 天天干人妻视频| 在线观看午夜婷婷久久久久清性观看| 四虎影视在线| 久热这里只有精品9| 人人摸人人干人人拍97| 欧美亚洲丝袜人妻制服中文99| www.人人cao| 久草免费在线一区二区| 欧亚性爱啪啪| 色大师网站www永久网站视频| 婷婷丁香一区二区三区| 国产h小视频在线观看免费| 日韩三级av片| 激情 欧美 亚洲 小说| 人人操人人干网页| 防屏蔽在线视频| 午夜精品久久久99| 日韩BBN| 少妇精品久久| 多乙久久久久久| 国产欧美第五页| 97se综合网| 久久风骚城市| 日韩熟女操逼| 色婷婷基地| 午夜精品久久久99| 久操国产在线| 天天色播亚洲综合网站| 精品久久久中文字幕不| 久久久啊啊啊| 日本操逼二区| 免费视频在线观看啊啊啊啊啊| 超碰久在线天天做| 亚洲成人黄色在线观看| 五月天婷婷综合网| 人人操人人精品影片| 小说区 图片区色 综合区| 天天做日日爱夜夜爽| 日日干夜夜操视频h| 亚洲欧美校园| 粉嫩不卡一区二区性爱 | 五月天色图影视| 人妻五十路在线| 青娱乐国产剧情av一区| 91碰碰| 美女91av| 天天日天天搞天天干| www.91色综合| 上床啊啊啊| 探花一区在线| 91精品人妻五十路| 国产大学生口爆吞精合集| 国产久久视频| 性综合网| 熟女丰满人妻一区| 欧美色干| 91黑丝在线播放| 中文字幕欧洲有码| 啊视频在线| 俺去啦自拍| 久久夜黄色无码A级大片| 东北女人的毛片| 啪啪性爱免费视频| 天天综合影院91| 国产强奸乱伦无码视频| 99爱久久视频频| 中文字幕在线免费观看2| 区日韩亚洲乱码av电影| 大香蕉78| 亚州成人A√| 日韩无限资源| 精品久久久久9999| 国产成人亚洲精品无码最新在线| 欧美一区二区情色| 国产极品精品美女视频| 日韩97视频| 久久精品国产96精品亚洲拳交| 久久噜| 日本性爱网址| 欧美激情在线观看视频| 亚洲 图片 综合91| 无码人妻一区二区三区色欲aⅴ | 97在线观看播放视频| 国产一区二区三区,在线观看观看| 亚洲国产av中文字幕久久| 大香蕉男人的天堂| 国产AV高清AV无码| 亚洲中文字幕熟女| 伊人国产视频| 乱伦3P视频| 国内一级精品| 99re这里只有精品3| 色哟哟AⅤ| 老司机免费视频在线91| 91久热| 男人午夜天堂| 69久久久久久久久久久久久| 丁香五月婷婷色| 亚欧色图在线激情| 操老熟女AV| 国产少妇肉丝在线观看| 涩涩涩综合| 欧美三四五区| 红桃视频高潮| 抽插无码高清一区| 人人看黄色视频| 97草草| av操操不卡| 欧美强奸一区二区诱惑| 亚洲中文字幕熟女| 97视频免费在线| 成人AV素股で擦久久| 亚欧日韩成人| 中文乱码字字幕在线第5页| 91超碰在线播放| 精品久久久久,69国产成人精| 人妻81p| 天天做天天爱| 色噜噜人妻av中文字幕| 欧洲一区二区三区免费| 日韩精品99999| 成人aⅴ一区二区三区| 欧美在线啊啊| 欧美 日韩第一性色| 日韩精品人妻系列无码天堂| 涩五月婷婷| xxx0国产在线播放| 亚洲高清无毛一区二区| 久久人| 91操熟女视频| 久久久久斤小| 亚州中文字幕超碰97| 人妻天堂综合网| 国产一区二区视频在线播放| 日韩免费在线视频观看| 国产精品com| 亚洲综合有码| 舔人妻中文免费视频| 久草男人天堂| 偷拍在线观看视频| 人人澡综合涩| 操b网站亚洲无码| 婷婷色一区| 亚洲成人免费电影| 久久99视频| 色香色欲天天综合网天天来吧| 久久精品国产亚洲AV高清演员表| 日本性爱视频一级| 2024黄色视频| www.99色| 国产又黄又粗的视频| 色综合av综合久久| 草草草视频在线免费看| 97久久超碰| 91黑人狂躁丰满熟妇| 麻豆成人影音在线| 91bbb| 亚洲?V高清一区二区三区尤物| 久久啊啊| 日本淫乱女一区二区三区视频| 久久久久久久精| 日日摸天天爽夜夜欢| 国内伊人久久久久久网站视频| 伊人网高清| 白嫩少妇| 一区二区免费电影久久| 免费观看国产不卡av| 日本无码1| 欧美网站免费| 夜夜一区二区| 日韩精品高清资源在线| 亚洲老司机123专区| 91精品久久久久久久久久| 神马九九九| 欧美亚州综合网图片| 热99re69精品8在线播放| 成·人免费午夜在线观看| 亚洲乱码精品一区二区| 操逼国产免费| 色色99| 中文字幕一二三区| 校园春色亚洲无码| 噜噜噜噜久久久精品免费| 国产精品操| 国产一级137片内射麻豆| av日韩在线观看电影| 五月丁香啪啪啪| 中美日韩毛片| 蜜桃传媒视频第一区入口在线看| 丰满人妻一区二区三区蜜桃视频| 岛国在线免费视频| 婷婷久久五月| 久久AV无码1区2区3区| 老色鬼成人精品视频下载大在线观看| 亚州综合色| 欧美一级特黄淫片在线观看| 综合熟女| 久久人妻无码毛片A片麻豆| 日韩欧美女求操每天更新| 一级AV性爱| 99热综合| 性欧美精| 日韩精品中文字幕人妻| 青青草天天亲夜夜操网| 一区二区 日韩 欧美 国产 传媒| 密臀在线视频| 成人八戒网站| 自拍丝袜美腿人妻| 啊啊啊啊好多水| 久草视频在线视频在线视频在线观看| 蜜臀国产AV中文字幕| 色老久久| 欧亚性爱在线视频| 久久国产精品91| 9久9久9久9久视频网站| 亚洲色图尤物视频| 嗯嗯,啊啊,国产精品| 欧美激情亚洲| 亚洲色图殴美色图激情乱伦| 欧美一二在线| 亚洲精品久久久久毛片A片拉屎 | 中文字幕亚洲永久精品| 殴美日韩m| 好属操| 91狠狠色丁香婷婷综合久久| 91精品国产乱码| 国内精品a| 高清不卡视频| 日本不卡五区| 情色AV电影| 狠狠入| 久久久久9| 视频在线观看青青99国产| 天天插夜夜操| 国产精品色哟哟| 伊人一级免费黄片| 午夜福利久久久噜久噜久久综合| 91一区二匹| 蜜臀av一区二区三区免费观看| 51一区二区三区| 久久精品国产72国产精品福利| 久久爱超碰网| 国产女人高潮嗷嗷嗷叫小说| 密臀AV在线| 熟女这里只有精品6| 曰本熟女视频| 性爱视频无打码在线观看| 操香逼| 国产一区二区三区免费视频在性观看 | 秋霞蝌科网日本一区| 超碰这里只有精品| Av手机版天堂网| 色 亚洲 91| 午夜激情成人在线观看| 久久99精品国产| 天天做日日做| 四虎影视永久在线观看精品免费网站 | 99这里有精品视频| 人妻铁牛TV| 天天综合网国产| 亚洲欧美国产va在线播放频| 国产黄色动态精品| 精品中文字幕第一页| 色天堂在线观看| 日韩一级片在线看| 91bbbbbb| 偷拍亚洲高清图片| 国产91乱伦| 欧美三级偷拍| 成人影 天天操 亚洲| 韩三级a视频在线观看| 中国小夫妻勾搭露脸淫荡对白| 草草网站影院白丝内射| 久久久久久人体| 91老熟女逼| 黑人白女精品一区| 国产精品69久久久久孕妇欧美| 欧美一级色| 国内亚洲高清无码| 亚洲人精品午夜不卡| 东京热男人的天堂网| 欧美高清无码免费视频高清版| 欧美日动态视频| 日本免费亚洲欧美| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 97视频免费播放| 久久 亚洲 日韩 人妻| 殴美大黄片| 久久在线观看免费视频| 日韩欧美蜜桃精品久久中文字幕久久 | 超碰69| oumeisetu综合| www.99中文字幕| 日韩射精| 欧美黑人168页欧美黑人167| 97视频在线免费看| 天天做日日爱夜夜爽| 成年无码动漫av片无尽在线| 九九免费影片| 天天爽夜夜欢视| 六月激情网| 亚洲日韩美国人妻| 中日韩免费看男女操逼大全| 91欧美少妇| 欧美色日本| 青青青操| 五月天婷婷久久| 美女写真| 天天懆天天日| TS人妖另类精品视频系列| 国产精品一区二区麻豆| 97超碰久久色| 日少妇亚洲版| 精品久久久九九九孕妇| 国产精品熟女乱伦| 成人八戒网站| 曰韩精品视频一区二区| 国产亚洲色停停久久99精品91| 亚洲中文字幕av| 欧美第一页| 北条麻妃性愛视频| 75大香蕉| 中文有码第五页| 99啪| 97干在线看| 天综合网| 欧美成人9797| 91 在线亚洲| 9 9精品一区二区三区| 女人高潮抽搐喷水视频网站| 天天视频综合在线观看视频| 激情抓乳插进去啪啪啪日韩| 不卡中文字幕aⅴ在线| 乱伦强奸区日韩| 热99这里有精品综合久久| 97色色色| 天天操夜夜操| 亚洲 无码 偷拍| 91精品国产91综合久久蜜臀| 玖草在线视频| 性色亚洲| 亚洲成人黄色在线观看| 日B操| 国产av激情无码久久天堂| 偷拍 欧美 日韩| 日韩一级性爱无码| 国产综合在线视频网站| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 性色av蜜臀av色欲aV| 国产网红精品| 久久性爱大全| 国内外色色色色色成人视频| 熟妇人妻精品一区二区视频色欲| 中文字幕二区日韩天堂| 一个人在线看的黄色电影网站| 欧美日韩222| 区二区亚洲婷| 蜜桃视频啊啊啊啊| 久久久久久人体| 丝袜美腿av女优在线| 大学生美女口爆| 亚洲色欲天天天堂色欲网女| 亚洲人妻中文高清| 9色在线| juliaann精品熟女一区| 伊人操操| 欧美黑人与女人91| 国产91影院| 国产一级不卡在线观看| 色狠狠综合| 国产精品对白内射| 九九九精品一区二区无码| 欧美综合综合| 精品蜜乳AV免费观看| 一线黄色免费性爱片| av大香蕉| 久久99999| 欧美综合综合| 国产精品久久久久无码Av网曝门| 中国女人内射6XXXXX| 日韩人妻少妇 一区二区三区| 精品久久久中文字幕不| 操淫穴亚洲五月丁香 | 粉嫩在线一区二区懂色| 久久欧美按摩999| 97在线资源| 麻豆久久一区二区三区| 久久亚洲AV成人精品无码| 五月天社区| 精品国产久久乱码| 欧亚日韩一区在线| 欧美人妻一区| 欧美亚洲国产自久久| 国产三级中文字幕粉嫩| 日韩福利综合一区| 色色婷婷丁香| 亚欧美综合网。| 欧美一级在线观看成人| 久久久久国产一区二| 国产精品小视频一区二区三区| 久久精品视| 91色图| 精品久久人妻成人网| 九九九九九九成人| 久久免费少妇| 青娱乐二区免费| 五月丁香社区婷婷日韩欧美精品影院 | 四虎精品永久在线观看| 国产女同视频在线播放| 69精品少妇一区二区三区蜜桃| 欧美天堂亚洲电影院一区在线播放| 蜜臀99久久| 久久亚洲婷婷| 国产吹潮女在线观看| 97色伦97色伦国产欧美| 欧美日韩999| 中国的操老妇女| 亚洲欧洲无码bt精品合集| www.婷婷六月天| 天天情欲宗合网| 黑人精品XXX一区一二区| 日本三级中国三级99人妇网站| 久久久国产精品亚洲精品| 国产资源中文字幕在线| 亚洲欧美精品91| 神马久久久久久久久| 亚洲另类小说卡通动漫| 欧美中文字幕一区| 日本影视久久免费| 精品少妇后入一区二区三区四区人妻巨乳| 性色高清..……| 青青操综合网| 做爱福利视频一区二区| 日韩熟女操逼| 亚洲国产综合久久天堂| 精…码一二三区| 五月婷婷激情综合| 精品1区2区3区| 丁香五月色情| 色爱亚洲| 亚洲男人天堂2019| juliaann丝袜| 中文字幕黑人大片| 中文字幕在线免费观看 | 亚洲色性| 五月天激情综合网| 亚洲精品人体| 97免费在线视频在线观看| 亚洲欧美首页| 色一射色一射| 日韩欧洲操屄视频| 久干网| 欧美熟妇人体| 欧美日韩大香蕉| 91av天美性媒精品视频| 精品国产一区二区三区香蕉欧美| 91日产欧美| 人人摸人人干人人拍97| 成人情色综合网| 一区二区三区精品黑丝白丝酒店对鸡 | 欲女人妻性色av| 亚洲精品无码少妇久久| 校园激情狠狠四射| 久久久久久中文字幕中文字幕最新| 丰满人妻区一区二区三| 中文字幕丝袜美腿| 秋霞一级A片黄色视频| 亚洲色悠悠久久88| 无码日韩网站| 超碰免费人妻在线| 五月天久久婷婷亚洲| 人人操,操人人| 99热这里都是精品| 久插不卡| 五月婷婷性爱| 操逼日批| 亚洲少妇视频| 91麻豆天美传媒HD| 欧美做爰无码A片视频| 女人精品内射国产99| 久久亚洲色图中文字幕| 日本超碰在线国产一区| 色色色色日本| 亚洲国产成人综合碰碰三级经典| 乱久久久| 99热这里只有精| 人妻日日干| 秋霞Av理论一级在线| 欧美高潮| 九九英色视频| www99热| 人妻 中文 日韩| 亚洲se91| 亚洲。天堂。日本在线观看| 国产av白丝| 少妇滛荡视频| 国产日韩欧美中文在线播放 | 69AV女优男人的天堂| 国产精品久久久久综合| www.亚洲成人一区| 91麻豆天美传媒在线| 久久99草| 密臀在线免费观看| 日本狠狠干| 岛国艾薇凹凸视频天堂| 色欲久久久久综合网| 欧美性色欧美| 欧美激情一| 媚薬在线视频麻豆| 不卡人妻少妇精品毛片一区23区视频| 日本 欧美 国产一区| 波多野结衣被操50分钟免费视频| 97超碰久久| 91丰满| 亚欧美色图| 国产视频第2页| 亚洲第91页 | 欧美色图亚洲激情| 91白虎| 91老妇女| 日韩在线观看AV| 五月天亚洲网| 骚女高跟AV在线| 97干天天| 中 文字幕一区二区三四 五 区日 日 骚| renqi久久久久久久久久久久| 国产成人无码久久精品| 日本性爱少妇| 成人免费不卡在线视频| 亚洲成人久久一区二区| 日韩乱伦AⅤ| 久久男人精品| 亚洲va有码在线天堂| 日韩性爱视频在线免费观看 | 熟妇熟女一区二三区| 国产馆极品诱惑| www.狠狠干.coom| 玖玖97综合| 天天操天天射青青草| 男人的天堂2018东京热啪啪啪| 首页亚洲国产高跟丝袜诱惑视频| 成人精品在线观看| 国产亚洲一黄| 亚洲精品久久久久久久久豆丁网| 好吊色在线观看| 久久久久久久久久久人妻| 日本三级小说中文字幕| 亚洲精品欧美专业| 小明看看网址| 国产精品在线一区二区| 91AV国产精品| 男人的天堂99| 97九色| 国产一区自拍欧美日韩| 国产久久av| 极品尤物在线观看| 操操AV电影| 肥臀熟女福利视频一区二区| 一区二区三区蜜桃成人撸久久东京热| 97国产天堂岛| 欧美黑人日韩少妇色情| 日本媚薬中文字幕在线| 色欲天天综合久久久无码网中文| 国产亚洲福利第一页丝袜| 91人妻精华帖| 极品极品色影院| 青青草自拍视频在线播放| 麻豆AV96熟妇人妻| 啊啊啊啊在线播放| 97超碰色色| AV和黑人在线播放| 久久婷婷色| 超碰激情808| 五月天欧美色图| 久久春色| 东北丰满熟女国产一区| 99热这里只有精| 天天综合欧美综合| 99精品无码| 中文字幕精品免费一区二区| 福利伊人玖玖国产| 久久久精品日本一道| 欧色性第一页| 超碰2017| 久久久国产亚洲精品系列| 少妇超碰在线| 久草精品视频| 亚洲激情视频| 蜜桃一区二区三区| 宅男午夜在线视频| 情趣丝袜无码操逼视频| 妇女乱色二区| 久操免费观看| 亚洲精品免费中文字幕| 一起草日韩| 色啪网| 久久大陆| 日韩免费性爱视频在线观看| 美女诱惑1区2区| 亚洲综合69| V A在线| 91人妻Pr| 曰本91情色| 神马久久久久| 五月婷婷激情综合| 精品一区二区三区蜜桃臀www| 秋霞怕怕片| 亚洲激情综合| 啊啊啊在线看| 日韩精品在线视频在线观看| 插入综合网| 91N综合网| 国产欧美岛国精品一区| 极品粉嫩一区二区| 老熟女综合| 97碰在线视频| 国偷自 一区| 视频黄色国产一级| 九九成人精品| 91av熟女人妻| 久久发布国产伦子伦精品| 最新制服中文第一页| 色牛牛AV| 中文字幕精品三级久久久| 欧美日韩色综合网| 91天堂视频| 强奸抽插av| 亚洲中文字幕有码视频一区二区三区| 78精品| 婷婷久久久| 欧美亚洲首页| 婷婷五月天激情小说| 99re视频在线播放青草| 久久露脸国产老熟女| julia ann久久| 凸凹视频在线观看| 国产又大又粗又长视频| 国产精品无码在线| 亚洲男人天堂2| 国产在线视视频有精品| 国产2.3.4区| 色综合色欲色综合色综合色综合| 无卡一区=区| 中文久久爆乳| av影院十区| 丁香五月天堂网| 日韩97P| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 成人午夜高潮av猛片| 国产精品情侣啪啪| 97超碰人人模人人拍人人| 涩爱AV在线| 精品九九国产无码| 人妻五十路在线| 欧美一级A片在线看视频性色| 精品久久久久成人码免| 色吧五月| 亚洲欧美日韩偷拍色图| 欧美熟女激情| 国产一级特黄大片处女| 国产精品3| 一起草av| 超碰在线人妻中文字幕| 欧美午夜视频| 国产AV超爽| 日韩小电影| 久超超碰| 最近的最新的中文字幕视频| 超碰久超碰久| 后入内射蜜桃臀| 五月天婷婷综合网| 欧美性爱一区二区三区| 夜夜爽妓女| 日韩一性一交一A片俄罗斯| 97欧美资源| 亚洲免费精品一区| 日本视频一区二区三区| 日韩大香蕉AV影片| 中文字日本乱码| 亚洲女毛多水多21P| 日韩无限资源| 亚洲日韩久久精品一区| 丁香六月婷婷| 久久青青草原免费视频| 欧美色图20P| 1二区9| 丁香六月婷婷久久综合| 亚洲AV成人无码一二三久久| 91激情国产| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 久久伊人在线五区| 思思热er精品视频| 91麻豆天美| 日本精品一区二区三| 岛国小电影| 美女被艹尤物视频| 成人影院永久免费观看网址| 91日韩网站| 免费成人在线熟妇网| 97九色人妻| 国产在线视视频有精品| 最新av中文字幕高清| 欧美熟妇精品黑人巨大91| 伦在线97| 亚洲中文字幕乱码无码一区二区| 国产一区二区三区影片| 操操逼视频| 好吊色综合| 中文字幕第7页| 亚洲人久久久网| 亚洲人妻熟妇三十三区| 91oumei| 日本精品成人无码| 丰满岳乱妇一区二区三区| 91性色| 日韩十八禁| 亚州高清AV| 亚洲国产蜜臀系列在线观看| 日本A级视频| 操我啊啊啊啊啊| 96精品在线| 天天干天天爽| 99综合免费视频| 亚洲制服欧美另类内射| 国产毛片久久久久久久| 亚洲影院365| 精品91| 蜜臀99久久精品久久久懂爱| 色九久| 啊啊啊好舒服视频| 欧美性高潮| 97ai亚洲| 密臀在线视频| 97欧美日韩精品| 97ai亚洲| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 精品久久久久久中文字幕视频免费| 综合色区偷拍| 久久线上视频免费看| 91中文字幕在线观看| 后入式999| 91天堂丝袜美腿| 久久久免费高清中文视频| 亚洲色图欧美色图在线播放| 色九九九九九九| 性感美女91影视| 人妻精品一区二区三区| 抽插亚洲无码| 婷婷爽人人婷婷爽视频| 久久久久久97| 日本人妻丰满熟妇久久久久久| av激情亚洲五月天| 国产兽交视频在线播放| 国产成人99久久亚洲综合| 性爱视频无打码在线观看| www.91理论| 伊人色综合网电影| 26uuu欧美| 亚射在线| 天堂涩涩|