国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲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
返回資訊列表
国产性刺激| 97亚洲欧美| 亚洲国产成人精品999| 国产伦精品一区二区三区在线观| 亚洲第一二区另类图| 91中出视频| 精品久久久久久中文字幕视频免费| 国产精品视频自拍在线| 天天综合~91入口| 久久女女| 国人欧美精品一区二区| 丝袜亚洲91| 久草尤物| 天操天操夜操夜月操月年年操| 色悠悠伊人网五月天| 欧美性爱www免费版| 久插综合| 免费观看性欧美一级| 欧美日韩国产中文超碰| 亚洲风情在线观看| 色一射色一射| 日韩欧美成人性爱在线| 欧美日韩国产男人| 日韩色| 粉嫩少妇自慰在线| 老熟女乱伦一区| 青青草伊人久久| 免费a v| 久久久久久久九九九九九九| 免费1级a做爰片观看| 99re69| 性暴力欧美猛交在线直播| 麻豆婷婷成人一二三| AV乱伦国产| 黄色二级片网站| 蜜臀久久99精品久久久久免费观| 欧美亚洲图片| 亚洲第91页| 欧美精品第四五页中文字幕在线观看| 一区二区三区看视频| 激情综合网激情综合| 久久久草成人网站久久久草成人久久久草久久久 | 五月综合激情| 亚洲乱码精品一区二区| 中文字幕精品专区搜索结果91| 乱伦av麻豆| Aa东京男人的天堂| 屌逼麻豆| AV麻豆免费一区| 久久伊人网视频一区二区三区| 婷婷丁香激情| 中文字幕视频免费| 久久露脸国产老熟女| 91色夜| 日韩久久三区| 免費黃色視頻觀看一| 伊人九九| 自拍丝袜美腿人妻| 久草网站免费在线观看| 搡老女人老91妇女老熟女| 蜜伊人色综合97| 国产极品99热在线播放69| 欧美综色欧| 综合久草| 日韩午夜精品一区二区三区电影| 青青草色AV| 97爱亚洲综合色| 大香蕉一线视频| 亚洲欧美另类图片| 99热大香蕉伊在线| 天天爽天天爽| 日本性爱少妇| 久操网址| 亚洲婷婷丁香在线| 蜜臀av网址| 国产精品久久久亚洲一区| 91久热| 九九碰九九爱97| 日本天堂网| 五月婷婷久久综合| 欧美综合区| 亚洲情色综合| 亚洲熟妇白浆无码AV| 欧美人妻精品| 一区二区三区欧美激情| 激情熟女12P| 五十路熟女,国产欧美精品区一区二区三区| 天天日夜干| 色婷婷综合久久久久中文一区二区| 日韩成人精品视频自拍| 岛国1区2区3区在线观看| 国产女主播视频在线观看| 天天操综合网| 久久久久久精品免费看A级| 色综合av综合久久| 91色欧美| 久久风骚城市| 日本免费一区二区不卡| 成人综合视频久久| 人人摸人人干| 国产精品亚洲美女久久久久| 免费又黄又裸乳的视频| 国产美女口爆吞精视频| 国语精品内射在线观看| 精品一区二区成人动漫| AV乱伦国产| 中文字幕精品人妻丝袜| 日韩成人色图| 婷婷综合五月| 亚洲人妻av| 看一级特黄a大一片| 懂色aV一区二区天美传媒| 亚洲少妇自拍中文字幕懂色| 亚洲美女 晚间男人天堂 | 最新三级网址| 日韩免费中文字幕视频| 中文字幕99999| 超碰精品97| 亚洲脚交| 玖玖资源视频一区二区三区| 欧美性五月| 亚洲自拍欧美色综合| yiren97| 一区二区三区在线资源| 欧美不卡在线美女| 欧美制服另类丝袜| 福利风月五月天影院| 五月婷婷六月丁香| 一色网男人的天堂| 裸体美女免费看网站青草| 一区二区三区视频在线观看免费| 天天搞在线综合网| 嫩草一区二区在线观看| 成人免费福利网站国产| 91成人社区| 97在线日韩中文字幕| 九色97| 俄罗斯一区二区视频在线观看| 在线另类| 五月色综合| 九九人人操| 亚洲精品三| 天天草天天干天天日| 黄色欧美性爱视频| 欧美一区二区亚洲天堂| 少妇二级| 一区二区三区日韩欧美| 农村妇女精品一区二区| 91操人| 国产人人干| 久操影视| 九九九九九九综合| 碰碰97| 懂色av一区二区三区天美传媒| 大香蕉手机在线| 超碰天天去日穴| 91色夜| 亚洲国产精品成人久久蜜臀| 热思思免费视频| A一区片| 中国一级特黄大片护士| 中文字幕亚韩| 蜜臀久久久久久999| 精品免费一区二区三区在线亚洲人成| 日韩国产十八禁| 在线人人人人人人精品超| 成人乱码一区二区三少妇| 色香色欲天天综合网天天来吧| 中文久久爆乳| 91精品综合久久久久久五月丁香| 91女在线观看| 亚洲综合九| 久久久国产护士丝袜美腿一| 欧美成人精品一区| 操B视频日韩无码| 亚洲国产精品9999在线观看| 国产99 中文字幕日韩小视频| 9久综合网| 国产午夜福利视频在线| 亚洲少妇在线观看| 探花熟女,姿勢到位,體驗感也到位| 国产中文字幕曰本毛片| 91大神电影天堂| 青青草啪啪网| 国产suv一区二区三区6| 免费av在线播放二区| 黄色网址在线免费观看| 极品粉嫩一区二区| 天天综合站| 白嫩少妇| 久久久国产成人一区二区三区在线 | 最新加勒比丝袜在线| 青青草日本中文字幕 | 亚洲骚男同com| 好色综合| 久9视频| 欧美中文字幕一区| 日韩无码服务区| 久久精品 六十路 熟女 欧美| 亚洲一本大道中文字幕无码在线| 色综合一区二区三巨| 天天综合网AV91| 91丰满| 天天干天天舔| 国产精品电影| 中文久久96| 日日摸天天爽夜夜欢| 乱伦Av网| 欧美91在线+|+欧美| 最新制服中文第一页| 无码天天操| 国产精品91一样| 99国产精品自在自在| 色欲Av人妻精品一区二| 亚洲天堂,男人| 97视频900| 精品九九九| 五月丁香成人网| 日韩97视频| 92性色国产午夜福利在线661| 在线播放中文字幕| 都市激情人妻一区二区青青操视频 | 国产亚洲精品美女久久久久久2021| 91 手机在线播放 绯色| 欧美丝袜中文字幕07在线| 精品人妻一区二区视频| 黄网站黄视频网站进入口| 久九色| 色色五月婷婷| 久久久三区二区一区| 国产成年女人免费视频播放a| 激激五月| 精品视频一区二区| 欧美午夜色妇色鬼| 国产v亚洲v日韩v欧美v片另类| 精品国产片亚洲一区| 色五月婷婷麻豆在| 伊人97色天使| 免费国产| 国产传媒操逼视频| 亚洲日本韩国极品一区二区| 午夜理论片在线观看免费| 日本大香蕉| 欧美黄色大片在线观看 | 自拍欧美| 午夜视频久久久久一区| av午夜玫瑰| 欧美日韩插逼视频| 人妻人人澡人人爽人人| 天天操夜夜嗨| 大粗鳼巴久久久久| 中文字暮97| 综合久久2017| av操操不卡| 久久久精品91八戒| 日日嗨AV一区二区夜夜| 日韩女模中文造逼| 亚洲久久久久| 亚洲最大黄网| 欧美日韩国产另类综合| 亚洲日产专区婷婷| 欧美黄片欧美黄片xxx| 日韩av情韩国爱禁区av一区二区| 欧美成人黄网色网站| 亚洲性综合11| 婷婷国产精品一区二区| 久热伊人| 亚洲男人的天堂一区二区| 69超碰综合| 日本天天操| 精品国产乱码久久久兰草影视| 国产日韩区| 天天舔天天日天天射| 最新的亚洲无吗| 久久久一二三四区| 91久久精品国产| 免费啪啪av| daxiangjiao你懂的| av日韩在线观看电影| 青青草中出视频 | 殴美牲| 亚洲福利影院一区久久| 蜜臀AV成人精品蜜臀| 日韩欧美aⅴ综合网站发布| 97国产精选| 人妻一区二区三区四区视频| 成人青青草原伊人| 婷婷情色综合网| 超碰人人操97碰| 韩国毛片一区二区三区| 美女91在线观看| 永久免费发布性爱网| 992视频一区| 精产国品一区二三产品| 六十路日本| 17c嫩草51久久91嫩草| 欧美曰韩国产精品| 操逼日韩无码 | 成人性爱全视频观看| 欧美在线91| 加勒比东京热五月天天堂网| 欧美大码在线视频| 久久久久国产亚洲一区欧美色图日韩 | 欧美色图片91| 国产夫妻性生活视频| 欧美日韩精品久久久久东北老熟妇| 大香交伊人网| 秋霞视频一区二区| 久久华人网| 丝袜视频网国产90| 久草新免费| 久久久网站| 极品欧美一区二区三区| 久操免费电影| 嗯嗯啊好大| 丁香五月AV| 亚洲国产一区二区入口| 91成人18| 久久久久久久9| 9999亚洲电影| 91狠狠综合久久久久久| 人人透人人操| 乱伦一区二区三区‘| 久操国产在线| 超碰欧美97资源| 久久久∴| 欧美黄色图片| 99色悠悠| 97超碰碰碰| 强奸乱亚洲| 成年女人黄网站| 国内亚洲高清无码| 欧美一级A一级a爱片久久| 97中文字幕一区| 日韩久久艹| 欧美激情视频一区二区三区不卡| 久久曰曰| 亚洲各类熟们中文字幕| 自拍啪啪视频| 手机看片1024你懂的国产| 性一级黄色录像片网站导航| 青青草五月份天| 加勒比伊人综合| 99.色网| 中文字幕成人理论在线| 韩国成人精品久久久免费看| 岛国激情视频软件| 蜜乳视频网站| 人人摸.人人色| 激情天天视频| 无码精品久久| 亚洲欧洲无码bt精品合集| 国产9区| 神马久久午夜| 亚洲情色综合| 操操操五月天婷婷丁香影院| 亚洲男人综合| 操逼日批| 亚洲一级性爱视频免费看| 色色网91| 国产亚洲日本精品在线| 亚洲欧美91| 欧美 日韩 亚洲 春色| 天美一二三在线观看Av| 欧美日韩夜夜| 国产无吗在线播放| 精品亚洲一区在线观看| 日韩美女啪啪一区| 精品中文字幕一区二区l - 百度| 亚洲第一无码播放立川理惠| 人人妻人人狠人人| 四虎AV在线观看| 婷婷香蕉欧美在线一区二区三区| 人妻久热在线| 色欲人妻一区二区在线| 日日做夜狠狠爱欧美黑人| 日韩不卡一二三四| 亚洲黄色电影| 夜夜骑夜夜操| 欧美中文字幕日韩在线| 欧美日本国产日韩激情视频| 欧美疯狂做爰xxxx| 综合网欧美在线| oumeisetupian| 欧美 熟女 日韩| 欧美第一页| 久久午夜神马| 亚洲 中文字幕 精品| 巨爆乳一区二区爆乳区| 欧亚在线视频| 熟妇亚洲一区二区三区| 偷拍新久久| 色图综合| 自拍偷拍亚洲熟女妇人精品| 一区二区三区欧美激情| 精品少妇一区二区三区在线视频 | 久久大黄片| 国产三级资源在线观看| 国内自拍 日韩激情 99| 在线人妻熟女一区二区三区四区五区| 一区二区三区色综合| 九九操久久国产免费视频| 欧美高清第一页| 又大又长又粗又爽又黄| 亚洲少妇喷视频看| 美女让帅哥通她小鸡鸡| 亚洲欧美色图片| 强奸乱伦AV网址| 插B在线观看| 国产传媒1234区| 91超级碰碰碰| 超碰中文字幕人妻草一区| 美女让帅哥通她小鸡鸡| 日日夜夜免费| 午夜理论片在线观看免费| 蜜臀久久99精品久久久久久久久| 日本中文字幕一区| 久久精品一区二区三区四区五区| 黄色网址在线免费观看| AV天堂电影网| 東南亚性呦成人伦理资源在线视频| 国模无码人体一区二区三| 国模吧 一区二区三区| 国产精品青青草| 浪人综合网| 亚洲精品久久久久毛片A片拉屎 | 欧美在线永久天堂| 91碰超| 久久xxxx| 蜜桃丰满熟妇av无码区不卡| 丰满人妻被猛烈进入中| 97久久超碰| 亚洲欧美日韩电影网站一区 | 日本人妻中文字幕精品| 日日日日日| 欧美色图成人网一区二区| 日本大香蕉综合网| 91干熟女| 亚洲综合大片| 精品午夜福利国产一区二区在线观看| 人妻在线臀日韩| 亚洲欧美碰碰| 色五月婷婷在线| 无码男人天堂| 国产无码高清操逼视频| 久久9久9久99久9久9| 欧美九九九| 麻豆这里只有精品| 蜜臀va69| 国产92麻豆天美精品色欲5| 91九九九小逼| 国产在线观看91精品一区| 中文字暮97| 九九九九九九九九九九九蜜桃| 少妇熟女1区2区3区| 99亚洲天堂| 久久精品无码熟妇一区二区三区视频导航 | 色性综合| 欧美亚洲情色| 亚洲人精品久久久喷水| 久操精品| 91女在线观看| 91P0RNY大屁股人妻| 亚洲91少妇| 中文字幕欧美丝袜07资源| 久久丁香| 97超碰国产亚洲精品| 天天色黄色影院天天操| 96国产污污污丝袜| 亚洲AV无码AV吞精久久久久| 91劲爆| 黄aaaaaaaaaaaaaaaaaa色网站| 国产人妻精品一区二区三区秋霞| 人人摸人人叼| 东京太热男人的天堂久久久| 啊啊啊草死我| 天天综合网一91网| 亚欧色图在线激情| 10000部十八禁看电影| 亚洲一区操| 欧美日韩青操| 亚欧高清v| 99re视频在线播放青草| 丝袜AV一二三区| 国产精品ww久久| 97色97好| A片三级无码| 日本97久久| 人人爱操| 人妻另类 专区 欧美 制服| 91偷拍欧美亚洲| 亚洲一区二区三区播放在线| 欧美图片色五月天| 精品久久久无码| 国产精品白丝在线播放| 嗯嗯啊啊好大好爽| 在免费jIzzjIzz在线视频| 呦女网站| 蜜桃臀av在线观看| 国产亚洲精品精AV.| 亚洲大色鬼| 五月天激情小说网| 超清福利精品视频在线| 国产91专区| 久久久无码国精品无码三区三区| 国产精品福利资源在线尤物| 亚洲青青草| 婷婷综合五月天| 91久久婷婷| 97操97色| 精品偷拍13p欧美dodk视频| avav青青草久久夜| 人人操天天爽| 人人透人人操| 欧美日韩大香蕉| 欧美最大综合网| 夜夜操二区| 免费观看国产小粉嫩喷水精品午| 欧美自拍网| 熟妇艹鸡八| 丁香五月久久| 亚洲自拍天堂| 好涩综合| 青青欧洲黑| AV中文在线可看| 日本激情免费大片| 天天干人人看综合| 精品人妻久久久久一区二区三区| 久久不卡一区二区| 日本五十路在线| 夜色97| 亚洲综合激情五月久久| 91w欧美| 97久久超碰日韩精品| 操逼内射干逼白丝91| 亚洲成A∨人影院在线欢看| 国产精品午夜AV完会免费 | 免费观看啪视频| 性久久久| 欧美亚洲情色| 国产国产亚洲一二三久久| 日韩精品99久久久久久中文字幕| 免费视频无码| aⅴ日韩成人电影av在线免费看av大全 | 亚洲成人精品在线一区| 久久久青青草| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 久久久无码av精| 中文字幕第9页萱萱影音先锋 | 成人在线视频一区| 91伊人大香蕉| 91美女视屏| 丁香六月激情综合| 色乱二区| 乱欲一区二区| 99re公开精品免费视频| 久久中文字幕一区不卡| www久久国产精品| 2017亚洲天堂| 97天天日| 蜜臀久久99精品久久久久久婷婷| 91精品少妇搡搡搡| 91精品国久久久久久无码| 天天碰操中国年青熟妇| 欧美大香蕉在线观看| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 91暧暧| 天堂蜜桃无码视频一区二区| 99视频只有精品| 91精品丝袜在线观看| 日韩成人精品视频自拍| 无码黑人精品一区二区三区三| 国产精品日韩在线一区| 亚洲天堂五月天国产| 91精品国产91综合久久蜜臀| 欧美高清色| 欧美日韩中文字幕人妻| 国产精品96久久久久久| 国产一区在线看| 激情欧美97| 久久内射| 久久伊人最新网址视频| 在线免费观看高清无码视频| 91AV入口| 国产十八禁视频| 成人网欧美风情| 91性生活久久久| 国产熟女一区二区丰满| 影音先锋一区二区在线资源| 久久精品视频久久久| 蜜臀久久久久久999| 99久久9| 大稥蕉免费视频这里只有精品| 亚州精人品大香蕉| 欧洲免费一区二| 天天综合影院91| 女人的天堂大香蕉网| 久久伦理视频久久大香蕉视频| 亚洲日韩久久精品一区| 啊啊啊男女| 一区二区播放| 国产传媒日韩| 中文字幕美女91| 亚洲91在线播放影院| 51一区二区三区| www.色婷婷色综合| 欧美日韩色图片| 亭亭丁香激情| 亚洲麻豆18发?| 国产精品久久久久9999小说| 婷婷超| 国产日韩区| 日本性爱少妇| 亚洲欧洲综合视频在线| 久久久草成人网站久久久草成人久久久草久久久 | 免费一级a毛片久久久久久鸭绿欲| 色色香蕉| 99久久久久| 蜜臀AV一区二区三区激情综合| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 午夜国产乱伦视频| 亚乱色| 婷婷综合激情| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 人妻二区| 老司机午夜精品视频| A 天堂| 看大黄色大片原件| 中文字幕在线免费观看视频| 麻豆视频test| 97超碰总站| 日韩精品人妻一区二区| 国产强奸乱伦xd| 日本综合久久| 精品国产污一区二区三区| 日本精品五区| 韩国免费播放一级毛片| 日韩乱伦影音先锋| 天天色综合图片| 91成人社区| 欧洲精品人妻| 亚洲天堂精品日韩电影| 超碰公开久久网| 在线精品福利免费播放| 久操视频资源站公开| 大香蕉伊利av| 五月天人妻综合| 国产精品高清2021在线| 精品高清一区二区三区三州| 日韩精品99999| 婷婷九月国产| 国内精品久久人妻性色av| 亚欧国产无码精品在线| 99热 按摩 日韩| 久久久97| 97色碰| 熟女网站最新| 看免费一级在线播放毛片| 中文字幕成人| 久久久国产护士丝袜美腿一| 欧美激情另类一区二区| 久久婷婷国产一区二区色| 日韩 欧美 国产 麻豆| 精品一级毛片在线观看| 一区二区娱乐网站| 家庭乱伦性爱av| 一区二区首页| 玖玖爱影院| 91碰碰| 国外91| 久久这里只精品免费福利| 青草视频在线看看看看看看看看看| 大香蕉欧美伊| 精品无码欧美三级| 97精品国产97久久久久久户外免费| 黑白配性爱AV成| 三级特黄60分钟播放| 九九久久首页| 91精品人| 超碰在线974| 国产熟女精品一区二区| 欧美淫穴| 无码人妻1727| 日韩乱码Av| 久久91| 夜间福利片1000无码| 青青草字幕AV| 国产成年免费大片黄在线观看| 学生妹天天看| 国产偷拍网站| 国产玖玖| 国产一级内射高清视频 | 亚洲精品国产专区在线观看| 性爱欧美五月| 狠狠婷婷亚洲中文综合久久| 亚洲国产剧情少妇激情| 久久精品人妻一区| 久久国产精品91| 黑人免费福利视频| 五月天激情婷婷| 日韩综合第八区国产精品| 美女黄频a美女大全免费皮| 欲女人妻性色av| 在线观看精品国产免费| 久久成人东京热人妻| 丁香五月婷婷啪啪| 狠狠爱夜夜| 乱色视频中文字幕| 超碰97COm中文| 91人妻超碰| 一级成人性爱| 久久久久人| 一区二区娱乐网站| 女优大全 - 91n| 澳门人妻久久| 久久大| 国产偷仑| 精品黑人一区二区| 水滴偷拍| 色哟哟-国产专区| 亚洲男人天堂av| 国产乱弄免费在线视频。| 国产成年女人免费视频播放a| oumeizonghese,www| 免费簧片在线观看| 中文字幕三四五区| WWW.操逼.COM| 精品成人女人久久| 97干在线| 日韩极品无码B| 俞拍自拍| 婷婷久久五月天| 欧美色综合| 亚州欧美一区| 五月天社区| 囯产精品久久久久久久久久梁医生 | 91熟女在线| 亚洲色91C| 国产成人网站在线观看| 在线观看一级α片刺激高潮视频| 国产精品在线一区二区| 九九热免费视频| 综合网91| 精品中文日韩字幕视频| 99蜜桃臀久久久欧美精品网站| 欧美综合777| 精品久久久九九九孕妇| 51一区二区三区| 97午夜剧场日韩| 一级性爱啪啪视频| 久久久草草精品| 国产女上位好爽在线| 老司机射| 第二页中文字幕| 超碰在97| AV中文在线可看| 999亚洲国产视频| 91国模| 偷拍五区| 亚洲A色| 任你艹| 韩美日操逼| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 亚州色图第三区| 18禁的网站在线| 久久久久亚洲Av无码专区老牛影视| 欧美丝袜美女电影一二三四区| 女人天堂AV五区在线| 日韩成人大片一区二区| 94色色电影网| 超碰这里有精品| 亚洲自拍欧美国产首页网曝| 91丨九色丨43老版熟女| 日本成人A片免费看| 偷拍精品一区二区三区| 91狠狠综合久久| 果冻传媒A片一二三区| 亚洲精品天天影视综合网| 色婷婷五月天| 91在线精品| 国产偷人伦激情在线观看| 少妇人妻在线| 玖玖资源中文字幕制服丝袜| 中文字幕精品一区二区精品| 国产一区二区视频在线播放| 强奸乱伦AV网站| 婷婷伊人五月| av激情亚洲五月天| 98久久超碰| 黑人干亚洲| 91AV天美在线视频| 另类 综合 日韩 欧美 亚洲| 日韩AV色图| 日韩人妻操B| 亚洲欧美精品一区天堂久久| 欧美色图亚洲色| 91国产操逼视频| 欧美91精彩| 久色网| 浓厚中出中文字幕在线| 天天日骚逼熟女| 亚洲三区视频| 欧洲综合视频| 猛交交| 欧美黄片视频在线观看免费 | 一本精品日本在线视频精品| 日日摸日日碰夜夜爽视频| 色69大色97香蕉| 久久精品99| 福利五区| 天操天操夜操夜月操月年年操操| 成人天天爽| 四虎在线免费视频| 婷婷激情五月综合| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 97超碰精品图片| 天躁夜夜躁2021| 蜜臀久久久99久久久久| 久久香蕉国产线看观看亚洲女人 | 精品蜜乳AV免费观看| 欧美碰碰综合色| 久久久久久久唑| 欧美色图20p| 欧美性高潮在线| 这里只有精品97| 啊啊啊啊好疼| 超碰色图| 蜜臀久久99精品久久久久久| 91亚洲欧洲| 电家庭影院午夜69久久夜色精品国产69乱 | 91日韩国产欧美亚洲另类精盘州至城都| 色色九区| 久久专区| 成人日韩3| 亚欧性爱ab| 大香蕉综合| 丁香激情网| 麻豆国产原创AV色哟哟 | 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 天美麻豆精品视频99| 中文字幕精品人妻丝袜| 精品97精品97| 风骚少妇视频中文字幕| 欧美啪啪啪91| 欧美爱爱97| 亚洲 欧美 制服 另类 自拍| AV污污污污| 人人人人人人少妇| 啊啊啊啊啊在线观看网址 | 久久精品操| 秋霞Av理论一级在线| 国产一级特黄大片处女| 五十路三级片| 亚洲男人的天堂亚洲| 久久熟妇五十路一区| 欧亚揄拍偷拍精品视频 | AAAA欧美日韩| 九月丁香婷婷色| 亚洲av强奸乱伦| 日本精品人妻少妇一区二区| 欧美一区二区三区成人性生活| 色九九久九九| 欧美日韩国产一区二区小黄片大全| 20cm女自慰在线日韩欧美| 日本欧美一区二区三区免费| 激情久久久| 欧洲一区二区三区免费| 91欧| 一本色道综合久久欧美| 丝袜美腿制服人妻二区中文字幕| 一区二区三区精品黑丝白丝酒店对鸡 | 岛国片在线播放| 亚欧毛片基地国产毛片基地| 性在久久久久久| 男人的天堂网免费| 久久人妻少妇| 国产h小视频在线观看免费| 懂色天天爱天天日天天射天天澡| 日日爽夜夜爽| 欧美 综合 亚洲| 久草成人| 日韩Va亚洲va欧美Ⅴa久久| 亚洲av在线免费观看| 九九热免费国产视频婷婷伊人五月 | 青青草在线视频美女| 天天爽夜夜爽夜夜爽精| 国产精品一级特黄aaa大片在线观看| 熟妇在线视频一区二区| 色婷婷婷五月天激情四射| 精品免费囯产一区二区三区| 亚洲欧美国产va在线播放频| 国产高清成人mv在线观看| 欧美另类色| 俞拍自拍| 国产又黄又爽又刺激久久久久久| 丁香五月激情综合| 少妇久久久免费| 精品人妻1区| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 国产不卡片| 亚洲欧美91| 欧美网站免费| 欧美激情久| 色色毛片| 粉嫩国产精品久久粉嫩| 亚洲 欧美 日本 国内 首页| 人人操,人人插| 在线啊啊啊啊| 一本色道久久综合精品婷婷| blacked精品一区国产| 亚洲第一综合| 极品少妇久久久久| 免费一级特黄特色大片在线观看看 | 综合久久婷婷| 国产精品久久久午夜夜伦鲁鲁| 91啦人妻| 啊啊啊啊啊啊啊国| 色97干| 中国女人内射6XXXXX| 超碰午夜在线| 亚洲av资源| 超碰人人色| 91超碰丝袜制服| av中亚| 欧美强奸乱能| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 国产在线综合福利网站| 加勒比大香蕉视频在线| 抽插亚洲无码| 久久香蕉网| 中文字幕女同在线| 久久精品国产精品一区| 久草久热| 欧差乱伦二三| 久久五月份| 狠狠91| 破苞ⅩXXX性无码动漫无码| 欧美韩国你懂得在线| 免费一二区| 天综合网| 亚洲 暴爽 AV人人爽日日碰| 久久精品一区二区三区不卡| 男同专区一区二区三区在线| 再深点灬舒服灬太大了好硬好爽| 老色鬼成人精品视频下载大在线观看| 全免费a敌肛交毛片免费| 97欧美久久久久久久| 色综合av男人天堂| 青操影院| 欧美亚洲日本激情在线| 日日骚av| 猛交交| 天天躁日日躁狠狠躁| 91一起操| 国产免费久久精品99re韩国| 亚洲一曲日韩精品| 羞答答AV中文字| 五月香婷婷| 欧美性爱一区二区| 九九九九久久久| yiqicaoav| 99热超碰| 欧美日韩免费性爱| 狠狠操狠狠燥| 懂色AV一区二区三区| 欧美成年人性爱视频免费观看| 狠狠夜色午夜久久综合在线| 欧美性爱1080p| 曰本道人妻久久久在线不卡色视频 | 国产区日韩区在线观看| 九九夜精品九九在线| 多乙久久久久久| 国产吹潮女在线观看| 久操网址| 亚洲高清欧美总合| 9 7超碰在线免费观看| 福利操逼| 黑丝制服中文字幕| 午夜精品久久久久久久男人的天堂| 精品对白久久不卡| 欧美久久婷婷| 日本黄 R色 成 人网站| 欲香欲色| 天海翼久久| 久久精品欧美一区蜜桃| 国产精品爽爽v| 97视频在线免费播放| 天天摸,夜夜摸| 国产精品视频麻豆入口| 中文字幕伊人| 亚洲情色五月天 | 国产免费一区| 九九九九九九亚洲| 99久久精品无码一区二区| 性色亚洲| 青青草华人在线欧美在线| 97综合在线观看| av一区二区三区 中文| 一起草高清无码| 欧美第二页午夜| 精品人人| 色婷婷九月天天综合| 亚洲 在线| 成人天天爽| 成人片在线播放| 99久国产精品午夜性色福利| 国内毛片四区| 亚洲欧美大| 国产美女高潮叫床视频| 91一区二区三区蜜桃| 亚州黄站| 性爱AV天堂| 99青草| 国产曰批免费观看久久久| 日韩99神马视频播放片在线播放| 日韩人妻播放| 五月天婷婷在线看 | 后入国产| 很狠操| 天堂精品小草| 97在线观看播放视频| 日日夜夜模| 亚洲不卡不卡中文字幕不卡 | 极品销魂美女一区二区| 天堂亚洲精品| 中文字幕人乱码中文字的预防方法 | 999999精品| 色五月AV在线| 欧美午夜视频| 男人干美女| 中文字幕在线观看第二页| 婷婷中文字幕| 国产成人bd在线观看| 一线黄色免费性爱片| 韩国成人精品久久久免费看| 99爱爱| 精品二999| 亚洲熟女乱色一区二区三区 | 久久网亚洲| 日本亚洲熟女视频| 大香蕉日韩欧美| 激情看片网站| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 亚洲福利中文字幕在线| 成人性爱美曰韩| 高清无码在线播放网站| 嫩呦国产一区二区三区AV| 国产真实子伦对白| 最新制服中文第一页| 91亚洲网站| avav青青草久久夜| 9997se| 老师充足的奶水小说| 97一区二区蜜臀| 97亚洲综合电影| 综合色图亚洲欧美| 麻豆天美国美国产| 淫妻综合网| 亚洲国产精品久久久久久久久久| 天天综合网站| 婷婷五月天色色| 97操碰| 色香阁在线| 超碰久久性爱| 欧美综合第一| 欧美熟女丝袜| 成人在线永久| 色呦色呦色精品| 色老汉色| 蜜臀精品1区2区| 麻豆婷婷成人一二三| 中文有码第五页| 伊人伊人LD| 国产精品国产| 夜夜春夜夜操| 欧美少妇人妻| 精品国产乱码久久久久久蜜臀| 精品九区| 无码久久国产 | 亚洲欧美一区二区三区在钱蜜桃| 欧亚免费视频| 六六久久日韩不卡| 午夜性| 在线一区| 欧美在线干| 欧美精品亚洲精品日韩传电影| 婷婷五月天色网| 四虎AV在线播放| 综合久久99| 日韩99精品视频综合区| 岛国AB视频| 99久久精品国产高潮| 亚洲性综合9| 亚州伊人色综台| 精品国产99| 丰满熟女人妻一区二区三五十一路| 日本道人妻久久久在线不卡色视频| 日韩一区二区精品视频| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 五月丁香在线| 欧美日韩性爱操大逼| 中文字幕一区二区在线日韩精品| 日本成人电影资源网| 秋霞蝌科网日本一区| 日本精品无码三级网站| 亚洲国产第一页综合视频| 欧美成人色| 欧美热图99| 吖在线不卡一区二区国产剧情| 极品极品色影院| 97精品国产97久久久久久户外免费| 亚洲熟女偷拍在线观看| 中日韓欧美高清| 亚洲成aⅴ人片不卡无码| 人人考人人摸人人干| 久久9亚洲| 国产风韵犹存熟妇三区| 一区二区影视| 93人人操人人| 五月丁香久久| 青青草男人天堂| 日韩三级av片| 五月婷婷丁香六月丁香| www.99视频| 婷婷五月影院| 日韩少妇在线视频| 日本一区不卡| 国产精品蜜乳AV| 亚洲综合影片| 国产日韩怡红院| 在线播放一级无码视频| 亚洲另类电影| 午夜福利在线视频1000| 人妻熟女一区二区在线视频| 国产无码精品高清| 亚洲成人av色网| 日日夜夜青青草母狗| 极品AV网站在线观看| 97精品在线视频| 粉嫩粉嫩一区性色AV片| 亚洲人妻一区二区三区| 玖玖爱伊人玖玖爱| 日韩操逼性鲍| 插日本熟女视频| 蜜桃视频一区二区三区在线观看| 另类图片五月天| 欧美日韩操逼动图| 91N五十路| 亚洲天堂另类| 日韩欧美中文| 国厂麻豆77q4| 国内伊人久久久久久网站视频| 欧美亚洲尤物久久| 国产天天看| 婷婷爽人人婷婷爽视频| 成人在线视频网| 亚熟hd视频在线| 粉嫩av平台| 日本天天人人狠狠在线日美女|