日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满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
返回資訊列表
67194无码不卡| 日韩一区二区精彩视频| 亚洲女毛多水多21P| 男人天堂电影院| 久久国模av| 五月婷婷激情综合| 操逼啊啊啊91| 亚洲制服欧美另类内射| 强奸乱伦av电影| 国产真实子伦对白| 国产v亚洲v日韩v欧美v片另类| 操淫穴亚洲五月丁香 | 91超级碰| 天天操天天舔| 九月激情婷婷| 欧美偷拍区| 色吊丝 日日骚 清纯唯美| 久久偷拍人| 亚洲综合小说另类图欧美视频激情小说色五月天 | 97在线免费看| 亚洲图片 91| 97人人操人人摸人人爱| 老熟妇一区二区三区…| 国产激情久久久| 国产精品亚洲天堂网址| 极品综合| 欧美日韩大黄片| 精品午夜福利| 搡老女人老熟女91老熟女综合网| 神马麻豆福利院| 精久久久| 亚洲日韩97| 久热99999| 九九九偷拍| 中文字幕伊人| 美女上床网站| 亚洲密乳AV| 欧美日韩插逼视频| 嫖老熟女A片一二三区| 乱伦av国产| 日韩免费在线视频观看| 亚洲国产婷婷在线播放| 国产成人手机视频激情| 亚洲福利中文字幕在线| 四虎影库国产精品免费| www四虎| 亚洲天堂另类小说男人| 九九九久久久久| 成人熟女区| 日韩人妻精品中文字幕| 人人摸人人舔一区二区| 91无码西班牙视频在线| 影音先锋日本一区二区| 91精品国产高清久久久久久,亚洲成人| 日韩精品碰碰| 亚洲欧洲综合视频在线| 91美女丝袜诱惑视频| 啊啊啊啊嗯嗯嗯用力好爽 | 丁香婷婷激情五月天无毒不卡| 91亚洲精品青草| 美女久久久久久久| 91无摭挡| 亚洲无码精品AV久久久| 久久首页| 亚洲情色一区三区| 亚洲性综合11| 亚洲男人久久综合天堂| 午夜黄色免费在线观看| 丁香五月天婷婷姐| 伊人久久亚洲色欲综合网站| 天天拍夜夜| 欧美日韩国产一区二区小黄片大全| 91色综合| 日韩不卡在线一区二区| 蜜桃久久综合视频| 夜夜国自区| 91综合网| 欧美黄片视频在线观看免费| 亚洲AV不卡在线观看尤物| 91精品久久久久久久久久| 亚洲精品国产拍免费91在线| 中文字幕人成乱码熟女香港| 91人妻爽爽人人做人人澡| 精品国产99| 一本色道久久综合狠狠操| 999精品女人| 国产51色综合久久免费| 久久精品人体| 18禁久久| AV天堂国产| 婷婷久久综合| 精品国产乱码久久久久久久| 亚洲精品尤物yw在线影院| 亚洲激情AV| 伊人色综合欧美| 久久春色| 骚逼高潮久久精品| 好吊色青靑草| 成 人 影视 一区 二区 三区 四区| 久久久久亚洲一区女同性恋中文字幕| 神马麻豆福利院| 免费精品人妻一区二区三| 婷婷伊人网| 岛国不卡超碰护士AV在线播放| 中文字幕欧美丝袜07资源| 日本色色色色色视频| 亚射在线| 欧美v日韩v亚洲v最新在线| 天天躁日日躁AAAXX| 97人人夜夜精品视频| 色色五月婷| 欧美色图片91| 国产丝袜欧美在线视频| 久久久av爱| 91被操| www.99在线| 亚洲交换| 夜色AV无码手机在线影院 | 国内外激情在线| 夜间福利片1000无码| 国产又大又粗又长视频在线| 日韩中文字幕视频| 韩国三级三级BD在线| 男插女青青影院| 熟女丝袜视频| yiqicaoav| 亚洲图片 91| 色综合av综合久久| 久久夜色一区二区| 久久亚洲精品成人av| 色天欧美| 天天干,夜夜爽| 91亚洲人| 蜜臀AV成人精品蜜臀| 肏逼福利网站| 日本大香蕉| 天天色天天干天天射| 97日视频| 清柠毛片| 欧美区亚洲区偷拍区| 91网亚洲| 一级A片女人高潮叫床| 嗯~啊~快点 死我视频免费看网站| 欧美日本中字另类在线| 大伊香蕉在线视频免费| 欧美翘臀视频网站一区二区三区| 理论久久婷婷网 8| 蜜臀无码视频在线观看| 97干在线看| 欧美成人一级麻豆| 久插不卡| 婷婷五月天基地| JIZZJIZZ亚洲女人被躁| 欧亚揄拍偷拍精品视频| 中文字幕加勒比海高清无码免费视频 | 大肉棒导航| 欧美劲爆视频一区二区| 久久国产AⅤ| 伊人少妇久久久| 极品极品色影院| 97超碰美女| 嗯嗯啊啊用力视频免费| 999亚洲国产视频| 暴力av在线| 中文字幕在线观看第二页| 韩日性爱av| 亚洲精品国产拍免费91在线| 成人老鸭窝人人在线视频| 国产精品999zyz| 淫荡网址| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 色91综合网| 中文字幕精品一区二区精| 很狠操| 日韩伦理视频| 99久视频| 首页中文字幕中文字幕免费| 亚洲天堂资源网| 青青草吊丝| 婷婷亚洲综合| 国产成人亚洲精品无码古代早漏男| av橘色网站| 亚洲影院成人| 口爆综合网| 韩国手机不卡无码三级视频| 99热这里只有精品18| 69视频福利导航| 99视频精品| 四虎国产精品永久地址入口| 男女一进一出视频久久| 日韩精品一二三| 五月天加勒比啪| 日韩二级| 黑操B| 男人的天堂2010| 日本 色 导航| 亚洲一区日韩精品中文字幕| 久久久四区| 久久久久久9999| 爽爽歪在线视频| 黄网在线播放| 国产精品青草综合久久| 九九综合久久| 日韩人妻免费精品| 无码日韩人妻av一| 91人妻最真实刺激绿帽| 中国AAAAAA黄色片| 操操逼视频| 人人做,人人操,人人摸| 日韩性爱小视频| 亚洲视频中文一区| 久久狠狠色噜噜狠狠狠狠97| V A在线| 亚洲se91| 在线97视频| 在线人成亚洲视频免费观看| 日韩亚洲中文字幕在线| 亚洲欧美中文日韩视频中国语| 亚洲一区二区三区中文字幕| 国产操偷| av国产无码| 国产成人自拍视频在线| 国产 三级自拍| 国产精品久久久久久片| 狠狠色丁香| 91ise欧美| 亚洲熟妇丝袜在线观看| 神马久久久久久久久久久久| 日本高清熟女久久一区| 91麻豆天美国产欧美高潮| 一区二区播放| 天天干电影| 无码国产精品96久久久久孕妇| 久久这里只有精品9| 国产美女在线精品免费看| 综合伊人激情| 一区二区三区精品视频| www.婷婷| 日本中文字幕一区| 成年人黄色| 欧美亚洲第一页| 黄片com.| 国产亚卅97| 亚欧美综合网。| 久草毛片| 欧美人与动性人交a| 久久综合国产精品国产| 激情综合亚洲| 97色涩| 天天爱综合网| 国产精品爆乳懂色蜜乳| 久草视频在线视频在线视频在线观看 | www.男人的天堂| 久久精视频美日韩在线视频| 久久婷婷一区二| 色哟哟-国产专区| 色婷婷一区二区三区久久午夜成人不| 另类小说欧美激情校园春色| а√天堂资源官网在线资源| 国产无码一二三区| 久久夜色一区二区| 上床啊啊啊| 日韩精品国产一区二区| 色五月首页| 欧美综合在线91| 超碰99在线| 青娱乐欧美激情一区二区| 国内精品久久久久影院亚洲| 人妻内射一区二区在线视频| 日韩无码极品| 丁香六月婷婷| 成人小电影网站tex| 中文字幕一二区二三区人妻专区| 久久五月份| 国产超碰欧美| 激情久久av一区av二区av| 91在线限制级| 超碰国产精品久| 久久久久密| 日1区2区3区2020| 夜嗨影院| 天天色粽合合合合合合合| 亚洲精品97久久中文字幕| 人妻一区二区三区四区视频| 女人高潮大叫一级毛片| 亚洲欧美综合网站| 激情啪啪拍91| 国产精品69久久久久孕妇欧美| 老子午夜伦不卡影院| 久草久热| 91网九色蝌蚪操熟女| 91色艳| 天天色综合影视网| 日韩性爱高清免费视频| 国产丝袜啪啪| 偷拍 精品 另类 四区| 人妻精品一区二区| 日韩偷拍色图| 国产9区| 69超碰综合| 极品色| 国产人妻精品久久久一区二区三区 | 亚洲有码 视频一区| 日本一级不卡一二区| a天堂视频| 九九九九九九九九九九九蜜桃| 亚洲国产成人福利在线观看| 丝袜色综合| 欧美性爱在线无码| 亚洲精品一区二区精品| 大香蕉综合网| 91美女视屏| 国产强奸乱伦无码视频| 日韩激情视频| 看日韩操逼| 91美女国产在线| 国产精品蜜臀久久久久无码AV| 99久草| 国产97色在线| 97干在线视频| 青青操少妇| 国产成年免费大片黄在线观看| 天天内射| 亚洲第一页色| 国产女人和拘做爰视频 | 精品十八在线观看| 亚洲综合网电影91| 国产一区在线观看无码AV| 色老牛| 99精品成人免费看| 久久久999| 久久大陆| 翘臀vidoes| 欧美一区二区三区入口| 清纯唯美激情| 亚精品无码毛片一区二区三区| 中文久久爆乳| 成年人网站在线免费观看| 都市激情人妻一区二区青青操视频| aaaa少妇高潮大片| 美女91网站| 久久久成人免费av电影| 欧美性爱一区| 97超碰色五月| 在线播放中文字幕| 蜜乳性色无码专日粉嫩骚逼AV| 人妻少妇精品| 综合欧美色图| 91大香蕉伊人| 国产视频小说| 九久9热| 色一情一乱一乱一区91Av| 久久久99免费| 亚洲色图一区二区三区| 九99久久| 国产二区三区粉嫩在线| 在现视频女上位好爽| 色青青久久影视| 亚洲在线网站| 男人的天堂网页| 九九九国产精品| 超碰地址97| 精品99999久久久久久| 日本精品高清一二区一本到| av强奸乱轮| 偷拍精品一区二区三区| 99久久无码| 亚洲欧美黄| 超碰欧美COM| 神马久久免费电影观看| 色综合超碰超| 欧美激情色婷婷花野真衣一区二区| 九久久精品| 99人人干| 岛国精品视频在线观看| 人妻精品一区二区全免费| 成人午夜无码视频| 天天日天天色| 激情综合亚洲| 9久久精品| 岛园激情| 婷婷五月综合在线| 天天狠| 国产女上位好爽在线| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 亚洲A曰本VA欧美VA视频| 国产丸一视频| 精品无码一区二区人妻久久蜜桃| 青草园大香蕉| 久久精品综合| 国色综合天| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 亚洲人妻爽爽爽| 亚洲少妇视频| 一区二区三区视频| 乱伦一二三| 欧美一级美片在线观看免费| 亚欧成人中文字幕一区| 亚洲一区二区性爱电影| 激情第四色| 色噜噜综合在线| 久久啊哟| 天堂伊人久久| 青青草一本道福利视频| 丝袜AV一区二区三区| 日韩欧美加勒比| 国产精品麻豆成人av| 亚洲中文字幕三级在线| 嫩草一区二区在线观看| 无遮挡猛进视频免费无限观看| 岛国精品视频在线观看| 午夜天堂精品久久| 久久久久无码一妻区| 久久精品一区一起草| 综合色一区三区二区| 日韩欧美性吧婷婷乱伦大香蕉 | 99热啪啪| B049AV在线播放| 神马久久久久久久久| 麻豆成人影音在线| 校园春色综合网| 极品久久久久久久久久久久久久| 亚洲的天堂网| 亚洲一区二区av| 日本黄色精品专区网站| 曰本人妻人人澡人人夹| 婷婷激情啪啪| 日韩色图 一区二区| 久久精品超碰| 日韩国产乱子伦App| 日韩在线观看中文字幕视频| 中文字幕一区二区三区人妻少妇在线| 久久久久无码一妻区| 成人性交午夜免费片| 国产成人精品必看| 久久久久久中文字幕中文字幕最新| 精品一区二区三区四区女| 国产女主播视频在线观看| 九九九久久久| 婷婷丁香五月激情啪啪| 天美精品一区二区三区四区在线观看| 九九操久久国产免费视频| 欧美片第一页| 综合色播| 尤物视频偷拍免费| 精品国模无码| 日韩人妻资源网| 嗯嗯啊啊日韩精品| 韩国手机不卡无码三级视频| 亚洲 欧美 91| 91欧美色| 丁香五月av| 男女香蕉一区二区| 国产一进一出视频网站| 无码91| 日韩电影在线观看网址| 91黑人无码激情在线| 我中文字幕6区| 精品免费视频国产一区| 97香焦色区| 免费视频一二三区| 五月婷婷色| 欧中美三级一区二区三区| 午夜福利免费福利视频| 久久夜夜夜| 日韩精品国产一区二区| 狠狠干精品一二三四五六2022| 91综合中文字幕| 狠狠操狠狠爱| 久草在线| 欧美亚洲激情小说| 插入逼91| 黑人精品久久97| 免费一级精品啪啪视频| 九区国产| 人人干人人搞人人摸| 加勒比综合a∨| 国产AV久久野战精品| 欧美夜色| 人人摸人人摸人人干| 欧美色图 人妻| 国产亚洲女v在线观看| 曰本91情色| 亚洲精品影视老司机| Aa东京男人的天堂| 91碰碰碰| 国产性爱强奸乱伦大全| 色噜噜人妻av 中文字幕| 无码精品久久久久久亚洲| 99啪| 国产成年免费大片黄在线观看| 日本男人插女人的逼黄色| 欧美一区二区三区另类精品| 老鸭窝成人| 亚洲欧美精品91| 操碰97| 东京热精品97综合网| 久草免费在线一区二区| 丰满人妻-区二区三区| 肥臀熟女福利视频一区二区| 特级毛片特黄久久免费看| 九九人妻| 四虎AV无码| 日韩性爱视频在线免费观看| 欧洲性人爱视频| 992这里有精品| 成 人 A V免费视频在线观看| 国产不卡中文字幕免费avi| 欧美色性爱| 欧洲综合色| 96精品久久久久中文字幕| 亚洲成人日韩小说| 亚洲一区二区在线观看91| 另类av综合久久| 综合色区偷拍| 国产无码精品久久久久久| 嗯阿好爽好紧| 亚洲码专区| 亚洲无线观看久久| 麻豆黄站| 色综合加勒比四四季| 黄色大香焦1级‘′‘| 亚洲精品九九九| 久久视频,这里只有精品| 特污免视频| 亚洲精品无码少妇久久| 大二网站亚洲| 亚洲久9| 国产视频小说| 嗯嗯嗯,草死我| 丁香五月久久| 国产AV精久久| 日日操免费视频| 东京热毛片调教| juliaann丝袜大战黑鬼| 蜜臀久久久久久999| 亚洲乱码国产乱码精网站| 黄色视频高清无码网站| 欧美性爱超碰97| 婷婷丁香九月| 天天射天天色成人| 制服丝袜第二页| 亚洲高清视频在线观看| 偷拍欧美综合| www.婷婷| 92福利社视频| 97色色色| 99色在线| 色5月婷婷| 91精品无码久久久久久久| 欧美 综合 亚洲| 欧美日韩国产电影| 色婷婷在线视频精品导航| 欧美精品人妻视频| 中文字幕大片三级狠狠干| 99在线精品观看99| 精品一区二区三区蜜桃臀赵总 | 国产www色在线观看| 在线中文字幕| 另类小说综合网| 欧美的性爱网站免费| 欧美性爱精品七区| 女人天堂网| 98精品国产乱码久久久久久| 精品中文一区二区| 丝袜性亚洲| yazhousetuoumei| 玖玖蜜臀资源网| 日韩精品熟妇| 蜜桃久久久久久久久久久久| 亚洲欧美日韩电影网站一区 | 五月婷色| 91xingse| 诱惑人妻欧美一区在线播放| 大香蕉男人的天堂| 天天干人妻| 高潮9999外国| 曰韩中文人妻视频| 天天懆天天日| 日本精品第一视频在'| 婷婷丁香五月激情啪啪| 婷婷香蕉欧美在线一区二区三区| 欧美色九九九| 伊人网在线视频| 精品视频一区二区| 神马久久久久久久| 91在线超高颜值国产| 中国一区二区亚洲人妻| 女优视频第10页| 色情亚洲日本成人| 美国三级日本三级久久99| 国内毛片四区| 亚洲av国产av综合av卡| 人人插人人摸人人| 2020中文字幕| 国产久久日| 香蕉精品二区二区 | 日本色婷婷| 日本丝袜美腿人妻九九| 青青草久草AV| 沈阳熟女高潮对白视频| 操逼操逼逼操操逼91| 很很干很很操| 超碰碰激情97+久| 91在线观看,天天综合| av网站国产主播在线| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 免费久久一级毛片大黄| 综合欧美日本三级| 天天综合影院91| 大香蕉中文网| 日本人人操人人操| 欧美超碰97| 嗯阿好爽好紧| 日本国产二线女色| 一级乱伦网站| 高清在线偷拍自拍视频| 久久伊人影院| 欧美亚洲中文字幕| 久久男人精品| 91男女啊啊啊| 精品无人区麻豆乱码1区2区图片| 亚洲春色欧美激情自拍| 97色色婷婷| 中出后入| 亚瑟国产精品久久无码| 精品女人999| 婷婷久久久精品| 免费超碰97在线观看| 蜜桃久久综合视频| 大香蕉狠狠爱| 青娱乐日韩无码| 亚洲超碰综合网| A片大香蕉在线| 日韩精品国模| 成年人网站在线免费观看| 日本久久99| 日本 情色 1区2区3区| 色噜噜狠狠色综无码久久合欧美| 久久嫩草国产成人一区| 99超碰色| 欧美性性性| 亚洲五月婷| 亚洲欧美91√| 伊人黄色视频免费观看| 我中文字幕6区| 久久国产性爱| 国产精品电影推荐| 久久69精品久久久久久久| 69综合网| 欧中日成人免费影视| 国产午夜在线观看视频| 欧美 亚洲 大香| 人人操人人舒服| 亚洲综合另类欧美久久久| 天天综合91| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 国产一区二区在线看| 郑州宾馆老熟女露脸啪啪| 亚洲天堂日本| 欧美国产伊人久久久久| 玖玖资源视频一区二区三区| 综合久| 99999国产| 亚洲 91 在线| 久久双插| 四虎在线播放| 手机看片1024你懂的国产| 九九九九97| 综合色图区| 久久午夜色播影院免费高清| 蜜桃久久久久久久| 美女视频尤物网在线看| 制服中出中文人人精品| 日韩一级片在线看| 色约约一区=区三区| 中文字幕国产精品1区| 豆花视频操逼网址| 久久久天美| 天天做天天爱天天爽| 亚洲伊人久久综合97| 日日噜噜夜夜久久亚洲一区二区| 一区二区三区精品视频| 亚洲牲交| 校园春色中文字幕AV| 中文字幕性感少妇av| 亚洲精品九九九| 亚洲Av噜噜一区二区三区妖精| 国产精品探花在线| 麻豆久久一区二区三区| 色www精品视频在线观看| 婷婷久久大香蕉| 性色AV蜜色av色欲av| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 91老司机精品| 97色色色综合网站| 韩国一级婬片A片AAAAA| 被窝影院午夜看片无码| 亚洲欧美变态| 97爱爱影院| 99久久久久| 欧美黄色片在线播放| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 欧美伊人久久综合网| 96免费视频在线| 99啪| 国产精品ⅴ无码大片在线看.| 91久热| 日韩情色AV| 黄片免费久久久久久久| 亚洲天堂资源网| 日本一久是| 蜜桃久久久久久久| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 婷婷激情五月| 日韩欧美中文日韩欧美色| 26uuu性物| 91熟女网| 老司机午夜福利视频一区二区| 欧美92| 校园春色美腿丝袜| 国产黄色剧情影片麻豆免费播放| 欧美激情久操网| 成人综合视频久久| 97网址www| 亚洲综合69| 亚洲天堂五月天国产| 天美AV片| 天操天操夜操夜月月年年操操| 亚洲第一狼人丝袜美女另类| 精品妇操一区二区三区| 欧洲与亚洲欧美精品中文字幕| 天天日天天操心| 日本 色 导航| 伊人热综合| 欧洲综合视频| 午夜a成v人电影| 蜜桃臀av一区二区| 97人妻人人躁人人玩人人| 看全色黄大色大片免费视频| 麻豆精品A片免费观看| 亚洲一曲日韩精品| 国产又粗又长的视频| AV无码久久久精品| 久久久久久AV无码免费网站| 中文字幕蜜乳av| 国产精品在线一区二区| 五月色综合| 精品一区二区麻豆| 亚洲密乳AV| 久久久精品,3| julia国产在线 | 人妻久久久久久久久久久久久久久 | 国产精品一区二区三区,亚洲综合| 性爱乱伦视频免费| 免费黄色片。| 91精品国产日韩欧美综合| 欧美性生活免费网| 天天日天天干天天整| 欧美疯狂做爰xxxx| 99热这里只有精品8| 男人天堂婷婷五月天校园春色| 久久9精品视频| 国产精品 午夜福利| 国产精品视频在线播放| 亚洲人综合| 97超碰精品图片| 欧美综合另类| 人人看人人插| 啪一啪免费视频| 色五月婷婷久久| 久久久久国产亚洲一区欧美色图日韩| 免費人妻夜夜爽天天爽爽一区| 男人天堂综合| 青青草华人在线欧美在线| 91制服丝袜中文字幕| yw尤物av无码点击进入麻豆| 精品毛片av一区二区 | 我爱操| 91亚州| 激情综合婷婷| 精品四五区| 久久99999| 暴力av在线| 91P0RNY大屁股人妻| 啪一啪免费视频| 日韩偷拍色图| 精品妇操一区二区三区| 欧美亚洲今日在线| 伊人久久在线视频观看| 九九无码| 97频视在线| 日日夜夜免费| 久久久精品无码亚免费| 欧美性天天影视| 91N综合网在线| 97在线视频观看| 九九性爱网| 嗯阿好爽好紧| 久久三区四区| 久久久久亚洲AV无码专区少妇| 超碰av在线| 91欧美性| 老司机深夜18禁污污网站| 国产成人网| 久久久久久久9最新免费视频观看| 97超碰欧美手机| 国产AV激情无码久久无码| www.91色综合| 日本一二三免费久久| 91伊人久| 亚洲男人的天堂V| 欧综合网| 五月天综合在线| 精品中文一区二区| 久久精品久久久久久久久| 香蕉在线一区二区三区| 中文字幕av一区二区三区人妻少妇 | 国模无码一区二区三区在线| 色91综合网| 999久久久九九九九| 777奇米影视777四色| 伊人久久亚洲中文字幕不卡| 久久伊人最新网址视频| caoni国产亚洲av| 亚州欧美另类| 精品亚洲黄色片 国产精品导航一区二区 | av爱爱爱| 婷婷三区| 2017av无码免费无线播| 丁香九月婷婷| www欧美91| 色五月激情网| 精品人妻少妇| 色色婷婷丁香| 日韩一卡二卡三卡| 九月色婷婷| 天天干嫩逼网| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 无码区蜜乳| 成 人 影视 一区 二区 三区 四区| 欧美色综合网| 蜜桃臀av在线观看| 日逼97| 97人人草| 啊啊啊啊网站| 一品道视频一区二区三区| 日本不卡在线二区三区| 免费夜夜爱黄色视频毛片| 啊v在线观看视频| 精品超碰中文在线| 无码国产精品96久久久久孕妇| 亚洲夜夜欢无码一区二区| 久久黄黄黄| 91美女丝袜诱惑视频| 欧美色另类| 久久久久13| 国产极品粉嫩馒头一线天av| 性色国产东北露脸精品视频| 人妻少妇被猛烈进入中| 激情黄色五月天| 欧美丰满熟妇XXXX性ppX人交| 日韩AV噜噜噜一区二区三区四区| 色婷婷视频| 亚洲色图 欧美| 啊啊啊不要啊啊受不了了视频在线 | 一本久道久久综合狠狠爱一密臀精| 天天干天天做| 无码高清少妇久久| 超碰无码五月97| 久热大香蕉| 日韩福利电影网| 秋霞鲁丝午夜无码一区二区三| 5278欧美一区二区三区| 伊人超碰97| 欧美片第一页| 极品粉嫩一区二区| 亚州熟女乱伦| 自拍亚洲综合| 视频二区美腿丝袜制服人妻欧美| 男人的天堂 在线一区| 色色网91| 人人澡综合涩| 人妻乱仑一区二区三区| 97人人爱人人乐| 亚洲丝袜天堂| 久久美女福利是上海美女| 干少妇视频| 日本孕妇孕交| 偷拍网站久久男女男| 欧美另类精品xxxx| 国产精品熟女一区二区三区| 美女AV一区二区| 亚洲久热| 亚洲一级特黄大片在线播放91| 亚洲色电影在线| 亚洲的天堂网| 1区2区3区在线视频| 日本高清有码网址视频| 国产丝袜美女在线一区| 亚洲国产97在线精品一区| 亚州久久9| 欧美淫穴| 欧美黄色片AAAAA| 国产又黄又粗的视频| 91精品丝袜久久久久久| 色制服丝袜夫妻av一区| 色穴精品| 一区二区三区四区色图| 久操视频资源站公开| 囯戸精品高潮呻吟旡码| 中文乱码字幕观看| 五月天久久人妻| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 极品销魂美女一区二区 | 狠狠入| 曰本熟女视频| 啊啊啊啊啊啊在线看| 六月色色| 国产精品青草综合久久| 乱欲一区二区| 家庭乱伦性爱av| 免费一级性爱久久| 国产精品人妻无码久久久互動交流 | 欧美 亚洲 91| 久插不卡| 欧美综合第一| 亚洲综合113页| 亚洲人成色9999精品久久 | 99久久9| 精品999日本| 欧美亚洲美少妇一区二区| 久久综合日韩亚洲欧美| 情色日播放AV| 91肏屄网| 欧洲Au麻豆| 中文字幕视频在线观看一区二区| 91xingse| juliaann精品熟女一区| 91九久| 伊人大香蕉在线| 99啪| 亚洲综合性感在线| 天天享受天天看| 丰满少妇高潮无码| 日韩精品9999| 日本中文字幕在线视频| 97资源制服丝袜| 天天做天天爱| 婷婷五月天av| 一色网男人的天堂| 国产不卡片| 五十路熟女工口| 麻豆一区在线| 久久视频,这里只有精品 | 啊嗯嗯啊好大好爽| 久草毛片| 熟女精品日韩一区二区三区| av中亚| 国产男女边吃边摸视频网站| 99国产在线 精品 视频| 国模不卡| 99热最新网址| 无码视频黄色网战| 本道在线| 日日躁夜夜躁狠狠躁超爽| 大香蕉日韩| 久久永久无码人妻视频| 成人自拍三级在线观看| 中日韩久久久| 婷婷激情四射| xxx亚洲午夜天堂| 九九九九免费高| 精品免费囯产一区二区三区| 久久专区| 中文字幕亚洲热播人妻| 日韩另类| 久草婷婷| 一卡二卡三卡| 俺去啦俺来也久久综合| 国产黄色av大片网站| 天天爽爽爽爽| 亚洲综合69| 欧美人妻制服| 久久久亚洲高清不打码| 超碰成人免费| 久久久久亚洲一区女同性恋中文字幕| 人人九九精| 性夜影院爽黄A爽免费动漫| 做爱A级亚欧| 天堂精品在线| 亚洲日韩久久精品一区| 91亚洲人| 欧美日韩岛国大片在线观看| 久久一区无码| 暴力av在线| 亚洲字幕一区二区| 国产精品交换一区二区| 性爱AV天堂| 亚洲学生妹高清av| 欧美熟女操屄| 国产精品熟女九九九| 日韩猛交| 天堂8在线新版官网| 宗合情欲网| 亚洲人妻精品一区二区| 午夜福利免费福利视频| AV一二区| 四虎精品一区二区| 999国产精品999| 亚洲情色一区二区三区| 免费伦费视频在线观看| 亚州人妻| 男人天堂欧美| 日韩性爱网址| 青女在线| 久草精品国产99| 久久五月份| 婷婷人妻激情| 极品白嫩美女白浆成人福利在线看| 国产熟女一区二区丰满| 麻豆久久一区二区三区| 99精品无码| 久久精品操| 日韩不卡a级视频专区| 久久鲁夜| 无码 黑人一区二区三区| 天堂av2019| 亚洲另类天堂| 艹我哪美一区无码| 人妻91少妇| 亚洲综合五月天婷婷丁香| 久久精品一区二区三区蜜桃臀| 亚洲精品国产熟女久久久久久| 抽查国产福利主播| 肏逼视频日本| 蜜桃久久久久久| 亚洲AV无码秘 蜜桃臀国精产品| 欧洲天天在线| 日日夜夜摸| 极品白嫩福利在线| 日本阿v天堂在线观看| 超碰久久性爱| 日韩在线观看三级电影| 久操B网| 精品九九九| 这里是精品| 翔田千里无码中出中文字幕| 69精品人人人人| 性色生活片久久毛片婬片免费放女人一级毛片| 亚洲中文字幕乱码无码一区二区| 精品视频在线观看精品| 蜜臀精品1区2区| 亚洲国产精品V?在线播放| 麻豆AV96熟妇人妻| 超碰人人操97碰| 91精品免费| 久草大| 亚洲欧美日韩中文播放| 99re9这里只有精品| 狠狠操官网| 91美女国产在线| 操美女高潮抽搐白浆| 国产美女高潮视频| 少妇超碰在线| 欧亚无码视频| 超碰久在线天天做| 婷婷亚洲综合| 国产精品不卡高清在线观看| 97色欧州| 在线女人91| 欧美日韩国产一区二区小黄片大全| 自拍二页| 亚洲精品三| 黑人猛交| 久久同城AV| 九热视频| 久久久精品电影| 97情超碰色| 97超碰碰碰| 日韩欧美中文日韩欧美色| 桑老女人九区| 亚洲中文字幕妇伦久久| 91精品女厕偷拍视频| 欧美性高潮在线| 国产专区路线| 亚洲欧洲国产综合av| 日本操逼视频免费| 91无摭挡| 熟妇人妻一区二区三区| 国产精品一二三在线看| 国产精品96| 中文字幕乱偷人妻久久艾草网| 五月色综合| 人人操人人插人www| 色妺妺AⅤ| 超碰在97| 欧美熟女激情| 激情婷婷| 操逼操逼视频操逼| 百度百度日本操逼| 欧美草草高清日韩视频| 久久精品老司| 日韩高潮一区| 欧美日本一区二区a人| 欧美成年人性爱视频免费观看| 亚洲97网站| 九九英色视频| 蜜臀av一区二区三区免费观看| 啪啪AV导航| 1769一区| 色欧洲| 大色网久久| 久热大香蕉网站| 成人老鸭窝人人在线视频| 人妻AV在线| 亚洲欧美国产成人综合不卡| 永久免费av无码网站国产app| 天天天肏屄肏屄肏屄欧美欧美| 亚洲日韩东京热一区| 欧美五区| 色噜噜人妻av 中文字幕| 色优久久| 97综合在线| 凸凹视频在线观看| 黑人狂躁日本妞一区二区三区| 国产高清自拍视频| 嗯嗯啊啊啊好爽| 超碰97综合网| 日韩熟女视频二区| 日韩少妇无吗| 国产乱码精品久久久久久| 免费农村成人少妇人妻Aa一区二区视频| 蜜桃无码AV一区二区| 97视频免费在线| 蜜桃视频啊啊啊啊| 天天看高清麻豆| 粉嫩少妇自慰在线| 日本丝袜美腿人妻九九| 日本亚洲vr欧美不卡高清专区| 国产超碰在线| 国产一级片| 俺去也婷婷| 日日干日日| 亚洲色五月| 日韩精品区二区三区不卡| 色色激情| 性色一线| 99日视频在线免费| 亚洲人91| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 91狠狠狠| 青青久日| 91欧美网| 精品人妻一二三| 中文字幕丰满子伦无码专区在线视频最新 | 欧美天天射| 综合久久少妇中文字幕| 狠狠操狠狠操操| 日本孕妇一区二区视频操逼免费看 |