久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

MyBatis-Plus代碼生成器實(shí)戰(zhàn):從數(shù)據(jù)庫(kù)表到CRUD代碼一鍵生成

MyBatis-Plus代碼生成器實(shí)戰(zhàn):從數(shù)據(jù)庫(kù)表到CRUD代碼一鍵生成 前陣子幫朋友維護(hù)一個(gè)老系統(tǒng)數(shù)據(jù)庫(kù)里二十多張表業(yè)務(wù)不算復(fù)雜但每張表都得配實(shí)體類、Mapper接口、XML、Service、ServiceImpl、Controller。一開(kāi)始我還挺有耐心手寫了四五張表以后實(shí)在頂不住全是機(jī)械重復(fù)的增刪改查真正要?jiǎng)幽X子的業(yè)務(wù)邏輯反而沒(méi)時(shí)間看。后來(lái)把MyBatis-Plus 代碼生成器也就是常說(shuō)的數(shù)據(jù)庫(kù)逆向工程接進(jìn)來(lái)從表結(jié)構(gòu)到可運(yùn)行的代碼一分鐘不到就能產(chǎn)出一套我把省下來(lái)的時(shí)間全花在業(yè)務(wù)優(yōu)化上。今天這篇就把我實(shí)際配置、跑通、二次改造的完整過(guò)程寫出來(lái)包括版本選擇的坑、連接串里的雷區(qū)、模板改造的細(xì)節(jié)以及生成之后必須處理的幾件收尾事。本文適合誰(shuí)看如果你正在用 MyBatis-Plus 寫后端接口或者項(xiàng)目里有一堆表等待建 CRUD又或者你之前試過(guò)動(dòng)軟、軟著代碼生成器這類老工具但覺(jué)得生成結(jié)果太死板、不好改這篇應(yīng)該能幫到你。我盡量把每個(gè)配置項(xiàng)背后的理由講清楚不光是給一段能跑的代碼而是讓你知道哪一項(xiàng)改了對(duì)結(jié)果有什么影響這樣你拿到自己的項(xiàng)目里也能靈活調(diào)整。1. 還在手寫CRUD的人值得重新認(rèn)識(shí)一下數(shù)據(jù)庫(kù)逆向工程1.1 從動(dòng)軟到MyBatis-Plus老派生成器為什么讓人又愛(ài)又恨如果你做過(guò)一段時(shí)間的后端開(kāi)發(fā)多少聽(tīng)過(guò)動(dòng)軟代碼生成器或者某些軟著申請(qǐng)配套用的代碼導(dǎo)出工具。這些工具在當(dāng)年確實(shí)解決了大批量建代碼的問(wèn)題連上數(shù)據(jù)庫(kù)選擇表點(diǎn)擊生成Controller、Model、DAL 一堆文件就出來(lái)了。但用過(guò)的同學(xué)大概率有同感生成的東西太重且太老模板結(jié)構(gòu)是固定的想加個(gè) Swagger 注解、想把主鍵策略換一下、想讓實(shí)體類繼承公共父類都要去翻生成器的配置界面試半天或者生成完手動(dòng)批量替換。更麻煩的是這類工具生成的代碼往往和項(xiàng)目里實(shí)際使用的框架版本脫節(jié)拿回來(lái)還要改依賴、改命名空間規(guī)模一大反而比手寫還累。MyBatis-Plus 代碼生成器是另一種思路它以依賴庫(kù)的形式直接寄生在你的項(xiàng)目里你寫一段 Java 配置去驅(qū)動(dòng)它生成結(jié)果天然貼合 MyBatis-Plus 的體系——實(shí)體類帶TableName、TableIdMapper 繼承BaseMapperService 繼承IServiceController 里直接注入IService調(diào)用現(xiàn)成方法。它不追求生成一套完整的三層架構(gòu)而是生成一套能被 MyBatis-Plus 直接驅(qū)動(dòng)的骨架。所以相比之下它的生成結(jié)果更輕、更貼合主流 Spring Boot 項(xiàng)目的習(xí)慣改起來(lái)也容易。1.2 逆向工程到底能替你做什么、不能替你做什么剛接觸代碼生成器的人容易把它想象成一個(gè)輸入數(shù)據(jù)庫(kù)、輸出整個(gè)項(xiàng)目的神器實(shí)際不是這樣。MyBatis-Plus 代碼生成器做的事本質(zhì)上只有一件讀取數(shù)據(jù)庫(kù)表結(jié)構(gòu)字段、類型、注釋、索引、主鍵翻譯成 Java 代碼文件。它能穩(wěn)定解決的是單表 CRUD 那 80% 的重復(fù)勞動(dòng)。它能替你做的我總結(jié)下來(lái)主要有這些根據(jù)表名和字段名生成實(shí)體類自動(dòng)把user_name轉(zhuǎn)成userName下劃線命名轉(zhuǎn)駝峰。根據(jù)主鍵類型生成對(duì)應(yīng)的TableId注解配置好自增或輸入型主鍵策略。生成 Mapper 接口和 XML 文件XML 里預(yù)留好ResultMap和基礎(chǔ)字段列表。生成 Service 接口與實(shí)現(xiàn)類自動(dòng)繼承IService/ServiceImpl自帶save、removeById、page等通用方法。生成 Controller提供一套最基礎(chǔ)的增刪改查 REST 接口。把數(shù)據(jù)庫(kù)字段注釋同步成實(shí)體類字段的 Javadoc代碼可讀性直接從零分拉到及格線。它不能替你做的也很明顯跨表復(fù)雜查詢、業(yè)務(wù)狀態(tài)流轉(zhuǎn)、權(quán)限校驗(yàn)、數(shù)據(jù)權(quán)限過(guò)濾這些還是要自己寫。所以我的建議是把生成器當(dāng)腳手架別把它當(dāng)業(yè)務(wù)引擎。它負(fù)責(zé)把地基和承重墻搭好里面的裝修和功能分區(qū)得自己來(lái)。2. 版本與依賴先把環(huán)境里的坑填平2.1 版本矩陣主框架與生成器版本號(hào)并不總是一一對(duì)應(yīng)我第一次用 MyBatis-Plus 代碼生成器時(shí)踩的坑就是版本號(hào)配錯(cuò)。項(xiàng)目里mybatis-plus-boot-starter用的是3.5.3.1我隨手找了一篇老文章把mybatis-plus-generator配成了3.5.1結(jié)果AutoGenerator類的 API 對(duì)不上編譯直接報(bào)錯(cuò)。后來(lái)才知道MyBatis-Plus 的主框架版本和代碼生成器版本是從某個(gè)版本開(kāi)始各自獨(dú)立演進(jìn)的生成器并不是跟著主框架的版本號(hào)走的。這里簡(jiǎn)單梳理一下版本演變的脈絡(luò)。在3.5.1及之前大家常見(jiàn)到的寫法是AutoGeneratorGlobalConfigDataSourceConfigPackageConfigStrategyConfig用鏈?zhǔn)?setter 來(lái)配置。到了3.5.2之后官方主推FastAutoGenerator配置方式從先 new 對(duì)象再逐步 set變成了create lambda 回調(diào)代碼更簡(jiǎn)潔。到我現(xiàn)在用的3.5.4/3.5.3這些版本里FastAutoGenerator已經(jīng)很穩(wěn)定了。我建議你自己項(xiàng)目里如果主框架是3.5.x直接上FastAutoGenerator別再用老的AutoGenerator。如果主框架還是3.4.x那生成器也得跟著用對(duì)應(yīng)老版本否則啟動(dòng)時(shí)可能出現(xiàn)方法找不到之類的兼容問(wèn)題。這里提供一個(gè)我測(cè)試過(guò)的版本組合dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-generator/artifactId version3.5.3/version /dependency dependency groupIdorg.freemarker/groupId artifactIdfreemarker/artifactId version2.3.32/version /dependency注意最后那個(gè)freemarker這是模板引擎依賴。生成器本身不內(nèi)置模板引擎官方默認(rèn)使用的是 Velocity但如果你的項(xiàng)目里沒(méi)有引入 Velocity運(yùn)行時(shí)會(huì)報(bào)找不到模板引擎相關(guān)的類。我習(xí)慣用 Freemarker因?yàn)樗哪0逭Z(yǔ)法我相對(duì)熟而且 Spring Boot 項(xiàng)目里很多時(shí)候已經(jīng)依賴了它不會(huì)有沖突。如果你要用 Velocity就引入velocity-engine-core用 Beetl 就引入beetl。這步最容易漏漏了之后生成器代碼本身能編譯一運(yùn)行就報(bào)錯(cuò)。2.2 數(shù)據(jù)庫(kù)連接串里的隱藏雷區(qū)驅(qū)動(dòng)、時(shí)區(qū)與 nullCatalogMeansCurrent搞定 Maven 依賴之后第二個(gè)大坑出現(xiàn)在數(shù)據(jù)庫(kù)連接串上。生成器要連數(shù)據(jù)庫(kù)讀表結(jié)構(gòu)這一步跑不通后面全是空談。首先要確認(rèn) MySQL 驅(qū)動(dòng)版本。MySQL 5.x 用的是com.mysql.jdbc.Driver但新版 MySQL 驅(qū)動(dòng)已經(jīng)把老驅(qū)動(dòng)類標(biāo)記過(guò)時(shí)換個(gè) MySQL 8.x 版本就要改成com.mysql.cj.jdbc.Driver。我的習(xí)慣是直接用com.mysql.cj.jdbc.Driver配合mysql-connector-j8.x 驅(qū)動(dòng)不管連 MySQL 5.7 還是 8.0 都能跑。如果你用的是連接池包驅(qū)動(dòng)類名照抄就行不用額外處理。然后是連接串的 URL 參數(shù)。一個(gè)比較常規(guī)的示例是jdbc:mysql://127.0.0.1:3306/my_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghainullCatalogMeansCurrenttrue這里幾個(gè)參數(shù)缺一不可useSSLfalse不關(guān)掉 SSL 握手某些環(huán)境下連接會(huì)非常慢甚至超時(shí)。生成器本來(lái)是一次性工具能少一事是一事。serverTimezoneAsia/ShanghaiMySQL 8.x 驅(qū)動(dòng)強(qiáng)制要求設(shè)置時(shí)區(qū)不設(shè)就會(huì)報(bào)The server time zone value ... is unrecognized代碼根本跑不起來(lái)。nullCatalogMeansCurrenttrue這是個(gè)冷門參數(shù)但建議從一開(kāi)始就加上。它解決的是連接串里指定了數(shù)據(jù)庫(kù)名之后驅(qū)動(dòng)在讀取表清單時(shí)把catalog當(dāng)成 null導(dǎo)致去讀系統(tǒng)庫(kù)比如information_schema或其它你有權(quán)限的庫(kù)的表生成出一堆莫名其妙的表。加上這個(gè)參數(shù)驅(qū)動(dòng)會(huì)更嚴(yán)格地按照連接串里的庫(kù)名去讀取避免明明只想生成用戶表結(jié)果把系統(tǒng)表也掃進(jìn)來(lái)的情況。還有一個(gè)隱藏問(wèn)題生成器對(duì) MySQL 8 和 MySQL 5 的元數(shù)據(jù)讀取方式有差異如果你用的是 MySQL 5.6連接串里serverTimezone參數(shù)可能反而不被識(shí)別那就要看驅(qū)動(dòng)版本必要時(shí)降級(jí)驅(qū)動(dòng)??傊劝羊?qū)動(dòng)和連接參數(shù)對(duì)齊再往下配生成器。3. FastAutoGenerator核心配置拆解每一項(xiàng)設(shè)置都帶著理由3.1 全局配置從代碼風(fēng)格到注釋歸屬配置代碼寫起來(lái)不復(fù)雜但每一項(xiàng)的含義和影響范圍值得逐一看清楚。我先把一個(gè)完整的FastAutoGenerator示例放出來(lái)后面再拆開(kāi)講FastAutoGenerator.create( jdbc:mysql://127.0.0.1:3306/my_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghainullCatalogMeansCurrenttrue, root, 123456) .globalConfig(builder - { builder.author(shipan) // 作者名會(huì)寫到類注釋里 .enableSwagger() // 生成 Swagger 注解 .dateType(DateType.TIME_PACK) // 時(shí)間類型用 java.time 包 .commentDate(yyyy-MM-dd) // 生成注釋里的日期格式 .outputDir(System.getProperty(user.dir) /src/main/java); }) .packageConfig(builder - { builder.parent(com.example.demo) .moduleName(system) .entity(entity) .mapper(mapper) .service(service) .serviceImpl(service.impl) .controller(controller) .pathInfo(Collections.singletonMap( OutputFile.xml, System.getProperty(user.dir) /src/main/resources/mapper)); }) .strategyConfig(builder - { builder.addInclude(sys_user, sys_role, sys_user_role) .addTablePrefix(sys_) .entityBuilder() .enableLombok() .logicDeleteColumnName(deleted) .versionColumnName(version) .enableTableFieldAnnotation() .controllerBuilder() .enableRestStyle() .formatFileName(%sController); }) .execute();globalConfig里的author會(huì)直接進(jìn)到每個(gè)類的 Javadoc 注釋里團(tuán)隊(duì)協(xié)作時(shí)建議寫真實(shí)姓名或工號(hào)方便追溯。enableSwagger()開(kāi)不開(kāi)取決于項(xiàng)目里是否已經(jīng)集成了 Swagger/OpenAPI如果集成了就開(kāi)生成的實(shí)體類字段上會(huì)自動(dòng)加ApiModelPropertyController 方法上會(huì)加ApiOperation如果項(xiàng)目里沒(méi)集成 Swagger開(kāi)了反而編譯不過(guò)。dateType(DateType.TIME_PACK)是我個(gè)人的偏好把Date替換成LocalDateTime現(xiàn)代項(xiàng)目基本都是這個(gè)約定避免一堆Date類型在時(shí)間格式化上反復(fù)踩坑。commentDate控制的是類注釋里since 2025-01-01這種日期的格式默認(rèn)帶時(shí)間分秒我改成純?nèi)掌诟蓛粢稽c(diǎn)。3.2 包名與模塊劃分決定代碼長(zhǎng)在哪棵樹(shù)上packageConfig最大的作用是決定代碼生成到哪個(gè)包下面。很多人只配置了parent沒(méi)配置moduleName結(jié)果所有類都直接堆在com.example.demo下面項(xiàng)目結(jié)構(gòu)立刻變成一鍋粥。我的做法是parent寫項(xiàng)目的根包moduleName寫當(dāng)前模塊或業(yè)務(wù)域的名字比如system、order、user這樣生成的類會(huì)落在com.example.demo.system.entity、com.example.demo.system.mapper這類路徑下一個(gè)業(yè)務(wù)域一個(gè)包找代碼和做權(quán)限控制都方便。還有個(gè)細(xì)節(jié)容易忽略entity、mapper、service、serviceImpl、controller這些子包名默認(rèn)是英文如果你們團(tuán)隊(duì)有自己約定比如用model、dao、manager代替默認(rèn)名稱也可以在這里改。真正決定輸出路徑的是包名 Java 源碼目錄所以不要只改子包名而忘了確認(rèn)最后的輸出目錄是否在src/main/java下。特別要提的是pathInfo這一項(xiàng)。默認(rèn)情況下生成的 XML 文件會(huì)放在src/main/java對(duì)應(yīng)的包目錄里這不符合 Maven 工程的約定。正常的 XML 應(yīng)該放在src/main/resources/mapper下。所以必須用pathInfo把OutputFile.xml指向資源目錄否則后續(xù) MyBatis 掃描 XML 時(shí)會(huì)找不到文件。這是我每次配置必寫的一項(xiàng)而且它只影響 XML 的輸出位置不改變 Mapper 接口的包名兩者互不影響。3.3 策略配置收窄生成范圍保留擴(kuò)展余地strategyConfig是整個(gè)生成器里最需要花心思的部分。第一件事是明確要生成哪些表。addInclude就是白名單只生成指定的表。為什么不直接全庫(kù)生成因?yàn)楹芏鄻I(yè)務(wù)庫(kù)里會(huì)有各種歷史表、臨時(shí)表、統(tǒng)計(jì)表這些表根本不需要生成 CRUD 代碼全庫(kù)生成會(huì)制造一堆垃圾類。用addInclude收窄范圍每次跑生成器之前先想清楚這次要?jiǎng)幽男┍泶a產(chǎn)出可控。特殊情況下可以用addExclude排除表但我印象里用白名單比黑名單理性因?yàn)槟阍谡f(shuō)我只要這些而不是除了這些我都要。addTablePrefix(sys_)表示生成實(shí)體類時(shí)去掉sys_前綴。比如表名sys_user生成的實(shí)體類是User而不是SysUser。這個(gè)前綴設(shè)計(jì)在大型項(xiàng)目里比較常見(jiàn)表名用統(tǒng)一前綴做業(yè)務(wù)域隔離但 Java 類名里不需要這個(gè)前綴。如果你的表已經(jīng)叫user_info沒(méi)有多余前綴那addTablePrefix就不加讓user_info直接轉(zhuǎn)成UserInfo即可。entityBuilder下面的幾項(xiàng)也值得說(shuō)說(shuō)。enableLombok()開(kāi)啟后生成的實(shí)體類上會(huì)加Data注解不生成一堆 getter/setter 方法代碼立刻簡(jiǎn)潔一個(gè)量級(jí)前提是項(xiàng)目里已經(jīng)引入了 Lombok 依賴否則編譯報(bào)錯(cuò)。logicDeleteColumnName(deleted)指定表里的邏輯刪除字段名生成器會(huì)在實(shí)體類對(duì)應(yīng)字段上自動(dòng)加TableLogic注解這樣走 MyBatis-Plus 的通用刪除方法時(shí)就會(huì)自動(dòng)改成update語(yǔ)句而不是delete語(yǔ)句這是線上系統(tǒng)不能省的安全底線。versionColumnName(version)指定樂(lè)觀鎖版本字段生成的字段上會(huì)帶Version配合后續(xù)配置的樂(lè)觀鎖插件就能實(shí)現(xiàn)并發(fā)更新的安全控制。enableTableFieldAnnotation()比較容易被忽略。開(kāi)啟后實(shí)體類每個(gè)字段上都會(huì)加TableField(列名)雖然 MyBatis-Plus 默認(rèn)也能根據(jù)駝峰轉(zhuǎn)下劃線自動(dòng)映射但顯式標(biāo)注可以避免字段名里出現(xiàn)特殊詞、多詞縮寫時(shí)映射錯(cuò)亂。代價(jià)是代碼稍微啰嗦一點(diǎn)但穩(wěn)妥性更好。我傾向于開(kāi)啟尤其是在接手老表、字段命名不規(guī)范的情況下這個(gè)注解等于一個(gè)保護(hù)罩。最后是controllerBuilder部分。enableRestStyle()讓生成的 Controller 自動(dòng)加RestController而不是Controller省得每生成完一批代碼還手動(dòng)改一個(gè)注解formatFileName(%sController)控制類名格式默認(rèn)就是UserController這種一般不用改但如果你不喜歡 Controller 后綴也可以改成%sApi之類。3.4 數(shù)據(jù)源配置選擇目標(biāo)庫(kù)的正確姿勢(shì)可能有人會(huì)問(wèn)FastAutoGenerator.create(url, username, password)不是已經(jīng)寫了連接信息嗎為什么還要單獨(dú)配置數(shù)據(jù)源原因在于create方法接受的是最簡(jiǎn)單的基礎(chǔ)連接參數(shù)而dataSourceConfig允許你指定更細(xì)的數(shù)據(jù)庫(kù)類型、驅(qū)動(dòng)類名以及自定義數(shù)據(jù)庫(kù)類型轉(zhuǎn)換規(guī)則。對(duì)于大部分單數(shù)據(jù)源項(xiàng)目直接create(url, username, password)就夠了。但如果你連接的是 PostgreSQL、Oracle 或者 SQLServer推薦用dataSourceConfig顯式聲明FastAutoGenerator.create( new DataSourceConfig.Builder(url, username, password) .databaseQueryClass(SqlQuery.class) // 默認(rèn)根據(jù) url 判斷一般不用手動(dòng)指定 .typeConvert(new MySqlTypeConvert()) .build() )實(shí)際項(xiàng)目中我用得最多的是默認(rèn)行為。只有當(dāng)數(shù)據(jù)庫(kù)驅(qū)動(dòng)無(wú)法被自動(dòng)識(shí)別或者字段類型映射不符合預(yù)期的時(shí)候才需要顯式去改。比如 MySQL 的tinyint(1)在某些版本里會(huì)被映射成Boolean但業(yè)務(wù)上可能希望映射成Integer這時(shí)就需要自定義typeConvert來(lái)處理。這個(gè)屬于進(jìn)階玩法新手可以先跳過(guò)等遇到具體問(wèn)題再回來(lái)調(diào)。4. 從建表到出代碼一次完整逆向工程演示4.1 準(zhǔn)備一張覆蓋常見(jiàn)場(chǎng)景的業(yè)務(wù)表光講配置不落地看完還是不會(huì)用。我拿一張實(shí)際業(yè)務(wù)表跑一遍完整流程你可以照著建表、照著生成然后對(duì)比結(jié)果。假設(shè)我們要生成一個(gè)系統(tǒng)用戶相關(guān)的代碼表結(jié)構(gòu)如下CREATE TABLE sys_user ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主鍵ID, username varchar(50) NOT NULL COMMENT 用戶名, password varchar(100) NOT NULL COMMENT 密碼, nickname varchar(50) DEFAULT NULL COMMENT 昵稱, email varchar(100) DEFAULT NULL COMMENT 郵箱, phone varchar(20) DEFAULT NULL COMMENT 手機(jī)號(hào), status tinyint(1) DEFAULT 1 COMMENT 狀態(tài)1啟用 0禁用, deleted tinyint(1) DEFAULT 0 COMMENT 邏輯刪除標(biāo)記0未刪除 1已刪除, version int(11) DEFAULT 0 COMMENT 樂(lè)觀鎖版本號(hào), remark varchar(500) DEFAULT NULL COMMENT 備注, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 創(chuàng)建時(shí)間, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新時(shí)間, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT系統(tǒng)用戶表;注意我在建表時(shí)把每個(gè)字段的COMMENT都寫清楚了。這一步非常關(guān)鍵因?yàn)樯善鲿?huì)把字段注釋直接變成實(shí)體類字段的 Javadoc。如果建表的時(shí)候圖省事不寫注釋生成的實(shí)體類是干干凈凈的后面看代碼的人只能去翻數(shù)據(jù)庫(kù)體驗(yàn)極差。好的表結(jié)構(gòu)是好代碼的第一步這句話在代碼生成器場(chǎng)景下體現(xiàn)得淋漓盡致。這張表里涵蓋了常用的字段類型主鍵bigint自增、字符串、整數(shù)、布爾、日期時(shí)間還有邏輯刪除字段deleted和樂(lè)觀鎖字段version生成的代碼能覆蓋絕大多數(shù)后端 CRUD 場(chǎng)景。4.2 運(yùn)行生成器與產(chǎn)出文件配置沿用上一節(jié)的完整示例我這里把實(shí)際跑起來(lái)的main方法貼完整方便你直接復(fù)制修改public class CodeGenerator { public static void main(String[] args) { String url jdbc:mysql://127.0.0.1:3306/my_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghainullCatalogMeansCurrenttrue; String username root; String password 123456; FastAutoGenerator.create(url, username, password) .globalConfig(builder - { builder.author(shipan) .enableSwagger() .dateType(DateType.TIME_PACK) .commentDate(yyyy-MM-dd) .outputDir(System.getProperty(user.dir) /src/main/java); }) .packageConfig(builder - { builder.parent(com.example.demo) .moduleName(system) .entity(entity) .mapper(mapper) .service(service) .serviceImpl(service.impl) .controller(controller) .pathInfo(Collections.singletonMap( OutputFile.xml, System.getProperty(user.dir) /src/main/resources/mapper)); }) .strategyConfig(builder - { builder.addInclude(sys_user) .addTablePrefix(sys_) .entityBuilder() .enableLombok() .logicDeleteColumnName(deleted) .versionColumnName(version) .enableTableFieldAnnotation() .controllerBuilder() .enableRestStyle() .formatFileName(%sController) .mapperBuilder() .enableBaseColumnList() .enableBaseResultMap(); }) .execute(); } }運(yùn)行后項(xiàng)目src/main/java下會(huì)多出這些文件src/main/java/com/example/demo/system/ ├── controller/ │ └── UserController.java ├── entity/ │ └── User.java ├── mapper/ │ └── UserMapper.java ├── service/ │ ├── UserService.java │ └── impl/ │ └── UserServiceImpl.java src/main/resources/mapper/ └── UserMapper.xml注意UserMapper.xml被我手動(dòng)指定到了src/main/resources/mapper下而不是默認(rèn)的src/main/java。這是很多人在生成完代碼后出現(xiàn)Invalid bound statement報(bào)錯(cuò)的主要原因路徑不對(duì)MyBatis 找不到對(duì)應(yīng)的 SQL 映射文件所以從配置階段就得把它掰到正確的位置。4.3 查看生成的代碼哪些直接用哪些要?jiǎng)邮指纳赏暌院笪覀兿瓤纯磳?shí)體類長(zhǎng)什么樣。下面是生成的User.java核心內(nèi)容Data EqualsAndHashCode(callSuper false) TableName(sys_user) ApiModel(value User對(duì)象, description 系統(tǒng)用戶表) public class User implements Serializable { private static final long serialVersionUID 1L; ApiModelProperty(主鍵ID) TableId(value id, type IdType.AUTO) private Long id; ApiModelProperty(用戶名) TableField(username) private String username; ApiModelProperty(密碼) TableField(password) private String password; ApiModelProperty(狀態(tài)1啟用 0禁用) TableField(status) private Integer status; ApiModelProperty(邏輯刪除標(biāo)記0未刪除 1已刪除) TableField(deleted) TableLogic private Integer deleted; ApiModelProperty(樂(lè)觀鎖版本號(hào)) TableField(version) Version private Integer version; ApiModelProperty(創(chuàng)建時(shí)間) TableField(value create_time, fill FieldFill.INSERT) private LocalDateTime createTime; ApiModelProperty(更新時(shí)間) TableField(value update_time, fill FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; }這里有幾個(gè)點(diǎn)需要你留意。一是createTime和updateTime自動(dòng)加了fill FieldFill.INSERT和fill FieldFill.INSERT_UPDATE這是 MyBatis-Plus 的自動(dòng)填充注解。如果要生效你還得自己在項(xiàng)目里配置一個(gè)MetaObjectHandler實(shí)現(xiàn)類在插入和更新時(shí)統(tǒng)一填寫這兩個(gè)字段。不配置的話注解加了也白加數(shù)據(jù)庫(kù)里的時(shí)間字段如果本身有默認(rèn)值CURRENT_TIMESTAMP倒也能跑但如果你想讓代碼統(tǒng)一維護(hù)時(shí)間就得補(bǔ)上這個(gè) Handler。二是UserMapper接口里只繼承了BaseMapperUser但 XML 文件里已經(jīng)生成了ResultMap和基礎(chǔ)的selectByExample類似的結(jié)構(gòu)。這里提示你如果沒(méi)有特殊 SQLMapper 接口和 XML 其實(shí)可以精簡(jiǎn)但因?yàn)?XML 里保存了最完整的字段列信息后續(xù)寫聯(lián)表查詢時(shí)可以直接復(fù)制字段清單所以建議保留。三是UserController生成的是一套最原始的 CRUD 接口比如RestController RequestMapping(/system/user) Api(tags 系統(tǒng)用戶表) public class UserController { Autowired private UserService userService; PostMapping public Result save(RequestBody User user) { ... } DeleteMapping(/{id}) public Result delete(PathVariable Long id) { ... } GetMapping(/{id}) public Result getUser(PathVariable Long id) { ... } GetMapping public Result list(RequestParam(defaultValue 1) Integer current, RequestParam(defaultValue 10) Integer size, User user) { ... } }這段代碼能跑但離能上線還差得遠(yuǎn)事務(wù)、數(shù)據(jù)權(quán)限、參數(shù)校驗(yàn)、日志、實(shí)際的分頁(yè)查詢條件都要自己補(bǔ)。我的定位是Controller 生成出來(lái)當(dāng)接口骨架參考或給內(nèi)部管理后臺(tái)用真正對(duì)外的業(yè)務(wù)接口還是要手工精寫。而實(shí)體類、Mapper、Service 這三層生成完成度很高基本可以原樣使用。5. 改模板比改代碼更劃算自定義生成模板的實(shí)戰(zhàn)5.1 把官方模板摳出來(lái)改成自己的代碼生成器默認(rèn)的模板功能很全但不可能滿足所有團(tuán)隊(duì)的定制需求。比如有的團(tuán)隊(duì)要求實(shí)體類必須繼承一個(gè)BaseEntity有的要求在 Controller 的每個(gè)方法上加PreAuthorize權(quán)限注解有的要求在 Mapper 接口里追加自定義查詢方法。這些需求如果生成完再手動(dòng)改每張表都要改一遍太痛苦。正確做法是改模板讓生成的結(jié)果從一開(kāi)始就符合團(tuán)隊(duì)規(guī)范。模板文件在哪如果你用的是 Freemarker模板文件就在mybatis-plus-generator的 jar 包里的/templates目錄下。文件命名大概是這樣entity.java.ftl、mapper.java.ftl、service.java.ftl、serviceImpl.java.ftl、controller.java.ftl、mapper.xml.ftl。你可以從本地的 Maven 倉(cāng)庫(kù)把依賴 jar 解壓出來(lái)把需要的模板文件復(fù)制到項(xiàng)目src/main/resources/templates目錄下再按需修改。然后在生成器配置里加一段讓代碼生成器使用你的自定義模板.templateConfig(builder - { builder.entity(/templates/entity.java.ftl) .controller(/templates/controller.java.ftl) .mapper(/templates/mapper.java.ftl) .service(/templates/service.java.ftl) .serviceImpl(/templates/serviceImpl.java.ftl) .xml(/templates/mapper.xml.ftl); })5.2 在實(shí)體模板里埋入 Swagger 與專屬注解舉個(gè)我自己改過(guò)的例子。項(xiàng)目里實(shí)體類要統(tǒng)一加一個(gè)ApiModel注解并且要在類注釋里記錄對(duì)應(yīng)的表名和表注釋。我改entity.java.ftl模板在類定義位置加入#if swagger ApiModel(value ${entity}對(duì)象, description ${table.comment!}) /#if TableName(${table.name}) Data public class ${entity} implements Serializable { private static final long serialVersionUID 1L; #list table.fields as field #if field.comment!?length gt 0 /** * ${field.comment} */ /#if #if swagger ApiModelProperty(value ${field.comment}) /#if TableField(${field.name}) private ${field.propertyType} ${field.propertyName}; /#list }模板里用到的${entity}、${table.name}、${field.propertyName}這些變量是生成器內(nèi)部渲染模板時(shí)上下文中提供的。如果你不熟悉模板語(yǔ)法先大致理解成占位符 條件判斷即可改的時(shí)候主要關(guān)注 HTML 標(biāo)簽之外的那幾行 Java 結(jié)構(gòu)是否滿足需求。這里最關(guān)鍵的是模板文件的存放路徑和配置里的builder.entity(...)路徑必須一致否則會(huì)靜默使用默認(rèn)模板你改了半天的東西根本不生效。另一個(gè)常見(jiàn)的模板改造是把TableId的主鍵策略改成指定類型。默認(rèn)生成器會(huì)根據(jù)數(shù)據(jù)庫(kù)主鍵判斷IdType.AUTO但如果你用的是分布式 ID比如雪花算法可以在模板里強(qiáng)制寫出TableId(value id, type IdType.ASSIGN_ID)。這樣生成出來(lái)的實(shí)體類新增數(shù)據(jù)時(shí)即使不手動(dòng)設(shè)置idMyBatis-Plus 也會(huì)幫你生成一個(gè)雪花 ID很省心。5.3 裁剪輸出不需要的東西不生成模板改造解決的是生成的不夠好的問(wèn)題還有一類需求是生成得太多了。比如很多內(nèi)部接口根本不需要 XML 文件或者單表操作完全不需要 Service 層哪些代碼不生成可以直接在strategyConfig里關(guān)掉.strategyConfig(builder - { builder.serviceBuilder().formatServiceFileName(%sService) .controllerBuilder().enableRestStyle() .mapperBuilder().enableBaseResultMap(); })更徹底一點(diǎn)可以通過(guò)templateConfig把某個(gè)模板置空.templateConfig(builder - { builder.xml(null); })這樣生成之后 XML 文件就不會(huì)出現(xiàn)。我遇到的情況是項(xiàng)目里允許 MyBatis-Plus 的BaseMapper直接提供單表 CRUD確實(shí)沒(méi)有必要為每張表都放一個(gè) XML 文件。只有那些包含復(fù)雜 SQL 的表才需要單獨(dú)生成 XML 并手工加工。所以我在團(tuán)隊(duì)里的默認(rèn)做法是先不關(guān) XML等確認(rèn)表里不需要復(fù)雜 SQL 了再刪掉 XML避免后期排查問(wèn)題少一個(gè)環(huán)節(jié)。你可以根據(jù)自己項(xiàng)目的口味來(lái)習(xí)慣極簡(jiǎn)就關(guān)掉習(xí)慣保守就留著。6. 生成之后的必修課掃描、XML、邏輯刪除與分頁(yè)6.1 Mapper掃描與XML路徑最常見(jiàn)的兩個(gè)啟動(dòng)報(bào)錯(cuò)代碼生成完不代表項(xiàng)目能直接起來(lái)我見(jiàn)過(guò)太多人激動(dòng)地跑main生成完代碼一啟動(dòng) Spring Boot 就報(bào)錯(cuò)然后一臉懵。最典型的兩個(gè)錯(cuò)誤都跟 Mapper 相關(guān)。第一個(gè)是 Mapper 接口沒(méi)被掃描到。生成出來(lái)的UserMapper只是普通接口它要實(shí)現(xiàn) MyBatis 的動(dòng)態(tài)代理必須被 Spring 容器掃描到。兩種常見(jiàn)處理方式在啟動(dòng)類上加MapperScan(com.example.demo.**.mapper)或者在每個(gè) Mapper 接口上標(biāo)Mapper。我個(gè)人推薦MapperScan因?yàn)橐粡埍硪粋€(gè)注解太啰嗦還容易漏。如果你生成的包名里有moduleName記得把掃描路徑寫對(duì)比如com.example.demo.system.mapper。第二個(gè)是 XML 文件位置不對(duì)或沒(méi)被加載。Spring Boot 項(xiàng)目里MyBatis-Plus 默認(rèn)會(huì)去classpath*:/mapper/**/*.xml找 XML 文件。如果你用上面的路徑配置生成在src/main/resources/mapper下那默認(rèn)就能被掃描到。如果你的 XML 放在別處或者明明放在resources目錄卻沒(méi)生效多半是應(yīng)用配置里缺少這一段mybatis-plus: mapper-locations: classpath*:mapper/**/*.xml type-aliases-package: com.example.demo.system.entitytype-aliases-package配置好之后XML 里的resultType、parameterType可以用短類名不用寫全限定名是個(gè)好習(xí)慣。6.2 邏輯刪除、樂(lè)觀鎖、分頁(yè)插件不配好等于半殘生成器把TableLogic和Version寫在實(shí)體類上了但如果你沒(méi)在 MyBatis-Plus 配置里注冊(cè)對(duì)應(yīng)的攔截器這兩個(gè)注解的作用其實(shí)是部分生效。邏輯刪除比較特殊TableLogic只要在字段上標(biāo)了MyBatis-Plus 的通用刪除方法就會(huì)自動(dòng)改成邏輯刪除不需要額外插件。但有個(gè)細(xì)節(jié)邏輯刪除的全局配置和字段默認(rèn)值的對(duì)齊。你在實(shí)體類上標(biāo)了TableLogic如果刪除時(shí)沒(méi)有在 SQL 里設(shè)置刪除值默認(rèn)是 1未刪除是 0數(shù)據(jù)庫(kù)里也得跟模板保持一致的約定。更穩(wěn)妥的方式是在application.yml里顯式聲明mybatis-plus: global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0這樣即使實(shí)體類忘了標(biāo)TableLogic只要字段名匹配MyBatis-Plus 也會(huì)自動(dòng)識(shí)別。樂(lè)觀鎖就需要顯式注冊(cè)插件了。在配置類里加一個(gè)MybatisPlusInterceptorBeanBean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; }這里我把OptimisticLockerInnerInterceptor和PaginationInnerInterceptor放在一起注冊(cè)了。分頁(yè)插件基本是 MyBatis-Plus 項(xiàng)目的標(biāo)配生成器生成的page方法如果不配分頁(yè)插件selectPage返回的數(shù)據(jù)不會(huì)真的分頁(yè)而是查出全量數(shù)據(jù)再包裝這在數(shù)據(jù)量大時(shí)是性能隱患。所以建議一次性把這兩個(gè)攔截器都注冊(cè)上。7. 把生成器變成團(tuán)隊(duì)基建批量執(zhí)行與日常維護(hù)心得7.1 全表生成還是精確生成我的取舍原則用代碼生成器時(shí)間久了你會(huì)發(fā)現(xiàn)它不僅能提高單次開(kāi)發(fā)效率還能沉淀成團(tuán)隊(duì)的基礎(chǔ)設(shè)施。但怎么用好它還是有一些原則要守住。我的取舍原則是Controller 少生成或不生成Service 和 Mapper 能生成就生成。Controller 這層代碼往往跟具體業(yè)務(wù)接口設(shè)計(jì)強(qiáng)相關(guān)用戶權(quán)限、接口命名、返回結(jié)構(gòu)、參數(shù)校驗(yàn)全是定制化的生成器給的東西只能算雛形。如果團(tuán)隊(duì)風(fēng)格是把業(yè)務(wù)寫在 Controller 里那生成器生成的 CRUD 也許勉強(qiáng)夠用但如果你們有嚴(yán)格的分層規(guī)范Controller 應(yīng)該手工控制。我在日常開(kāi)發(fā)中生成器默認(rèn)只輸出entity、mapper、service、serviceImplController 開(kāi)著是為了看接口結(jié)構(gòu)參考但往往生成完我會(huì)直接刪除。Service 這層是值得生成的。因?yàn)?MyBatis-Plus 的IService已經(jīng)提供了大量現(xiàn)成方法Service接口和實(shí)現(xiàn)類生成后幾乎零成本可用后續(xù)加業(yè)務(wù)邏輯就在對(duì)應(yīng)方法里擴(kuò)展不會(huì)影響整體結(jié)構(gòu)。7.2 表結(jié)構(gòu)變更后如何優(yōu)雅地重新生成數(shù)據(jù)庫(kù)表結(jié)構(gòu)不是一成不變的加了字段、改了注釋、換了索引都是家常便飯。這時(shí)候重新跑一遍生成器會(huì)遇到一個(gè)問(wèn)題覆蓋還是保留我的建議是實(shí)體類、Mapper 接口、XML 這三類文件可以直接覆蓋。因?yàn)樗鼈兊暮诵膬?nèi)容來(lái)自數(shù)據(jù)庫(kù)表結(jié)構(gòu)不包含業(yè)務(wù)邏輯重新生成后只要沒(méi)有手工動(dòng)過(guò)結(jié)果一定是對(duì)的。但 Service 接口和實(shí)現(xiàn)類、Controller 就不建議直接覆蓋了因?yàn)檫@里大概率已經(jīng)寫過(guò)業(yè)務(wù)方法覆蓋一次丟一大堆代碼心態(tài)直接就崩了。實(shí)際操作上我通常只讓生成器重新生成實(shí)體類和 Mapper 接口跑之前用addInclude指定變更過(guò)的表跑完之后再手動(dòng)把新增字段補(bǔ)到業(yè)務(wù)代碼里。這樣可以最大程度避免生成器覆蓋手寫代碼的慘案。如果你真的希望生成器完整重新生成一套那就把項(xiàng)目里對(duì)應(yīng)的手寫類先備份生成完再對(duì)比合并。這不是最優(yōu)雅的方式但勝在可控。7.3 我遇到過(guò)的幾個(gè)冷門坑最后分享幾個(gè)我踩過(guò)的、不太容易在文檔里看到的坑。第一個(gè)是表名大小寫問(wèn)題。MySQL 在 Windows 下表名大小寫不敏感但在 Linux 下敏感addInclude里寫的表名必須跟數(shù)據(jù)庫(kù)里的大小寫完全一致。比如庫(kù)里的表叫Sys_User你在addInclude里寫sys_userWindows 上能生成Linux 上就會(huì)提示找不到表。第二個(gè)是生成器連接數(shù)據(jù)庫(kù)超時(shí)。如果數(shù)據(jù)庫(kù)地址是內(nèi)網(wǎng) IP且serverTimezone沒(méi)配或者配錯(cuò)連接耗時(shí)可能長(zhǎng)達(dá)幾十秒。我遇到過(guò)一次生成器卡住不動(dòng)排了半天才發(fā)現(xiàn)是時(shí)區(qū)問(wèn)題驅(qū)動(dòng)一直在嘗試解析本地時(shí)區(qū)。把serverTimezoneAsia/Shanghai加上之后立刻恢復(fù)正常。第三個(gè)是關(guān)于模板文件后綴。如果你用 Freemarker模板文件后綴必須是.ftl如果用 Velocity后綴是.vm。配置templateConfig時(shí)路徑對(duì)應(yīng)關(guān)系要對(duì)得上否則運(yùn)行時(shí)會(huì)直接拋模板引擎不匹配的異常。這個(gè)錯(cuò)雖然好定位但第一次遇到時(shí)確實(shí)會(huì)愣一下。第四個(gè)是關(guān)于enableSwagger()的連鎖反應(yīng)。這個(gè)選項(xiàng)一旦開(kāi)啟生成器不但會(huì)在實(shí)體類上加 Swagger 注解還會(huì)在 Controller 的方法上加ApiOperation、在類上加Api。如果項(xiàng)目里沒(méi)有 Swagger 依賴編譯直接失敗。所以我在生成器跑之前都會(huì)先確認(rèn)項(xiàng)目的pom.xml里有沒(méi)有springfox或springdoc相關(guān)依賴沒(méi)有就先不開(kāi)生成了再手動(dòng)補(bǔ)注解反而更快。用了幾年代碼生成器我最深的體會(huì)是工具解決的是重復(fù)勞動(dòng)不解決設(shè)計(jì)問(wèn)題。表結(jié)構(gòu)設(shè)計(jì)得亂七八糟生成器只能幫你把亂象原樣搬到 Java 世界表設(shè)計(jì)得規(guī)范清晰生成器產(chǎn)出的代碼也賞心悅目。所以每次跑生成器之前我都會(huì)先花十分鐘看一遍表的注釋、字段命名、類型選擇確認(rèn)沒(méi)問(wèn)題再動(dòng)手。與其說(shuō)生成器提高了我的寫碼速度不如說(shuō)它逼著我先想清楚數(shù)據(jù)庫(kù)設(shè)計(jì)——這大概是它在工程之外給我?guī)?lái)的最大價(jià)值。如果你正打算把代碼生成器引入項(xiàng)目建議從一個(gè)邊界清晰的業(yè)務(wù)模塊開(kāi)始小范圍試點(diǎn)跑通一條最小路徑后再鋪開(kāi)會(huì)比一次性全量生成順手很多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
九九五月天| h无码动漫在线观看| 超碰97色色| 亚洲一区二区精品福利| AAAA欧美日韩| 中国少妇啪啪视频| 嫩草伊人久久精品| 狠狠操狠狠插| 亚州AV无码国产精品| 欧美激情专区| 张柏芝国产一区在线观看| 热的中文 热的有码 热的国产| 亚洲一区二区性爱电影| 久久性爱精品一区| 强奸乱伦免费网站| 超碰九7| 97干综合网| 91原创在线观看| 黄色小视频日本txt| 日韩三级在线观看网站| 欧美少妇人妻| 东京热大香蕉| 99热精品在线观看| 新91视频.cmp| 亚洲涩图欧美| 国产精品丝袜久久亚洲不卡| 亚洲天堂第一页| 99操| 天天综合网站| 婷婷综合网站| 欧美三级不卡| 亚洲无套久久嗯嗯| 亚洲高潮少妇| 熟女丰满人妻一区| 一本一道人妻久久一区二区三区 | 久久av无码| 亚洲色电影在线| 中文字幕无码不卡啪啪| 亚欧美综合| 91老熟女91老女人| 国产熟女无套内射| 日本男人天堂| 日韩精品一区二区高清| 日韩操p| 八戒午夜福利理论片| 襙一襙| 亚洲人妻在线精品| 少妇人妻太紧太深av| 91香蕉视频在线观看免费| 人人妻人人爽 97人人看碰人免费公开视频 | 91 综合网| 夜夜嗨老熟女AV一区二区三区| 久久是精品| 91亚洲欧美综合高清在线| 狠狠躁日日躁夜夜躁A| 中文字幕制服诱惑| 综合色色婷婷| 东京热激情视频一二三区| 大香蕉手机视频| 丁香激情五月| 熟妇女人妻呻吟久久AV| 国产丰满少妇久久久精品影院| 精久久久91| 麻豆精品A片免费观看| 丁香婷婷激情五月天无毒不卡 | 亚洲精品一区二区三区在线播放| 丁香六月啪| 欧美精品99久久久| 97超碰在线资源网站| 91n免费处女| 99精品无码| 欧美写真视频一区| 内射夫妻三片| 三上制服丝AV| 亚洲男人的天堂网| 大茄子熟女AV导航| 日韩欧美福利视频看看| 强奸乱亚洲| 日本一本一区二区三区四区五区欧美日韩中文字幕| 亚洲自拍一区夜夜操| 黄久在线| 午夜.DJ高清在线观看免费7| 九九AV| 69AV女优男人的天堂| a片亚洲一本通视频| 亚洲色电影在线| se吧提供国产乱老熟视频胖女人| 亚洲精品乱码久久久久久蜜桃麻豆| 精精夜夜| 性91| 国产这里只有精品| 午夜综合在线| www.av家庭乱伦| 一个人免费HD91视频| 91xingse| 中文区中文字幕免费看| 久久性视频| 啊啊啊好舒服好爽啊啊啊视频| 啊啊啊啊啊好舒服视频| 永久免费av无码网站国产app| 日人妻视频91| 精品美女少妇一区二区三区| 亚洲美女av无码| 蜜乳AV网址| 欧色综合| 人妻精品免费一二三区| 五月婷婷六月激情| 欧美综合狠| 波多野结衣被操50分钟免费视频 | 人人爱夜夜爱| 91久久| 久久色情| 变态综合色| 丁香五月性爱| 91丝袜人妻| 岛国AB视频| 夜夜嗨绯色| AV乱伦国产| 免费久久精品麻豆一区二区av| 久久久∴| 亚洲天天做日日做天天谢日日 | 亚洲欧美碰碰| 国产精品老熟女一区二区| 青青青草原| AA特级绝黄| 破处bbq| 黑人嘿嘿嘿超爽免费视频| 成人五月天色网| 欧美人人操人人插| 少妇500双飞99| 91成人18| 欧亚日韩综合精品国产| 免费看久久久性性| 99re视频这里只有精品| 狠狠中文字幕| 视频不卡中文字幕| 精品国产一区二区三区久久久蜜臀 | 欧美性爱伊人| 亚洲骚男同com| 欧美性生活综合| 天天搞欧美| 青娱乐日韩无码| 91高清日| 好吊色在线观看| 搡老女人老熟女91| 天天插夜夜爽| 日韩亚洲美州欧洲综三区一品在线| 天堂综合网| 大香蕉AV丝袜| 精品人妻av在线播放| 久噜噜| 国产一区二区视频在线播放| 久热热| 国产婷婷一区| www.婷婷五月天| 亚洲欧美天堂| 97超碰中文字幕| 床上啊啊啊一区二区三区| 欧美第一页| 亚洲情色一区二区三区| 校园春色综合| 全免费a敌肛交毛片免费| 91丝袜人妻| 五月天丁香欧洲日韩| 国产日逼视频| 97操b| 欧美 日韩 另类 亚洲| 欧美成人AⅤ大片在线观看| 日韩欧美三级| 嗯嗯嗯啊啊在线观看| 九九热精品免费视频| 天天色天天干天天爱| 久久久久深夜无码| 性欧美天天| 日本道久久综合色色| 毛片一区二区| 有码专区最新中文字幕有码| 操学生天天| 五月婷婷六月丁香| 操逼天美3区| 欧美性性性| www.男人天堂| 丝袜内射| 美女诱惑1区2区| 亚洲人妻中文高清| 免费观看国产小粉嫩喷水精品午| 网友自拍第1页 | 午夜福利一区二区影院| 亚洲 暴爽 AV人人爽日日碰| 亚洲第一页色网| 亚洲吊色| juliaann丝袜大战黑鬼| 有码免费观看| 国产青一二三| 好吊妞转入那个网| 婷婷丁香五月激情啪啪| av在线一区二区三区| 国产传媒日韩| 高清无码人妻久久久一区二区三区aⅴ| 中文幕97| 中文字幕视频免费| 美女黄码视频午夜| 久久久精品一区二区| 欧美精品第四五页中文字幕在线观看| 黄页大片在线观看| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 婷婷伊人綜合中文字幕小说| 国产精品无码在线| 国产白嫩漂亮KTV在线| 青青操网| 欧美黄色手机在线观看| 欧美成熟性爱精品| 少妇一区二区三区高速| 中国AV美女| 日本韩国国产精品一区| 思思久热在线精品66| 人妻三级在线中文字幕| 久久人妻| 国内偷自视频区视频综合| 天天躁日日躁成人字幕aⅴ| 日韩熟女三十乱伦| 在线A日本| caoni国产亚洲av| 曰韩av中文字幕专区| 日本日皮视频逼| 偷看洗澡一二三区美女| 色性综合| 磁力99AV| 超碰 国产熟女精品一区| 亚洲午夜蜜臀| 婷婷久月| 国内毛片国产专区二| 日本免费亚洲欧美| 色盈盈影院| 黄网站黄视频网站进入口| 秋霞午夜视频一区二区| 超碰97首页| 精品人妻一区二区免费看| 亚州综合色| 精品视频一区二区| 久久成人国产| 天堂日本亚洲欧美| 97久久精品不卡| 夜夜黄| 无码人妻一区二区三区免费九色| 久久日韩精品一区二区| 五月丁香婷婷色| 亚洲日本韩国极品一区二区| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 乱伦熟妇一区二区| 欧美视频在线视频免费va| 婷婷久久综合| 欧美伦乱| 亚洲国产成人7777| 99操逼| 丁香五月天婷婷姐| 99蜜月精品久久| 日韩熟女精一区二区三区不卡| 老熟妇乱轮| 日本熟女免费視颖| 麻豆天美国美国产AV| 九九九九九用不成了| 麻豆av一区二区| 超碰在线观看av不卡| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 神马久久午夜| 黄色欧美性爱视频| 99只有精品| 好吊色综合| 天天看天天综合成人网| 亚洲蜜臀精品视频久久| 国产日韩精品人妻久久久久色欲网站| 欧日韩不卡视.频| 伊人网在线视频| 欧美色欧美| 色综合网1| 欧美白嫩在线放| 九月伊人中文字幕| 性爱久久| 抽插亚洲无码| 国产日本久久免费精品| 青青操视频在线| 嫩草美女久久| 日本亚洲vr欧美不卡高清专区| 白嫩妹子国产骚| 午夜福利无毒不卡| 日日骚 av| 欧美 亚洲| 一区二区三区精品久久| 国产视频小说| 亚洲性爱免费电影| 日韩精品9999| 国产一区二区三区视频在线看| 97国产超湿| 欧美 亚洲精品首页| 一区三区啪啪| 日本一卡二区在线| www.婷婷六月天| 欧美,日韩,中文,另类| 欧美日韩性爱无码| 婷婷国产精品一区二区| 人人透人人操| 欧美热图99| 无码黑人精品一区二区三区三| 美女大乳久久久久久久女人18| 一区二区中文| 久久九九一区二区三区成人| 国产日韩欧美操逼视频| 久久久久无码一妻区| 天天躁日日躁xxxxx| 亚洲情色图片区| 日韩国产不卡在线视频| 日本熟妇色熟妇在线视频播放| 国产日韩区| 很很很很操| 在线v中文字幕一区二区三区| 亚洲青青草| 操逼网站视频漫画国产| 97 色综合| 天美av在线观看| 啊啊嗯嗯好爽| 性色国产东北露脸精品视频| wwwcaobibi| 91N综合网| 欧美日韩成人在线| 男女无套 免费网站| 啊啊啊好湿国产一二| 激情五月天插| 97超碰精品图片| 97亚洲综合电影| 日本性爱欧美性爱| 人人看人人爰人人操| 中文字幕78| 久久肏大逼| 97鸡把在线视频| 亚洲另类色图片| JIZZJIZZ国产精品喷水| 蜜臀99久久精品久久久懂爱| 国产精品视频在线播放 | 狠狠色丁香| 欧差乱伦二三| 久久精品国产97欧美精品亚洲| 日韩pv中文| 26uuu偷拍亚洲欧洲综合| 欧美丝袜91| 好看的91视频| 亚洲综合五月天| 国产乱伦亚洲| 亚洲人妻久久| 精品久久久久成人码免| 一区中文字幕二区日韩| 日韩人妻无码专区| 再深点灬舒服灬太大了添视频| 丝袜美腿丝袜| 日本久久综合| 超碰在线人妻不卡| 99热| 久久9视频| 精品久久久久久AV无码| 91老女人| 97欧美日韩| 啊啊啊啊啊啊啊啊要喷了| 久久大香蕉手机高清| 亚洲成人美女无吗| 人人操人人插人www| 亚洲有码视频二区| 一区二区三区男人的天堂| 国产精品高潮久久AV| 夜夜嗨一区二区| 亚洲操逼无码| 成人免费不卡在线视频| 亚州免费啪啪视频| 中国一级操逼视频| 国产兽交视频在线播放| 色牛aV| 日躁天天爽爽| 天天亚洲| 啊啊啊爽爽| 变态另类专区| 99热线麻豆| 999九九九九国产动| 91色伦综合| 亚洲色图欧美色图制服丝袜| 日韩中字av一区| 午夜免费视频1000| 国产精品九9| 偷拍欧美综合| 丝袜性亚洲| 欧美色图亚州激情| 91美女视频在线| 色盈盈影院| 91老熟女逼| 九九热五区| 撸撸成人在线视频| 日日妻色网| 国产精品久久久久999| 色情婷婷久久五月天| 偷拍片久久| 夜夜爽夜夜摸夜夜操免费视频| 91国内外在线| 国产精品午夜福利| 东京热一区二区中文字幕| 91亚州| 国产精品人妻无码久久久老鸭窝| 都市久久精品激情亚洲| 精品区国产区一区二区三区| 婷婷五月天久久久| 青青11操操操操操操操操| 日本不卡三级网在线播放| 色爱综合网欧美| 激情小说亚洲视频| 性久久| 国产一级不卡在线观看| 天天干天天操天天干天天操| 九九在线精品| av天天在线| 亚洲色图欧美色图综合| 超碰97网站| 国产成人拍国产亚洲精品| 黄色av网站在线播放| 人人操人人大香蕉| 四虎 精品 WWW| 亚洲精品国产精品乱码不卡| 久久久免费高清中文视频| 葡萄牙性视频一二区| 亚洲一卡二卡在线免费| 综合欧美日本三级| 亚洲国成人情色好看电影| 一区二区不卡免费| 大二网站亚洲| 蜜桃臀av在线观看| 日韩一级二级三级免费看完整版国语版| 国产suv精品一区二六| 国产精品高潮久久久无码| www..com操老师| 亚洲天天自拍| 欧美精品久久| 久久久久久裸体| 十八禁av无码免费网站APP| 欧美大香蕉在线观看| 色哟哟av| 任你草| 日韩亚洲精品一区二区| 98色网| WWW啪啪的com| 干妹子| 日逼国产| 清纯唯美激情| 毛片17S| 日韩激情无码影院| 肉丝网站91| 久久69| 97这里有精品| 91黑丝在线播放| 曰韩精品视频一区二区| 操操啪| 97热视频在线观看| 先锋影音av先锋一区| 成人精品在线观看| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 久久精品国产亚洲AV高级北京| 精品久久久无码| 91人妻久久久久久久久久久久久| 国产精品ⅴ无码大片在线看.| 精品一区二区三区蜜桃臀赵总 | 人妻色情天天操| 一级特黄aaa大片在线观看成人一级片在线观看| 婷婷五月天影院| 97网址97| 日逼视频日本| 美女干逼2| 日婷婷| 天天综合网久久ww| 日本一级特级毛片视频| 精品国产少妇高潮视频| 超碰97国产欧美| 亚洲欧美经典一区二区| 精品人妻一区二区三区蜜桃视频| 免费一级欧美片片线观看| 97欧美视频| 久久婷婷亚洲| 久久一级无码精品毛片6| 北京美女一区二区| 日韩A优精品在线观看| 久久综合av| 97免费视频在线| 中文欧丝袜诱惑| 深夜激情无码| 久久人妻一区二区三区高清| 国产精品探花视频| 亚洲久草AV色图| 欧美刺激色黄片免费看| 日日夜夜骑| 大香交伊人网| 中文字幕丰满人妻日本| 欧美色九九九| 亚洲成?V人片在线观看福利| 中文字幕青青草| 九九热精品在线| 三级日韩一区二区三区| 麻豆国产成人精品| 色色五月丁香| 亚洲欧美国产中文视频| 亚州欧美一区| 九九色热| 亚洲人妻中文在线视频| 国产人人干| 淮穴色AV| 一区二区三区黄色片a| 大香蕉在线SuP| 超碰国产在线| 婷婷av在线中文字幕| 青青伊人加勒比海| 免费一级视频特黄色大片| 超碰4A| 黄色工厂这里只有精品| 久草视频分类在线| 免费超碰97久久| 国产精品一区二区三区,亚洲综合 性开放中文AV高清无码免费看 | 中文字幕日韩综合| 性爱视频无打码在线观看| 五月天人妻综合| 色综合中文字幕不卡| 吻戏激情性巴克| 久96热在线观看视频| 亚洲无限观看| 丝袜夫妻自拍| 一区在线观看中文字幕| 97在线精品观看视频| 欧美色91| 九一综合网| 久久精品店| 中国农村熟妇毛片视频| 熟女人妻一区二区三区| 一区二区精品日韩欧美在线观看 | 60秒不遮不挡| 日韩欧美天天爽爽爽天天爽爽| 欧美色图天堂在线| 在线观看精品国产免费| 国产成人亚洲精品无码最新在线| 欧美极品美女aaaaaa级黄片| 老女人老91妇女老热女| 大香交| 99热这里都是精品| 品亲网欧美品亲网| 999热这里只有精品| 欧洲综合视频| 婷婷五月天色| 国产天天骚| 曰韩香蕉97| 日本一级婬片试看三分钟| 色老汉色| 两性色网| 91精品国产日韩欧美综合| www国产无码| 九九九久久久W精品| 日产成人久久| 天天操天天日青青草超碰av| 伊人久久蜜月| 久久久久9| 久久色一区二区| 色诱avtt| 日本新免费二区三区| 四季AV一区二区凹凸精品小说| 伊人久久亚洲中文字幕| 蜜臀在线免费观看在线免费观看| 亚洲色鬼| 亚洲少妇诱惑| 91新在线欧美| 性色av一区二区| 欧美韩国你懂得在线| 久久亚洲人妻| 国产精品久久久久久夜夜夜夜| 亚洲黄a三级三级三级看三级| 婷婷香网站| 精品国产久久乱码| 999色欧美中文字幕| 东北老熟女| 久久久久久9| 国产无码久久高清| 亚洲图片婷婷五月天| 日日日日做夜夜夜夜无码| 韩国成人精品久久久免费看| 欧美在线观看综合国产| 嗯嗯嗯好爽| 97大色网| 天天热精品| 日韩九九九| 97超碰人人操人人操| 亚洲精品成人动漫在线| 精品久久人妻成人网| 97久久精品亚洲| 亚洲视频,小说| 四虎免费视频| 天天综合亚洲综合| 国产高清26uuu| 9久超碰| 老鸭窝日丰县女人| 91精品91久久久中77777| 一区二区三| 中文字幕乱码人妻二区三区| 国产精品自拍欧美在线| 骚货人妻偷情自拍在线视频| 91九九九小逼| 天天天干977| 无码免费在线观看黄色片| 国产色精品午夜大片| 97久久精品亚洲| 日韩综合97P| 亚洲欧洲自拍| 日韩 欧美 另类 人妻| 色欧美天天| 精品久久大胆人体| 东北女人无套内谢视频| 最近2019中文字幕国语免费版| 野狼激情网| 天天日熟妇| 20cm女自慰在线日韩欧美| 亚洲不卡AV在线| 国产精品免费视频人成| 91 综合 色| 伊人丁香五月婷婷| 五月天大香蕉| 青操影院| 午夜福利激情在线视频| av天天在线观看| 美女上床网站| 污污汅18禁网站在线永久免费观看 | 久久久久久久久久久久黄色 | 玖玖爱影院| 日韩AV无码中文一区二区| 青青草视频久久久久| 精品无吗m| 色婷婷五月综合激情中文字幕| 91性高| 国产无码精品久久久久久| 国产精品电影| 97在线观看免费| 26uuu性| 亚洲人妻熟妇三十三区| 97超碰碰| 夜夜夜久久| 97欧美综合网| 激情五月综合| 成人草草视频| 久久草在线综合视频| 任我爽在线视频免费观看| A级毛片在线看免费| 欧美熟妇人体| 性爱网站一区二区| 国产久久一区二区三区野外在线| 亚洲欧美综合| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 日本福利二区视频| 蜜桃香蕉久草精品在线| 一区三区啪啪| 国产人妻久久精品一区二区三区| 婷婷视频网| 最新制服中文第一页| 超碰免费在线| 久久久96| 老师充足的奶水小说| 99re免费视频精品全部| 亚洲AV无码久久精品蜜桃小说| 日本黄色大片一级视频免费麻豆| 国产欧美黑人丰满在线| 8050午夜少妇无码| 午夜福利av电影在线| 97色色国产视频| 神马久久久久久伦理片| 国产中午字一暮区| 大香蕉久久| 在线观看中文字幕| 狠狠图片青青草| 日逼国产| 日韩无限资源| 中 文字幕一区二区三四 五 区日 日 骚| 亚洲一卡二卡在线免费| 91精品免费| 日本福利社| 精品日韩人妻视频| 蜜臀无码一区二区| 9 9精品一区二区三区| 99婷婷一区二区| 九九九九一级| 天美传媒国产原创中文字幕亚洲欧美另类| 国产亚洲99久久精品熟| 亚洲国产中文字幕| 精品久久久久,69国产成人精| 超碰97人人cao| 九99久久| 动漫片子网站3黄| 逼逼逼逼操操操操操操操操操午夜剧场| 尤物视频新赏网鲜网色诱网| 久操黄色视频| 日本人人操人人操| 亚洲无码精品AV久久久| 中出在线视频| 亚洲激情 欧美色图| 日本高清一区二区在线| 国产精品com| 大屁股熟女一区二区三区| 97超碰jingpin| 久久91精品国产9丨久久分亭| 天天操天天舔| 91美女国产在线| 歐美一級亂黃99在綫精品| av天堂5| 亚洲欧洲无码bt精品合集| 婷婷五月天色网| 91性生活久久久| 色色热| 激情无码日韩| 色姑娘综合网| 欧美色图另类图片| 噜噜噜亚洲精品| 超碰色中文| 99激情视频| 日韩欧美字幕亚洲一区二区| 国产中文字幕在线点播| 国语少妇精| 午夜福利一区二区三区四区五区色婷婷| 国产精品久久9| 久久曰曰| 乱伦av.com| 性爱视频啪啪啪啪| 91精品无码久久久久久久| 天天天肏屄肏屄肏屄欧美欧美| 熟女高潮合集-永久久久-成人AV | 91视频综合网| 亚洲精品国产拍免费91在线| 大干人妻| 精彩久久中文| 色www精品视频在线观看| 久久综合乱子伦国产免费| 亚洲国产精品久久久久久久久久| 国产一区二区三区影片| 无码WWW免费视频网站| 国产欧美成人第一页在线观看| 国产精品日本无码A片| 日本在线观看网址| 久久伊人最新网址视频| 国产免费黄色一级大片| 26uuu最新| 久久国产AⅤ| 丁香五六月啪啪| 18禁看网站一区| 亚洲av成人精品一区| 中文字幕av亚洲精品| 黄骗免费网站| 高清孕妇孕交| 欧美人人操人人插| 中文字幕乱码人妻二区三区| 人人艹亚洲| 国产aⅴ无码片毛片一级网站| 你想操日本小逼吗| 日韩性爱网址| 五月天激情网站| 95精品在线| 色眯眯射| 九九九九一级| 视频二区美腿制服人妻欧美| 精品欧美乱码久| 操逼操2| 嫩草在线视频| 中国一区二区亚洲人妻| 日韩啪啪网| 亚洲AV无码| 国产理论视频在线播放| 久草尤物| 精品二区三四区五电影 | 久久老熟女| 久久久久久九九九| 亚洲春色欧美激情自拍| 久久久久久久亚洲Av无码| www网站黄| 精品夜夜澡人妻无码| 看黑丝美女操逼青青网站| 成熟熟女国产精品一区二区 | 欧美v亚洲v日韩v最新在线二区| 丁香五月天堂| 久久久久久大| 久久久精品中文字幕麻豆| 97色操| а√天堂资源官网在线资源| 秋霞无码av鲁丝片一区| 这里只有精品久久| 久久精9| 九久久九九久视频| 日本操逼aaaaa| www.超碰在线| 区一二区日韩亚洲乱码av电影| 中文字幕精品三级久久久| 亚州男人天堂| 操逼视频免费日韩无码| xxx亚洲午夜天堂| 久久久精品一区二区| 亚洲在饯| 国产精品无码在线| 欧美色图亚洲特色| av天堂精品久久| 四虎影院成年人片| 超碰人妻久久人妻中文97| 就去色综合| 18禁免费视频| 一二三啪啪专区| 97精品全部| 欧美国产精品| 91在线综合网| 亚洲第一页色网| 国产精品久久久久中文字幕| 4141514逼喷水三级片| 国产蜜臀精品一区二区尤物| 日日插夜夜| 欧美日韩淫加| 九九九网站| 中文字幕jul-617人妻熟女| 国产乱人妻精品入口| 大JI巴好深好爽又大又粗视频| 精品性爱无码在线播放| 欧美天堂亚洲电影院一区在线播放| 懂色Av| 人妻天堂综合网| 91无码人妻精品一区二区三区蜜桃| 色y情视频免费看| 中文字幕国产精品1区| 久久久一区二区三区麻豆| 久久久久久久亚洲Av无码| 日韩精品第3页| 色哟哟AⅤ| 欧美少妇一区二区三区| 天天肏天天干| 精品国产乱码久久久久久久久1| 综合亚洲网| 亚洲精品成人激情在线| 另类老少妇| 亚洲一本大道中文字幕无码在线| 嗯~啊~快点 死我视频免费看网站| 少妇一区二区三区精选| 天天综合欧美综合| 午夜男女爽爽爽影院视频| 精品免费一区二区三区在线亚洲人成| 久久久9999| 啊好大好舒服| 亚洲中文字幕在线视频一区二区| 韩国久久97| 色汉综合| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 免费综合亚洲中文| 久久精品国产97欧美精品亚洲 | 久久久久久9| 九九热九九热| 偷拍精品一区二区三区| 自拍丝袜美腿人妻| 欧美日韩大香蕉| 亚洲吊色| 亚洲高清无码AAA久久久精品| 91日日夜夜| 色婷久久| 亚洲国产综合图区中文字幕| av在线人气| 高清国产性猛交xxxx乱大交| 日本黄页视频在线观看| 国产 丝袜 欧美中文 另类| 91白虎| 厕所偷拍在线| 中文字幕一区二区三区高清| 亚洲加勒比色图| 深爱激情五月天| 国产在线观看一区二区三区| 91丝袜激情在线| 欧亚性爱视频免费看| 99国产女人| 国产a级精品| 久久亚洲AV成人精品无码| 日本不卡免费二区| 日本有码久久| 国产美女裸体秘 永久无遮挡| 97天天在线| 五月天丁香| 香伊人在线| 久久久9 9 9精品| 嗯嗯啊在线视频| 中文人妻av高清一区| 色网亚洲人| 精品国产网站| 777奇米影视777四色| 狠狠操狠狠操操| 超碰97亚洲区| 天天干2区3区| 国产小u女在线观看| 97爱| 久久精品99久久久久久| 天美传媒国产原创中文字幕亚洲欧美另类| 三级激情网站| 97Ai亚洲| 国产精品粉嫩福利在线| 人妻美腿丝袜制服诱惑综合天堂-| 伊人五月天激情| 久久久久久久强迫| 噜噜噜亚洲精| 成人精品一区二区三区| 人妻激情偷乱视频一区二区三区| 国产精品999zyz| 免费人成毛片乱码| 51国产午夜精品视频| 欧美操逼录像国产黄色国产| 躁躁日曰躁2020| 天天爱天天韩国日本牛牛牛牛| 人人贴人人摸| 亚洲精品一区二区日本| 超碰97人人乐| 日本男人插女人的逼黄色| 亚洲天堂东京热| 91狼人| 亚洲欧美自拍偷拍| 搡老熟女免费视频| 射综合网| 加勒比色99999| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 久久东京国产精品视频| 国产成人精品无码久久| 国产精品久久久久无码Av网曝门| 欧美激情高清性猛交| 蜜桃臀一区二区aV| 97超碰久久色| 夜夜人妻爽| 欲色影视综合吧| 欧洲天天在线| 操久久久久久| 丁香九月激情| a在线观看| 久久鲁干| 亚洲欧美国产其他二区| 在线观看色视频| 久久亚洲AV无码专区国产精品| 日韩精品在线观看观看| 免费家庭乱伦视频| 91色人妻| 国产成人 综合亚洲 天堂| 日本伦乱九九九综合| 黑人娇小av在线播放 | 99青草| 6080yy午夜理论三级一区二区三区无码| av凤凰久久久| 人妻-91porn| 亚洲欧美日韩综合在线尤物 | 亚洲色图加勒比| 国产精品午夜成人福利| 青青草五月天| 一本久久精品中文字| 亚洲图片 激情小说| 日日干夜夜欢| 91精品操美女| 青青青青青手机视频| 成人三级片一区二区三区视频| 91色插| 污色区网站| 欧美人人曰人人操人人射射| 国产精品美女久久久久AⅤ国产馆| 天天躁日日躁xxxxx| 人妻乱仑一区二区三区| 免费视频a级毛片免费视频| 久久天堂婷婷网| 天天干天天日天天射黄色大片| 一区中文字幕二区日韩| 亚洲在高跟鞋自慰久久在色线| yy少妇精品久久| 美女久久久久久久| 在线观看成人性爱免费小视频| 很很操在线| 欧美一级黄片视频在线| 日本三级一区二区 在线| 久久久无码av精| 亚洲色综合| 国产黄a三级三级三级av在线看| 2025亚洲男人天堂| 91久久国产综合精品| 久久久精| 综合夜夜| 双插性欧美一二三区| 国产激情综合五月久久| 99久久久无码| 无毛精品| 国产精品网址| 国产精品女生av| 亚洲综合婷婷| 男人的天堂2018.| 超碰碰小说97| 欧美性暴力| 日韩三A大片在线观看| 熟女色综合久久| 人妻激情另类| 久久成人午夜狠狠| 97Ai亚洲| 亚洲1区2区三区高清中文字幕| 综合色99| 丰满精品人妻少妇久久字幕| 操一对老熟妇爽上天视频| 69av一区二区三区| 精品少妇一区二区三区在线视频| 男人天堂站| 欧美精品欧美精品系列| 久久久久久99AV无码免费网站| 怡红院怡春院| 欧美真人抽搐一进一出gif| 精品亚洲国产成人精品| www.夜夜| 91nbbbbbb| 日本不卡一区二区| 亚洲高清无码AAA久久久精品| 日韩美女久久一区二区三区| 五月婷婷青青草娱乐伊人| 国内毛片热久久思思热| 五月婷婷激情综合| 污污污8888| 亚洲天堂久久久久久粉红视频| 欧美东京热精品A∨| 午夜性| 欧美综合色,www| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 玖玖久久久| 欧洲一级性爱视频在线观看| 欧美黑人与女人91~| 四方色播| 99操逼| 天天操熟妇| 欧美亚洲| 一本久久精品中文字| 成人小说另类在线| 五月黑AⅤ| 大香久久| 久草视频分类在线| 精品国产乱码久久久久久日本公司| 人人看人人爰人人操| 欧美熟妇精品黑人巨大一二三区| 亚洲欧美另类图片| 九九热在线精品视频| 久久久久女教师免费一区| 全免费a敌肛交毛片免费| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 男人的天堂亚洲| 日韩淫色网| 操逼天美3区| 91成人在线| 黑人精品一区二区在线播放| 韩国久久97| 另类图片综合| 国产免费大片| av毛片aaaaa免费看| 小草精彩毛片| 秋霞网无码| 日本裸体久久色噜噜| 精品一区二区三区国产| 日韩三级网址| 成年人黄色视频免费| 亚洲综合另类欧美久久久| av网站国产主播在线| 国产亚卅97| 日韩性爱人人爱人人操| 91操人| 日本高清有码网址视频| 久久熟女嫩草成人片免费 | av天天在线观看| 国产传媒av天美传媒在线| 欧美|91色综合| 操逼操逼操| 国产传媒1234区| 欧美黄色大片在线观看| 97超碰超欧美。| 亚洲精品人妻吞精av| 色图四区| AND人妻系列| 一区二区三区黄色片a| 久久久久国产精品人妻aⅴ天堂| 色婷婷丁香| 97在线免费观看视频| 日日夜夜国产综合| 伊人影院综合是一个与深夜成人在线| 亚洲欧美天| 一色网男人的天堂| 精品国产91内射久久| 97超色| 熟女丰满人妻一区| 国产成年女人免费视频播放a| 亚洲欧美综合色| 热热色色综合| 国产欧美一区激情交| 亚洲天堂男人网| 超碰99热中文字幕| 嫩草影院性色| 九热中文字幕| 亚洲男人的天堂网| 日本色婷婷| 日本黄色大片一级视频免费麻豆| 四虎精品一区| 国语人妻精彩刺激| 国产精品视频麻豆入口| 超碰色大香蕉| 久久男人网| 91精品综合久久久久久五月丁香| 成年无码动漫av片无尽在线| 亚欧美综合网。| 久草久热| 久久精品国产亚洲粉嫩| 中文字幕二区日韩天堂| jizzjizz欧美| 欧美亚洲情色| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 超97在线精品视频| 91伊人| 色五月激情AV在线| 国产精品情侣啪啪| 人妻中文字幕日韩电影| CCYY草草影院地址入口| 欧美色图99| 精品九九淫乱男| 91亚洲人电影| 人人爱人人操人人性| 一级性爱视频免费在线| 激情小说激情视频| 97bbn| 综合网,亚洲,欧美| 国产精品成人无码av| 岛国大片在线观看网站入口| 日本一区二区不卡| 日韩精品午夜操呦呦不卡影院| 一区二三区四区视频大全套| 精品国产99| 四月丁香婷婷| 丁香激情五月天| 欧美三级中文字幕hd| 亚洲第一精品在线视频| JIZZJIZZ亚洲女人被躁| 亚洲成人ab| 欧美三级偷拍| 91欧美巨乳| 肉丝无码中文高清| 国产亚洲色婷婷99精品91| 蜜臀亚洲中文| 东京太热久久久| 激情五月激情综合网| 伊人激情| 丁香五月天激情综合| 国产成人无码网站在线视频| 国产精品久久久无码AV网站| 91碰超| 天天操夜夜嗨| 午夜超爽| 伦伦成年午夜免费视频| 操逼操逼逼操操逼91 | 五月丁香黄色网| 激情文学88| 天天草天天日| 欧美福利视频啊啊啊啊 | 91老司机在线视频免费观看 | 91在线国产后入风骚翘臀美女素人| 久久精品国产精品| 97超色| 精品无av|