日韩精品一区二区三区在线视频放-无码中文字幕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
返回資訊列表
中文字幕制服欧美久久一区| 天天日天天射天天干| 大香蕉男人的天堂| 免费一级性爱久久| 伊人青青一区成人视频在线观看区| 色婷婷日韩精品一区二区三区| 日本高清视频xxxx| 在线 亚洲 网爆 自拍| 国产玖玖| 东京热亚洲一区二区| 97超碰人操| 中文字幕第9页萱萱影音先锋| 亚洲色五月| 91亚洲黄色网| 巨爆乳肉感一区二区三区竹菊影视| 久久久专区| 黄色视频60分钟| 东京热综合久久一区二区| 家庭乱伦性爱av| 久草草一二三四区久久| 美国aaaaa一级黄片| 试看60秒| 国产精品高潮呻吟av久久4虎| 亚洲乱伦图片视频| 综合五月天| 97天堂| 亚洲欧美情色| 一区二区偷拍拍视频| 国产视频第二页| 97综合在线| 久这精品中文在线观看视频| 99久久com免费视频′| 亚洲欧洲成人在线电影| 欧洲中文字幕| 成人无码影片视频在线| 嗯嗯啊啊啊好爽| 天堂精品在线| 精品人妻一区二区三区四区石在线 | 97在线免费视频| 人妻一区二区三区| 日韩欧美tv一区二区在线观看| 亚洲污污网站| www.99在线| 超碰亚洲97| 欧美做爰无码A片视频| 亚州精品人妻一二三区| 久久综合99| 国产成人在线观看网址| 久久国语| 97天堂| 国产自制av蜜乳| 亚洲激情 欧美色图| 中文字幕人成乱码熟女香港| 人人操人人摸超碰| 日韩大香蕉精品在线视频| www.婷婷| 老熟女乱伦一区| 亚洲天堂久| 9久综合网| blacked精品一区国产| 欧美少妇高潮| 精品人妻一二三四区视频| 中文字幕一区二区三区视频播放| 黑人精品欧美一区二区蜜桃| 日韩 欧美 国产 麻豆| 成人aⅴ一区二区三区| 男人的天堂久久| 人人摸人人干| 久操热线| 91亚洲色人| AV中文字幕三四五| 躁躁日曰躁2020| 精品性爱一区二区| 午夜福利无毒不卡| 97超碰中文在线| 亚洲精品蜜桃久久久久久久| 超碰亚洲欧美日韩无| 看黄片视频免费| 丰满人妻一区二区三区免费| 天天激色| 欧美亚综合色图| 91Chinese在线| 亚洲欧洲自拍图片专区满春格 | 伊人97色天使| 91久热| 亚洲国产av中文字幕久久| 亚洲欧美洲综合| 亚洲男人天堂2013| 亚洲国内精品成人不卡| 久久久久日本视| 日本午夜久久电影| 美国一区二区三区视频| 老熟女乱伦一区| 亚洲图片欧美| 超碰吊日色| 国产第11页| 亚洲人在线成线成人| 99久久婷婷国产综合精品草原| 強姦亂倫a| 欧美亚洲丝袜人妻制服中文99| 加勒比av中文| 中文字幕二区| 九七毛片九九毛片 | 大香蕉日亚洲日本亚大| 久久m| 蜜臀99999| 久久手机好看网站| 久久精品人体| 蜜臀久久99精品久久久久久-DVD原版全| yw尤物av无码点击进入麻豆| 男人的天堂va在线| 中文字幕青青草| 青青草国产一区二区三区| 香蕉久久精品| 蜜臀AV成人精品蜜臀AV久久| 亚洲不卡不卡中文字幕不卡| ,国产乱人伦精品一区二区三区| 天天综合色| 欧美性爱五月天| 天天色综合天天操| 婷婷五月天丁香| 丁香久久| 日韩一级二级| 乱老熟女一区二区三区| 亚洲AV无码久久精品蜜桃小说| 在线视频一区二区传媒| 日日骚 av| 夜夜操一区二区| 亚洲drav色图| 麻豆色约约| 极品人妻少妇综合| 国产精品午夜AV完会免费| 成人毛片免费| 人妻中文字幕精品无码| 欧美系列在线一区二区| 国产欧美一区激情交| 超碰人人干| 免费精品99| 禁止观看美女黄| 亚洲、日韩、综合、另类| 欧洲射精91| 啊啊好多水| 色网综合网| 干妹子| 97国产中文| 欧美碰碰综合色| 粉嫩AV一区二区夜夜| 亚洲 欧美 色图| 夜夜夜夜夜夜夜夜夜狠狠狠狠狠狠狠| 黑丝自慰喷水网站| 天天综合97| 欧美另类精品xxxx| 婷婷五月天小说| 亚洲高潮少妇| 天操老女人| 91色人| 伊人91| 无码精品久久久久久亚洲| 国产乱伦搜索结果91P| 欧美日韩*字幕一区| 国产一进一出视频网站| 大香蕉AV在线| 亚洲和欧美裸体美女双飞视频| 91精品久久久久久久久久| 日天天九九天堂666| 亚洲欧美色图片| 操B视频日韩无码| 国产精品久久久鸭无码的功能| 丁香六月激情综合| 日日日骚女人精品| 1级黄色夫妻对换性交免费看| 温婉少妇玩3p| 欧美亚洲国内自拍| 青青草无码视频| 综合97| 视频在线观看免费一区二区三区 | 99这里只有精品国产| 日韩AV一起草| 欧美亚洲影视| 丰满人妻-区二区三区| 被男人添B超爽视频| 农村妇女一级二级三级视频| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 精品一区二区成人动漫| 日韩人妻资源网| 欧美日韩青操| 日韩兔费看黄片| 国产熟女乱论| a人欧美综合天堂麻豆| AV有码在线| 岛国激情视频软件| 中文字幕91综合| 91久久久久| gogogo免费高清看中国国语| 99在线免费视频| 欧美日韩国产人人| 思思热在线视频免费| 99精品久久| 啊啊啊啊啊好舒服视频| 国产精品露脸在线观看| 又黑又大又粗| 天天噜| 美女黄频a美女大全免费皮| 丰满人妻一区二区三区在线| 传媒在线观看一区二区三区| 日本操BAV| 日本中文字幕高跟| 思思热一热婷婷热一热| 色五天伊人| 欧洲综合视频| 无码精品久久久久久亚洲| 狠狠干,狠狠操| 偷拍欧美亚洲| 国产一区二区在线电影| 射丝袜大香蕉| 日日日日做夜夜夜夜无码| av婷婷色网| 亚洲熟女综合一区二区| 一区二区日韩欧美久久| 精品人妻久久久久一区二区三区| 国产精品探花视频| 夜夜嗨免费视频| h4610国产人妻| 日日干夜夜操视频h| 性猛交| 六月丁香婷| 69久久| 九九碰九九爱97| 欧美淫乱视频| 亚洲图片欧美91N| 婷婷五月激情综合| 久久久精品91八戒| 伊人五月天激情| 日本久久999| 97射欧美| 日韩欧美女求操每天更新| 女人爽到高潮潮喷18禁网站| 久久无码电影| 呦女网站| 日韩av不卡在线看| 肉丝中文无码高清| 亚洲天堂99| 久久久无码精品人妻二区| 国产精品探花在线| 欧美三级偷拍| 黄色AV影视| 欧美另类自拍| 黄色电影在线播放综合网站| 色综合美国| 亚洲欧美日韩中文播放| 国产久久日韩网站导航| 久草国产在线视频| 精品人妻少妇| 蜜桃久久久久久久| 亚洲精品国产熟女久久久久久| 激情四射五月天| 九九aV| 天美传媒AV在线| 欧美内射少妇| 大色综合网| AV中文字幕三四五| 亚洲色图超碰在线| 国产suv精品一区二区四| 国产丝袜美女在线一区| 97热视频在线观看| 禁片 高清 在线观看视频网站| 操逼A∨| 97碰碰日本乱偷人妻中文的| 婷婷操逼| 亚洲欧洲视频小说在线观看| 后入日本1234| 男人的天堂2018.| 色偷综合| 99色在线视频| 国产99精品一区二区三区免费| 丁香五月婷婷色| 东北少妇高潮zzzz| 天天躁日日躁XXXXYY| 欧美一区二区日韩传媒搭讪精品| 极品白嫩福利在线| 天堂中文日本在线观看| 久久 精品| 极品AV网站在线观看| www.天天干| 涩涩涩综合| 青青草一区二区高清无码视频| 亚洲瓯美色图| 九月丁香| 插穴性爱视频在线观看| 男女一进一出视频久久| 欧美日韩中国x| 91在线|亚| 无码逼| 亚洲色图91| 色哟哟AV| 精品小视频在线| 婷婷久久综合| 国产成人精品日本视频| 日日日日做夜夜夜夜无码| 日韩啪啪视频| 国内精品久9| 91色噜噜狠狠| 天天碰操中国年青熟妇| 青青草亚洲一区 | 人人九九精| 东京热毛片调教| 国产AV天美| 99色视频| 精品性爱一二三区| 大学生口爆吞精| 欧美成人性活片| 欧美韩日精品99综合| 91麻豆天美传媒HD| 嗯嗯啊啊操死我| 狠狠爱综合网| 婷婷亚洲五月***久久| 又粗又长又爽在线观看| 一区二区三区美女超清| 99热在线播放| 99国产精品人妻人伦| 天天夜夜rb| 午夜福利在线合集| 亚洲www91| 麻豆AV一区二区| 69超碰综合| 91久操| 亚洲啪啪性视频| 亚洲第一狼人丝袜美女另类 | 久久久神马影院| 另类 综合 日韩 欧美 亚洲| 久久蜜桃综合网| 国产黄a三级三级三级av在线看| 久久肏大逼| 成人福利视频网| 在线观看成人性爱免费小视频| 国产肏逼网站| 懂色中文一区二区三区| 色综合久久av| 99久久久无码国产精品性男| 超碰在线成人| 大香蕉婷婷| 九色视频91| 欧美在线观看综合国产| 免费综合亚洲中文| 天美麻花大全视频| 性爱综合网| AV中文在线| 男人兔费天堂| 97欧美精品综合| 夜夜高潮夜夜爽| 天天综合影院91| 国产综合久久久鬼色| 久久视网78| 国产精品久久久777| 青青草视频导航官网| 青青草日本中文字幕| 美女操逼A A| 欧美人妻一区二区| 唯美清纯 妖精视频| 野狼激情网| 大香蕉伊人亚洲| 熟女中出视频| 青草伊人久久| 97在线免费视频观看| 东京热大香蕉| 岛国片在线视频网站| 乱伦图av| 美女黄色一级A视频| 久久久久久久久久久人妻| 日本A级视频| 日韩 女同 综合| 国产乱码久久久| 91精品网站| 99亚洲国产精品色一区二区三区| 青娱乐国产精品| 色五月激情综合网| 天天爽夜夜欢视| 亚洲人精品午夜不卡| 就去色综合| 思思久热在线精品66| 美国一区二区三区视频| 丁香激情网| 四虎国产成人精品免费一女五男| 一本色道久久综合狠狠操| 亚洲AV无码天美传媒一区| 乱伦av麻豆| 色婷婷久久| 800zy一区二区| 26uuu偷拍亚洲欧洲综合| 99精彩视频| 无码二级三级| 狠狠亚洲| 黄色网址久久精品欧美喷水| 成人午夜小视频手机在线看| 乱欲视频| 欧美激情视频一区二区| 偷拍片久久| 四虎AV无码| 超碰91在线| 欧美精品一区二区少妇免费A片| 欧美日韩制服| 内射中国少妇高清视频免费视频 | 人人模人人看| 99热99re6国产在线播放| 日本高清_区二区三区| 天综合网欧美| 黄色十八禁网站| 人妻久久久久久久久久久久久久久| 北约熟女超碰| 搡老熟女免费视频| 99re98| 天天综合网合集91| 欧美熟女丝袜| 亚州欧美一区| 国产精品欧美激在线| 91人妻超碰| 91婷婷| 能直接看AV的网站| 天天色天天干天天射| 无码久久国产| 少妇久久久| 欧美日韩久久精品爱爱| 综合欧美色图| 天干天干天干天天做| 精品妇操一区二区三区| 一二视频神马久久传媒| 亚洲亚洲亚洲天堂天堂 | Sekablack无码一区| 亚洲色狠| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 欧美在线视频播放| 美女毛片999| 91亚州欧美| 蜜臀AV成人精品蜜臀AV久久| 激情露脸爱| 91色图片| 欧日韩在线观看| 亚洲欧洲色情高清| 狠色婷婷久久一区二区三区_| 国产AV人人 夜夜人人澡| 日欧美色| 嗯嗯,好大,好爽,好骚| 秋霞男人网| 一级黄碟在线观看| 97色涩| 色香在线| 亚州九九九精品视频| 久操影视| 999久久久久久久久| 夜夜嗨一区二区三区三州加勒比| 精久久久| 97国产|免费| 网友自拍第1页| 久久久四区| 黄色大片视频在线免费看| 精品一级毛片在线观看| 欧美性生活男人的天堂| 最新日日夜夜天天干干| 91在线超高颜值国产| 久久男人精品| 国产一区二区欧美日本| 日本久久99| 亚洲 日韩 欧美 国产综合体| 东京日日夜夜| 欧美最婬乱婬爆婬性视频 | 欧美天天搞| 97亚洲精品| 色操逼网| 久久东京国产精品视频| 亚洲午夜AV| 大香蕉www.超碰| 色五月av| 大香蕉琪琪日本女优不卡| 欧美日日操| 色综合98| 99国产在线 精品 视频| 久久久久成人亚洲国产| 九九色图| 蜜桃视频精品一区二区三区| 男人的天堂日本东京热| 日本免费二区三区| 91东北熟女| 日韩综合无码色欲vv| 亚洲少妇中文字幕网址| 精品无码久久久| 91处女视频在线观看| 亚洲亚洲亚洲天堂天堂| 欧美性爱一区二区| 日韩性爱1级片视频| 国产亚洲禁久一区二区| 旡码电影特区| 大屁股国产在线视频| 国产欧美另类久久久精品课程| 日韩肏逼视频| 国产亚州高清国产拍精| 久久手机好看网站| 色在线69堂| 日本久久超碰| 中国少妇XXXX做受| 丁香六月激情| 色哟哟1区2区| 久草午夜| 亚洲精品aa久久伊人| 国产人妻精品久久久一区二区三区 | 亚洲污污网站| 性天堂| 殴美大黄片| 亚洲美女精品| 久超碰这里只有精品| www熟女乱伦com| 欧美很很操视频| 五月婷婷hd| 国产区在线| 久操com| 亚洲 综合 欧美| 久久视频少妇美女| 三级日本一区二区三区| 久色网| 国产第11页| 国产毛片片精品天天看视频| 国产精品熟女乱伦| 品亲网欧美品亲网| 黄片视频观看| 久久久草成人网站久久久草成人久久久草久久久 | 欧美大香蕉同搞| 日韩精品.久久精品.AV女优.天美传媒| 东京热不卡视频| www.av家庭乱伦| 五月丁香综合激情| wuyechaopeng| 神马久久久久久伦理片| 999久久久久久久精| 亚洲第一页色网| h无码动漫在线观看| 操逼逼一区视频| 怡红院一区二区熟女人妻| 亚洲有薄码区日本系列中文字幕| 欧美日韩国产精品久久色婷婷| 26uuu欧美日韩| 热天堂一区二区| 欧美性爱一区二区三区| 久久婷婷综合国际产色怕| 99蜜桃臀亚洲成人在线观看| 国产粉嫩蜜臀av一区二区三区 | 人妻喷水| 欧美日韩香蕉| 国产久久一区二区| 亚洲AV成人无码一二三久久| 亚洲 中文 女同| 999久久久九九九九| 亚洲精品成人激情在线| 97av,com| xxx0国产在线播放| 婷婷美人网| 99re免费视频精品全部| 裸模AV女优| av毛片aaaaa免费看| 熟妇人妻精品一区二区视频色欲| 国产免费小视频| 91超级碰| 日韩欧美女求操每天更新| 午夜男女爽爽爽在线视频| WWW美腿丝袜香蕉中文| 国产精品色片一区二区| 久久一区二区加油站| 东北丰满熟女国产一区| 色欧洲97| 日韩AV一起草| 新怡红院| 中文字幕精品一区二区精品| 日韩情色一区二区| 性欧美另类高清| 亚洲精品久久久久毛片A片拉屎| 97资源制服丝袜| 96久久久| 熟女中出视频| 久久五十路熟女人妻| 欧美97日韩精品| 999亚洲国产视频| 亚洲在钱| 超碰在线91| 欧美色图亚洲激情| yirendaxiangjiashipin| 亚洲黄片免费在线播放| 色大香蕉97N| 国产精品无码在线| 99AV| 午夜激情床戏激情| 国产精品ⅴ无码大片在线看.| 久久久久9999妇女| 首页中文字幕中文字幕免费| 国产97/欧美| 志村玲子视频一区二区| 亚洲人成网站7777| 亚洲素人网| 隔壁邻居波多野结衣中文字幕| 久久99草| 啊啊啊好大好深| 熟女人妻av在线资源,黄色的资源 粉嫩国产精品久久粉嫩 | 97在线观看| 一区二区 电影 亚洲| 黄色AAAAA欧美| 日日嗷| 91在线色综合| 国产精品区在线12p| 婷婷九月国产| 欧美|91色综合| 一本色道久久天天射天天干| 91欧美巨乳| 亚洲天堂,男人| 亚洲乱色熟女一区| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 极品销魂美女一区二区| 999 久久久| 亚洲色久| 国产黄色小视频网站| 色综合 加勒比| 国产超碰国产97| 久久av一级av少妇av高潮 | 九热久| 欧美在线l亚洲| 色啪网| 久久草草亚洲蜜桃臀| 日韩熟女视频二区| 欧美日韩情色一区二区| 久久九九国产精品| 成人免费性爱视视| 亚洲熟女少妇免费视频| 蜜臀在线免费观看在线免费观看| 国产AV无码AV| 99色网| 久久久草草精品| 香蕉99秘 精品一区丁香| av无码精品久久久久| 无码78| 人妻无码视频一区二区三区久久| 96AV精品| 日韩AC| 另类TS人妖一区二区三区| 亚洲天堂少妇| 日韩电影天堂视频二区三区| 亚洲 欧美 天天| 黄色性爱网网| 精品久久久久久中文字幕三区 | 情侣操 逼视频99| 男人天堂2019亚洲| 99久久精品国产高潮| 国产一区二区成人av在线播放| 色97欧美| 天天激色| 天天夜夜久久| 九九天堂| 天天插天天射| 在线观看黄色电话| 乱伦1色页| 精品无码久久久久久久杏吧| 偷偷人人精品女女久久| 色偷综合| 日本五十路在线| 99中出在线| 九九热精品| 99热这里只有精品地址 | 内射卯月麻衣| 国产精品亚洲四五区在线观看| 婷婷伊人| 中文字幕 国产 精品| 亚洲h片在线免费观看| 一起草视频在线| 蜜桃传媒视频第一区入口在线看| 欧美色图91p| 91殴美大片| 亚洲、日韩、综合、另类| 男人夜色天堂ss| 久久草大香蕉| 色小视频蜜乳| 亚洲超碰AV| 九九干| 欧美日韩日产免费网站看| 亚洲AV无码秘 蜜桃臀国精产品| 麻豆AV一区二区天美传媒| 呻吟 欧美 日本 中出| 女人的天堂大香蕉网| 久久久久久久久久久久黄色| 色哟哟-国产专区| 久久国色天香香蕉| 午夜精品一区二区三区三上悠亚| 大香蕉伊人久久| 你懂得91| 欧美日韩第一页| 中文字幕av乱伦| 国产中文字幕曰本毛片| aaaa黄片| 国产精品自产拍在线观看社区| 五十路三级片| 亚欧日韩成人| 日本一区二区不卡精品| 国产精品自在线发布| 午夜影美女日鸡鸡天天视频国产| 岛国片国产成人亚洲播放| 亚洲成人无码影院| 国产精品一区二区三区,亚洲综合 性开放中文AV高清无码免费看 | 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 好屌色综合| 一直超碰| 97在线资源| 美女爽爽爽刺痛洞洞| 国产熟女二区| 欧美人妻精品一区二区| 被窝影院午夜看片无码| 99久久久久久亚洲精品不卡| 久久成人国产精品| 国产精品国产自产高清AV| 国产女乱淫真高清免费视频| 欧美系列在线一区二区| 国产精品自产拍在线观看社区| 国产精品青草综合久久| 三级三级三级日本99| 国产后入精品| 亚洲色图加勒比| 欧美亚洲日韩16色| 2019亚洲男人天堂| 超碰久超碰久| 91香蕉国产尤物视频| 无码人妻一区二区三区色欲aⅴ| 欧美日韩另类在线播放| 蜜乳AV网址| 色婷婷色99国产综合精品| 大香樵伊人网| 91jk色拍| 日产成人久久| 人妻丝袜一区二区三区在线| 插入逼91| 亚洲人妻中文高清| 欧美日韩成人在线| 图色综合网| 九九av| 啪啪啪综合| 18禁止看精品中文字幕| 亚洲第2页| 日本在线一二 | 一区在线精品中文字幕| 久久69精品久久久久久久| 国产亚洲精品第一最新| 国产女人高潮视频| 国产精品suv一区| 欧美日韩国产精品久久色婷婷| 97综合在线| 又粗又长又爽在线观看| 91Chinese在线| 久久超碰亚洲人| 亚洲影视第一页| 少妇久久| 尤物一级在线免费观看| 麻豆视频test| 色偷偷人人玩人人舔人人操人人摸人人爽 | 日本免费中文一区二区三区四区 | 欧美激情精品久久久久久| 无码一区免费在线不卡| 国产成人bd在线观看| 97精品国产97久久久| 精品中文日韩字幕视频| 欧美亚洲今日在线| 中文字幕国产| 熟妇在线视频一区二区| 国产精品天干天干综合网麻豆| 清纯唯美第一页| wwwxxx日本爽| 95人妻爽爽人人做人人澡| 亚洲AV无码久久精品蜜桃小说| 亚洲中文字幕av| 最新日日夜夜天天干干| 天天干天天拍| 色拍偷亚洲| 老熟妇乱轮| 丁香五月激情综合国产| 日韩9999| 九九九九国产| 澳门特级毛片免费观看| 久久仑合| 92久久| 中文自拍欧美影视| 国产精品网站www| 亚洲在线a| 在线观看综合精品亚洲| 在线视频五十市| 亚洲风情在线观看| wwwcaobibi| 精品176精品2| 黑人娇小av在线播放| 久久9视频| 加勒比五月天| 国产久久免费精品视频| 久久久人体| 99热精品在线观看| 大香网站| 亚洲视频一二区| 日本一区二区中文字幕久久| 97色色婷婷| 国产女主播视频在线观看| WWW啪啪的com| 中文字幕加勒比海高清无码免费视频| 久久日韩肥臀| 午夜福利免费精品视频| 青青草白白色| 日韩成人私密一级精品av| 91五月天| 夜夜无码| 中文自拍欧美影视| 色五月激情AV在线| 99久久久无码精品国产人| 黑丝91视频| 亚洲欧美日韩中文播放| 国产成人亚洲精品自产在线| 欧美日韩制服| www.国产高潮精品| 精品二区三四区五电影| 综合操逼| 超碰97在线中文| 影音先锋视频在线| 人人搡人人肉久久精品| se吧提供国产乱老熟视频胖女人| 国产精品国产自产拍高清AV| 中文字幕后石码四区五区| 九九无码| 大奶的诱惑| 天堂精品在线| 97亚洲欧美| 男人的天堂2018东京热啪啪啪| 日韩三级av片| 9九九九九视频在线观看| 性色综合网| 天天做天天爱天天高潮| 97视频免费播放| 人妻AV 中文字幕的| 99999亚洲| 淫妻综合网| 97超碰久久| 嗯啊免费视频| 婷婷色色五月天福利| 亚洲色图欧美色图制服丝袜| 亚洲男人综合| 99色日| 国产无马视频| 二级毛片| 美日韩成人| 国产一区二区在线播放| 日本不卡卡一区| 中文字幕美女91| 裸体1区| 国语av最新自产拍在线观看| 亚洲日韩97| 婷婷五月av| 天天综合~91| 欧美狠狠弄| 曰韩操B| 国产精品久久久久久9999| 国产激情片在线观看| 日日干日日摸| 老鸭窝亚洲毛片| 九九九精品成人免费视频小说| 区一二区日韩亚洲乱码av电影| 国产成人无码啪| 夜夜做夜夜爽精品视频| 狠狠穞A片一區二區三區| 久久AV无码AV| 操逼操操操91| 欧美中文字幕男人天堂久久精品| 亚州熟女乱伦| 亚州熟妇精品| 欧美99热| 又粗又长又大国产不卡| 日韩不卡码| 久久精品色欧美aⅴ一区二区| 熟妇人妻精品一区二区| 97玖玖人妻| 一区二区三区探花在线观看| 夜夜嗨一区二区三区三州加勒比 | 一区二区精品日韩欧美在线观看| 亚洲男人的天堂在线看| 久久人人爽av亚洲精品天堂桃色 | 日韩一区二区精彩视频| 综合第一页| 亚洲资源一区| 96超碰网| 91热热色| 天美传媒AV在线播放| 欧美精品91| 啊啊啊啊啊啊啊啊在线观看| 四季AV综合网址| 亚洲AV无码黄色强奸| 少妇无码999| 91撸色网 玖玖网 欧美| 国产一区二区欧美日本| 屁股久久久久久| 男人的天堂2000| 五月激情啪啪| 中文字幕AV乱伦| 亚洲操操操无码| 情色av电影| 日韩成人大片在线观看| 91福利网在线观看| 嫩草91| 久久色激情一区二区三区| 欧美日韩国产高清在线一二三区| 大香蕉中文在线| 精品国产乱码久久久兰草影视| 91大学精品激情戏| 亚洲欧美自拍偷拍| 久久69| 97爱碰| 蜜桃精品一区二区三区ww| 欧美日韩大香蕉| 99啪啪视频| 五月丁香色色网| 国产一区在线观看无码AV| 午夜毛片亚洲精品片国产久久久| 伦理弟一页| 久久99黄色卞西瓜| 秋霞一级视频在线观看免费| 色视频蜜乳| 久久久精精精| 97欧美色综合| 96爱综合| 久久麻豆一区二区| 92人人操人人| 午夜.DJ高清在线观看免费7| 综合色一区三区二区| 午夜精品久久久久久久99| 欧美一二三区四五区| 人妻久久久| 久久久久久AⅤ无码免费肉站 | 日韩人妻播放| 91精品人妻偷情| 少妇淫妇久久久久久久| 日日干夜夜骑| 精品国产72| 丰满人妻一区二区三区在线| 大香蕉五月天| 日本高清有码网址视频| ji熟女.com| 人妻天天爽天天爽三区| 综合亚洲欧美| 青青草综合在线| 久久精品91| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 亚洲情色 自拍| 色踪合AV| 伊人色综合欧美| 青青操在线亚洲视频观看欧美在线| 欧美不卡在线美女| 青青草中文-久久青草精品一区二区三 | 啊啊啊啊啊在线视频| 欧美|91色综合| 丁香六月综合激情| 亚洲欧美经典一区二区| 亚洲一区二区性爱电影| 日韩亚洲中文字幕在线| 国产乱色国产精品免费视| 国产精品久久aV| 欧美巨大性舒爽顶到了| 久操97| 老熟女91| aa片毛片| 亚洲天天操| 1区2区3区视频| 熟妇熟女一区二区三区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 久久久国产护士丝袜美腿一| 91欧美性| 97超碰总站| 4虎在线视频| 蜜臀av网址| 国产91专区| 青青草导航在线视频| q2午夜理论片夜色av| 免费国产| avav青青草久久夜| 东京热,男人的天堂| 蜜臀AV一区二区三区| 亚洲AV色图| 欧美色青| 国产在线综合福利网站| 女人与公拘交酡2020视频| 不卡中文字幕aⅴ在线| 飘花国产午夜精品不卡| 久久av一级av少妇av高潮| 亚洲高清无码在线桃色| 亚洲欧美国产其他二区| 久久性视频| 天天欧美欧美亚洲网| 1956日韩精品| 99久久综合| 色男人色天堂东京热| 国产AV线| 男人综合网| 国产一区二区二区按摩精品啪视频| 中文字幕在线免费观看2| 天天爽夜夜爽夜夜爽精| 99精品视频在线观看免费| 黄色视频特级毛片| 色色丁香| 国产suv精品一区二区四区999| 亚洲情色一区三区| 亚洲资源网| 亚洲双插| 91老熟女| 午夜福利av电影在线| 色爱三区| 久操大香蕉手机视频在线看 | 内射小黄片| 中文字幕一区电影在线观看| 国产AV高清AV无码| 狠狠操天天干| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 日本东京热加勒比久久| 蜜臀在线网站| 精品对白久久不卡| 国产精品一二三区18| 中文字幕一区二区在线日韩精品| 在线国产一区二区av| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 性在久久久久久| 亚洲欧美经典一区二区| 欧洲无码一区二区| 青青草色插素人| 少妇熟女视频一二三区| 久久久精品网站| 在线观看成人性爱免费小视频| 国产精品免费视频不卡| 日本一区二区三区精品| 中文字幕一区二区三四五区日日骚| 欧美日韩中文字幕不卡| 国产精品分类在线观看| 亚洲美女自拍偷拍视频| 九九毛片这里只有精品| 日本新免费二区三区| 91欧美网| 精品国产91av一区二区三区| 久久9视频| 有码色中文字幕在线观看| 97中文字幕一区| 欧美黄色手机在线观看| 爆操无码| 精品国产污一区二区三区| 国产精品97超碰| 精品国产乱码久久久久久日本公司| 蜜桃精品一区二区三区久在线| 高潮9999外国| 亚洲精品99999| 岛国大片在线观看网站入口| 偷拍欧美综合| 久久久久久网址| 啊啊啊想要| 日日夜夜草草草| 久久99久久99精品天美传媒棢·纸:.| 91搡老女人老妇女老熟女歌词翻译| 成人激情无码在线视频| 嗯啊不要啊在线| 九九碰九九爱97超碰| 欧美中出1| 磁力99AV| 日本二三四区| 人摸人人操人| 1204av韩国| 欧美色图中文字幕| 91国产丝袜白虎| 天天欧美| 国产人妖视频一区在线观看| 亚洲 图片 综合91| 久草毛片| 国产黄色在线播放观看| 97一区二区蜜臀| 麻豆黄站| 久久骚| 中文AV制服乱伦| 人妻中文在线| 亚洲电影91| 欧色综合| 天天操天天看| 久操国产在线| 亚洲囯产精品女人久久久| 久久超碰爱| 亚洲图片欧美另类综合免费视频大大香| 亚洲无 码A片在线观看麻豆| 激情五月天社区| 99蜜桃臀亚洲成人在线观看| 日本男人天堂| 强奸乱伦Av网| 天天插天天射| 日韩精品亚洲一二三| 78m啪啪啪| 中文自拍欧美影视| 亚洲资源网| 亚洲成人在线高清| 少妇蜜汁| 欧美日韩一干二干| 手机午夜电影神马久久| 欧美人妻另类在线| 中文字幕精品一区欧美| 欧中日成人免费影视| 国产精品福利视频| 久热免费视频| 一卡二卡三卡| 激情久久av一区av二区av| 日韩中文9| 国产精品免费日韩| 欧美人妻中出| 中文字幕精品一区欧美| 97se综合网| 日本爽爽爽爽爽爽免费视频| 亚洲熟女国产综合另类| 91国模| 长长久久免费视频| 蜜臀99精品国产高清在线观看| 亚洲第一在线视频| 亚洲中字慕不卡| 国产激情在线观看| 日本免费二区三区| 人妻22p| 欧美色97| 六月丁香啪啪啪| 亚洲成人ab| 男人的天堂亚洲| 欧美中文字幕精品人妻| 天天影视综合网欧美精品| 啊啊啊免费| 尻女朋友一夜| 欧美日韩在线视频网站| 91视频观看网站| 韩日色费| 日本久久综合| 欧美日韩性爱无码| 日韩欧美中文字亚洲慕| 国内精品伊人久久久久影院会| 亚洲影视高清第一页| 天美麻花大全视频| 人妻天堂三区| 极品五月天噜噜| 色吧5亚洲| 欧美老妇女内射网址| 可以在线观看的黄色网址| 91精品又粗又猛又爽| 国产强奸超碰AV| 东北老熟女| 亚洲国产欧美日韩人妻日中文| 五月天激情网图片| 亚洲中文字幕日产无码久久| 伊人精品久久网站| 国产和美国毛片| 韩国一级做A片免费的| 狠狠躁伊人中文字幕| 日韩精品.久久精品.AV女优.天美传媒| 亚洲久久久久| 97色97好| 青娱乐国产盛宴视频| yazhououmeizongya| 爱爱动态120秒| 免费一级性爱久久| 蜜臀无码一区二区| 超碰99在线观看|