日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

MyBatis官方代碼生成工具給力(解放雙手)

瀏覽:252日期:2023-10-20 15:35:31
摘要

在我們使用MyBatis的過程中,如果所有實體類和單表CRUD代碼都需要手寫,那將會是一件相當麻煩的事情。MyBatis官方代碼生成器MyBatis Generator可以幫助我們解決這個問題,在我的開源項目mall中也是使用的這個代碼生成器,用習慣了也挺不錯的。本文將介紹MyBatis Generator的使用方法及使用技巧,希望對大家有所幫助!

簡介

MyBatis Generator(簡稱MBG)是MyBatis官方提供的代碼生成工具。可以通過數據庫表直接生成實體類、單表CRUD代碼、mapper.xml文件,從而解放我們的雙手!

開始使用

首先我們通過一個入門示例將MBG用起來,該示例會包含基礎的CRUD操作。

集成MBG

在 pom.xml 中添加如下依賴,主要添加了MyBatis、PageHelper、Druid、MBG和MySQL驅動等依賴;

<dependencies> <!--SpringBoot整合MyBatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> <!--MyBatis分頁插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> <!--集成druid連接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <!-- MyBatis 生成器 --> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.4.0</version> </dependency> <!--Mysql數據庫驅動--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency></dependencies>

在application.yml中對數據源和MyBatis的mapper.xml文件路徑進行配置,這里做個約定,MBG生成的放在resources/com/**/mapper目錄下,自定義的放在resources/dao目錄下;

# 數據源配置spring: datasource: url: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username: root password: root# MyBatis mapper.xml路徑配置mybatis: mapper-locations: - classpath:dao/*.xml - classpath*:com/**/mapper/*.xml

添加Java配置,用于掃碼Mapper接口路徑,這里還有個約定,MBG生成的放在 mapper 包下,自定義的放在 dao 包下。

/** * MyBatis配置類 * Created by macro on 2019/4/8. */@Configuration@MapperScan({'com.macro.mall.tiny.mbg.mapper','com.macro.mall.tiny.dao'})public class MyBatisConfig {}使用代碼生成器

在使用MBG生成代碼前,我們還需要對其進行一些配置,首先在 generator.properties 文件中配置好數據庫連接信息;

jdbc.driverClass=com.mysql.cj.jdbc.Driverjdbc.connectionURL=jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaijdbc.userId=rootjdbc.password=root

然后在 generatorConfig.xml 文件中對MBG進行配置,配置屬性說明直接參考注釋即可;

<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE generatorConfiguration PUBLIC '-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN' 'http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd'><generatorConfiguration> <properties resource='generator.properties'/> <context targetRuntime='MyBatis3' defaultModelType='flat'> <property name='beginningDelimiter' value='`'/> <property name='endingDelimiter' value='`'/> <property name='javaFileEncoding' value='UTF-8'/> <!--生成mapper.xml時覆蓋原文件--> <plugin type='org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin' /> <!-- 為模型生成序列化方法--> <plugin type='org.mybatis.generator.plugins.SerializablePlugin'/> <!-- 為生成的Java模型創建一個toString方法 --> <plugin type='org.mybatis.generator.plugins.ToStringPlugin'/> <!--可以自定義生成model的代碼注釋--> <commentGenerator type='com.macro.mall.tiny.mbg.CommentGenerator'> <!-- 是否去除自動生成的注釋 true:是 : false:否 --> <property name='suppressAllComments' value='true'/> <property name='suppressDate' value='true'/> <property name='addRemarkComments' value='true'/> </commentGenerator> <!--配置數據庫連接--> <jdbcConnection driverClass='${jdbc.driverClass}' connectionURL='${jdbc.connectionURL}' userId='${jdbc.userId}' password='${jdbc.password}'> <!--解決mysql驅動升級到8.0后不生成指定數據庫代碼的問題--> <property name='nullCatalogMeansCurrent' value='true' /> </jdbcConnection> <!--指定生成model的路徑--> <javaModelGenerator targetPackage='com.macro.mall.tiny.mbg.model' targetProject='mall-tiny-generatorsrcmainjava'/> <!--指定生成mapper.xml的路徑--> <sqlMapGenerator targetPackage='com.macro.mall.tiny.mbg.mapper' targetProject='mall-tiny-generatorsrcmainresources'/> <!--指定生成mapper接口的的路徑--> <javaClientGenerator type='XMLMAPPER' targetPackage='com.macro.mall.tiny.mbg.mapper'targetProject='mall-tiny-generatorsrcmainjava'/> <!--生成全部表tableName設為%--> <table tableName='ums_admin'> <generatedKey column='id' sqlStatement='MySql' identity='true'/> </table> <table tableName='ums_role'> <generatedKey column='id' sqlStatement='MySql' identity='true'/> </table> <table tableName='ums_admin_role_relation'> <generatedKey column='id' sqlStatement='MySql' identity='true'/> </table> <table tableName='ums_resource'> <generatedKey column='id' sqlStatement='MySql' identity='true'/> </table> <table tableName='ums_resource_category'> <generatedKey column='id' sqlStatement='MySql' identity='true'/> </table> </context></generatorConfiguration>

這里值得一提的是 targetRuntime 這個屬性,設置不同的屬性生成的代碼和生成代碼的使用方式會有所不同,常用的有 MyBatis3 和 MyBatis3DynamicSql 兩種,這里使用的是 MyBatis3 ;

如果你想自定義MBG生成的代碼的話,可以自己寫一個CommentGenerator來繼承DefaultCommentGenerator,這里我自定義了實體類代碼的生成,添加了Swagger注解的支持;

package com.macro.mall.tiny.mbg;import org.mybatis.generator.api.IntrospectedColumn;import org.mybatis.generator.api.IntrospectedTable;import org.mybatis.generator.api.dom.java.CompilationUnit;import org.mybatis.generator.api.dom.java.Field;import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;import org.mybatis.generator.internal.DefaultCommentGenerator;import org.mybatis.generator.internal.util.StringUtility;import java.util.Properties;/** * 自定義注釋生成器 * Created by macro on 2018/4/26. */public class CommentGenerator extends DefaultCommentGenerator { private boolean addRemarkComments = false; private static final String EXAMPLE_SUFFIX='Example'; private static final String MAPPER_SUFFIX='Mapper'; private static final String API_MODEL_PROPERTY_FULL_CLASS_NAME='io.swagger.annotations.ApiModelProperty'; /** * 設置用戶配置的參數 */ @Override public void addConfigurationProperties(Properties properties) { super.addConfigurationProperties(properties); this.addRemarkComments = StringUtility.isTrue(properties.getProperty('addRemarkComments')); } /** * 給字段添加注釋 */ @Override public void addFieldComment(Field field, IntrospectedTable introspectedTable,IntrospectedColumn introspectedColumn) { String remarks = introspectedColumn.getRemarks(); //根據參數和備注信息判斷是否添加備注信息 if(addRemarkComments&&StringUtility.stringHasValue(remarks)){ //數據庫中特殊字符需要轉義 if(remarks.contains(''')){ remarks = remarks.replace(''','’'); } //給model的字段添加swagger注解 field.addJavaDocLine('@ApiModelProperty(value = ''+remarks+'')'); } } @Override public void addJavaFileComment(CompilationUnit compilationUnit) { super.addJavaFileComment(compilationUnit); //只在model中添加swagger注解類的導入 String fullyQualifiedName = compilationUnit.getType().getFullyQualifiedName(); if(!fullyQualifiedName.contains(MAPPER_SUFFIX)&&!fullyQualifiedName.contains(EXAMPLE_SUFFIX)){ compilationUnit.addImportedType(new FullyQualifiedJavaType(API_MODEL_PROPERTY_FULL_CLASS_NAME)); } }}

最后我們寫個Generator類用于生成代碼,直接運行main方法即可生成所有代碼;

/** * 用于生產MBG的代碼 * Created by macro on 2018/4/26. */public class Generator { public static void main(String[] args) throws Exception { //MBG 執行過程中的警告信息 List<String> warnings = new ArrayList<String>(); //當生成的代碼重復時,覆蓋原代碼 boolean overwrite = true; //讀取我們的 MBG 配置文件 InputStream is = Generator.class.getResourceAsStream('/generatorConfig.xml'); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(is); is.close(); DefaultShellCallback callback = new DefaultShellCallback(overwrite); //創建 MBG MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); //執行生成代碼 myBatisGenerator.generate(null); //輸出警告信息 for (String warning : warnings) { System.out.println(warning); } }}

一切準備就緒,執行main方法,生成代碼結構信息如下。

MyBatis官方代碼生成工具給力(解放雙手)

實現基本的CRUD操作

這里使用的是 mall-tiny 項目中權限管理功能相關表,具體可以參考 《還在從零開始搭建項目?手擼了款快速開發腳手架!》 。

查看下MBG生成的Mapper接口,發現已經包含了基本的CRUD方法,具體SQL實現也已經在mapper.xml中生成了,單表CRUD直接調用對應方法即可;

public interface UmsAdminMapper { long countByExample(UmsAdminExample example); int deleteByExample(UmsAdminExample example); int deleteByPrimaryKey(Long id); int insert(UmsAdmin record); int insertSelective(UmsAdmin record); List<UmsAdmin> selectByExample(UmsAdminExample example); UmsAdmin selectByPrimaryKey(Long id); int updateByExampleSelective(@Param('record') UmsAdmin record, @Param('example') UmsAdminExample example); int updateByExample(@Param('record') UmsAdmin record, @Param('example') UmsAdminExample example); int updateByPrimaryKeySelective(UmsAdmin record); int updateByPrimaryKey(UmsAdmin record);}

生成代碼中有一些Example類,比如UmsAdminExample,我們可以把它理解為一個條件構建器,用于構建SQL語句中的各種條件;

MyBatis官方代碼生成工具給力(解放雙手)

利用好MBG生成的代碼即可完成單表的CRUD操作了,比如下面最常見的操作。

/** * 后臺用戶管理Service實現類 * Created by macro on 2020/12/8. */@Servicepublic class UmsAdminServiceImpl implements UmsAdminService { @Autowired private UmsAdminMapper adminMapper; @Autowired private UmsAdminDao adminDao; @Override public void create(UmsAdmin entity) { adminMapper.insert(entity); } @Override public void update(UmsAdmin entity) { adminMapper.updateByPrimaryKeySelective(entity); } @Override public void delete(Long id) { adminMapper.deleteByPrimaryKey(id); } @Override public UmsAdmin select(Long id) { return adminMapper.selectByPrimaryKey(id); } @Override public List<UmsAdmin> listAll(Integer pageNum, Integer pageSize) { PageHelper.startPage(pageNum, pageSize); return adminMapper.selectByExample(new UmsAdminExample()); }}進階使用

想要用好MBG,上面的基礎操作是不夠的,還需要一些進階的使用技巧。

條件查詢

使用Example類構建查詢條件可以很方便地實現條件查詢。

這里以按用戶名和狀態查詢后臺用戶并按創建時間降序排列為例,SQL實現如下;

SELECTid,username,PASSWORD,icon,email,nick_name,note,create_time,login_time,STATUS FROMums_admin WHERE( username = ’macro’ AND STATUS IN ( 0, 1 ) ) ORDER BYcreate_time DESC;

對應的Java代碼實現如下。

/** * 后臺用戶管理Service實現類 * Created by macro on 2020/12/8. */@Servicepublic class UmsAdminServiceImpl implements UmsAdminService { @Override public List<UmsAdmin> list(Integer pageNum, Integer pageSize, String username, List<Integer> statusList) { PageHelper.startPage(pageNum, pageSize); UmsAdminExample umsAdminExample = new UmsAdminExample(); UmsAdminExample.Criteria criteria = umsAdminExample.createCriteria(); if(StrUtil.isNotEmpty(username)){ criteria.andUsernameEqualTo(username); } criteria.andStatusIn(statusList); umsAdminExample.setOrderByClause('create_time desc'); return adminMapper.selectByExample(umsAdminExample); }}子查詢

使用MBG生成的代碼并不能實現子查詢,需要自己手寫SQL實現。

這里以按角色ID查詢后臺用戶為例,首先定義一個UmsAdminDao接口,這里約定下Dao里面存放的方法都是自定義SQL實現的方法,首先在Dao接口中添加 subList 方法;

/** * Created by macro on 2020/12/9. */public interface UmsAdminDao { List<UmsAdmin> subList(@Param('roleId') Long roleId);}

然后創建一個UmsAdminDao.xml文件,對應UmsAdminDao接口的SQL實現,寫好對應的SQL實現,注意使用的resultMap MBG已經幫我們生成好了,無需自己手寫。

<select resultMap='com.macro.mall.tiny.mbg.mapper.UmsAdminMapper.BaseResultMap'> SELECT * FROM ums_admin WHERE id IN (SELECT admin_id FROM ums_admin_role_relation WHERE role_id = #{roleId})</select>Group和Join查詢

Group和Join查詢也不能使用MBG生成的代碼實現。

這里以按角色統計后臺用戶數量為例,首先在Dao接口中添加 groupList 方法;

public interface UmsAdminDao { List<RoleStatDto> groupList();}

然后在mapper.xml中添加對應的SQL實現,我們可以通過給查詢出來的列起別名,直接把列映射到resultType所定義的對象中去。

<select resultType='com.macro.mall.tiny.domain.RoleStatDto'> SELECT ur.id AS roleId, ur.NAME AS roleName, count(ua.id) AS count FROM ums_role ur LEFT JOIN ums_admin_role_relation uarr ON ur.id = uarr.role_id LEFT JOIN ums_admin ua ON uarr.admin_id = ua.id GROUP BY ur.id;</select>條件刪除

條件刪除很簡單,直接使用Example類構造刪除條件即可。

這里以按用戶名刪除后臺用戶為例,SQL實現如下;

DELETE FROMums_admin WHEREusername = ’andy’;

對應Java中的實現為。

/** * 后臺用戶管理Service實現類 * Created by macro on 2020/12/8. */@Servicepublic class UmsAdminServiceImpl implements UmsAdminService { @Override public void deleteByUsername(String username) { UmsAdminExample example = new UmsAdminExample(); example.createCriteria().andUsernameEqualTo(username); adminMapper.deleteByExample(example); }}條件修改

條件刪除很簡單,直接使用Example類構造修改條件,然后傳入修改參數即可。

這里以按指定ID修改后臺用戶的狀態為例,SQL實現如下;

UPDATE ums_admin SET STATUS = 1 WHEREid IN ( 1, 2 );

對應Java中的實現為。

/** * 后臺用戶管理Service實現類 * Created by macro on 2020/12/8. */@Servicepublic class UmsAdminServiceImpl implements UmsAdminService { @Override public void updateByIds(List<Long> ids, Integer status) { UmsAdmin record = new UmsAdmin(); record.setStatus(status); UmsAdminExample example = new UmsAdminExample(); example.createCriteria().andIdIn(ids); adminMapper.updateByExampleSelective(record,example); }}一對多查詢

一對多查詢無法直接使用MBG生成的代碼實現,需要手寫SQL實現,并使用resultMap來進行結果集映射。

這里以按ID查詢后臺用戶信息(包含對應角色列表)為例,先在Dao接口中添加 selectWithRoleList 方法;

/** * Created by macro on 2020/12/9. */public interface UmsAdminDao { AdminRoleDto selectWithRoleList(@Param('id') Long id);}

然后在mapper.xml中添加對應的SQL實現,這里有個小技巧,可以給角色表查詢出來的列取個別名,添加一個 role_ 前綴;

<select resultMap='AdminRoleResult'> SELECT ua.*, ur.id AS role_id, ur.NAME AS role_name, ur.description AS role_description, ur.create_time AS role_create_time, ur.STATUS AS role_status, ur.sort AS role_sort FROM ums_admin ua LEFT JOIN ums_admin_role_relation uarr ON ua.id = uarr.admin_id LEFT JOIN ums_role ur ON uarr.role_id = ur.id WHERE ua.id = #{id}</select>

然后定義一個叫做AdminRoleResult的ResultMap,通過collection標簽直接將以role_開頭的列映射到UmsRole對象中去即可。

<resultMap type='com.macro.mall.tiny.domain.AdminRoleDto' extends='com.macro.mall.tiny.mbg.mapper.UmsAdminMapper.BaseResultMap'> <collection property='roleList' resultMap='com.macro.mall.tiny.mbg.mapper.UmsRoleMapper.BaseResultMap' columnPrefix='role_'> </collection></resultMap>一對一查詢

一對一查詢無法直接使用MBG生成的代碼實現,需要手寫SQL實現,并使用resultMap來進行結果集映射。

這里以按ID查詢資源信息(包括分類信息)為例,先在Dao接口中添加 selectResourceWithCate 方法;

/** * Created by macro on 2020/12/9. */public interface UmsAdminDao { ResourceWithCateDto selectResourceWithCate(@Param('id')Long id);}

然后在mapper.xml中添加對應的SQL實現,可以給分類表查詢出來的列取個別名,添加一個 cate_ 前綴;

<select resultMap='ResourceWithCateResult'> SELECT ur.*, urc.id AS cate_id, urc.`name` AS cate_name, urc.create_time AS cate_create_time, urc.sort AS cate_sort FROM ums_resource ur LEFT JOIN ums_resource_category urc ON ur.category_id = urc.id WHERE ur.id = #{id}</select>

然后定義一個叫做ResourceWithCateResult的ResultMap,通過association標簽直接將以cate_開頭的列映射到UmsResourceCategory對象中去即可。

<resultMap type='com.macro.mall.tiny.domain.ResourceWithCateDto' extends='com.macro.mall.tiny.mbg.mapper.UmsResourceMapper.BaseResultMap'> <association property='resourceCategory' resultMap='com.macro.mall.tiny.mbg.mapper.UmsResourceCategoryMapper.BaseResultMap' columnPrefix='cate_'> </association></resultMap>總結

總的來說MyBatis官方代碼生成器MBG還是很強大的,可以生成一些常用的單表CRUD方法,減少了我們的工作量。但是對于子查詢、多表查詢和一些復雜查詢支持有點偏弱,依然需要在mapper.xml中手寫SQL實現。

參考資料

官方文檔:https://mybatis.org/generator/index.html

項目源碼地址

https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-generator

到此這篇關于MyBatis官方代碼生成工具給力(解放雙手)的文章就介紹到這了,更多相關MyBatis官方代碼生成工具內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Mybatis 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲丝袜美腿一区| 欧美精选视频一区二区| 久久中文字幕一区二区| 久久午夜精品| 日韩一区二区三区免费| 日韩福利视频一区| 999国产精品| 久久最新视频| 里番精品3d一二三区| 五月精品视频| 热三久草你在线| 国产精品毛片视频| 午夜亚洲福利| 亚洲欧美日韩国产一区| 99热精品久久| 精品日韩一区| 久久国产三级精品| 日韩精品欧美精品| 麻豆久久精品| 尤物tv在线精品| 国产白浆在线免费观看| 国产精品视频一区二区三区 | 老色鬼精品视频在线观看播放| 亚洲欧洲专区| 午夜精品影院| 亚洲精品在线观看91| 国产不卡精品| 美女在线视频一区| 国产精品激情| 国产精品一国产精品k频道56| 亚洲一二三区视频| 麻豆久久久久久久| 牛牛精品成人免费视频| 日韩不卡一区二区| 日韩超碰人人爽人人做人人添| 亚洲久久视频| 99国产精品| 热久久国产精品| 丝袜亚洲另类欧美| 日本大胆欧美人术艺术动态| 蜜臀91精品一区二区三区| 日韩中文字幕麻豆| 亚洲1区在线| 国产欧美自拍一区| 精品一区二区三区在线观看视频| 国产精品yjizz视频网| 香蕉成人av| 日韩精品麻豆| 欧美1级日本1级| 不卡视频在线| 日av在线不卡| 亚洲精品伦理| 国产精品白丝一区二区三区| 黄色精品视频| 999久久久精品国产| 黄色日韩在线| 日韩三级精品| 精品国内亚洲2022精品成人| 亚洲精品**中文毛片| 久久久精品日韩| 在线午夜精品| 欧美精品影院| 高清一区二区| 在线日韩中文| 久久国产高清| 国产人成精品一区二区三| 国产欧美日韩一级| 福利欧美精品在线| 国产韩日影视精品| 日本久久二区| 蜜桃成人精品| 综合在线一区| 久久精品资源| 午夜久久美女| 国产精品久久久久久av公交车| 夜鲁夜鲁夜鲁视频在线播放| 欧美手机在线| 亚洲97av| 黑森林国产精品av| 午夜在线一区二区| 欧美激情综合| 视频福利一区| 日韩精品导航| 日韩欧美不卡| 日韩精品中文字幕吗一区二区| 国产精品国产一区| 视频一区二区中文字幕| 精品一区视频| 热久久久久久久| 色乱码一区二区三区网站| 免费视频一区二区| 成午夜精品一区二区三区软件| 免费精品视频| 国产成人精品一区二区三区视频| 亚洲视频www| 亚洲免费激情| 日本成人中文字幕| 久久久久国产精品一区二区| 日本伊人午夜精品| 欧美高清不卡| 欧美国产免费| 亚洲美女久久| 亚洲国产专区校园欧美| 国产精品va视频| 三级欧美在线一区| 日韩福利一区| 97久久精品| 日本蜜桃在线观看视频| 综合激情一区| 欧美成人综合| 91青青国产在线观看精品| 亚洲一区国产| 国产精品久久久久久久免费观看| 老司机精品久久| 国产aⅴ精品一区二区四区| 亚欧洲精品视频在线观看| 日韩一区二区三区免费| 久久亚洲精品中文字幕| 日本一区二区三区中文字幕| 久久精品国产68国产精品亚洲| 国产日韩免费| 鲁大师成人一区二区三区| 秋霞影院一区二区三区 | 亚洲69av| 一区二区自拍| 精品精品国产三级a∨在线| 日韩国产欧美在线视频| 香蕉成人久久| 亚洲夜间福利| 国产精选在线| 久久精品97| 日韩精品一区第一页| 在线一区视频观看| 精品国产aⅴ| 国产精品一区亚洲| 伊人久久亚洲| 先锋亚洲精品| 在线亚洲欧美| 亚洲激情中文| 亚洲无线一线二线三线区别av| 麻豆精品视频在线观看视频| 亚洲精品乱码久久久久久蜜桃麻豆 | 美女视频黄 久久| 日韩激情精品| 亚洲人成网站在线在线观看| 国产在线成人| 在线看片国产福利你懂的| 日韩欧美中文字幕在线视频| 免费黄网站欧美| 日韩不卡一区二区| 麻豆成人在线观看| 999久久久国产精品| 亚洲午夜91| 一本综合精品| 老司机免费视频一区二区| 丝袜av一区| 蜜芽一区二区三区| 国产精品综合色区在线观看| 亚洲一区资源| 老牛影视一区二区三区| 欧美久久精品| 神马午夜久久| 日本不卡一二三区黄网| 国产成人久久精品麻豆二区| 欧美中文一区二区| 日本aⅴ精品一区二区三区 | 91日韩欧美| 噜噜噜躁狠狠躁狠狠精品视频| 国产亚洲人成a在线v网站| 日韩影院二区| 亚洲影院天堂中文av色| 久久精品国产福利| 五月婷婷亚洲| 国产精品美女午夜爽爽| 久久国产精品成人免费观看的软件| 美女日韩在线中文字幕| 欧美激情 亚洲a∨综合| 免费观看久久av| 欧美影院精品| 色爱av综合网| 欧美亚洲二区| 欧美日韩亚洲在线观看| 日本aⅴ亚洲精品中文乱码| 伊人久久国产| 日本不卡不码高清免费观看| 国产精品麻豆久久| 亚洲精品极品| 99精品一区| 国产精品nxnn| 在线亚洲成人| av最新在线| 日韩国产在线不卡视频| 久久久久久久久99精品大| 日韩欧美中文字幕在线视频| 新版的欧美在线视频| 日本aⅴ亚洲精品中文乱码| 欧美日韩中文字幕一区二区三区 | 精品视频一区二区三区在线观看| 伊人久久亚洲影院| 国产精品xx|