久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

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

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

瀏覽:164日期: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 數據庫
相關文章:
主站蜘蛛池模板: 日韩欧美一区二区三区免费观看 | 久久久www成人免费精品 | 国产激情视频 | www.you日本| 欧美日韩福利 | 色av一区 | 久久九| 国产精品污www一区二区三区 | 91最新| 国产99久久精品 | 成人二区 | 亚洲第一免费网站 | 一区二区国产在线观看 | 欧美亚洲日本 | 91精品国产777在线观看 | 成人欧美一区二区三区白人 | 自拍视频在线播放 | 成人区一区二区三区 | 成人国产在线 | 99精品国产高清在线观看 | 久久久久久久成人 | 久久在线播放 | 精品亚洲一区二区三区 | 国产欧美网址 | 美女久久久 | 99国产精品99久久久久久 | 99久久精品免费 | 电影91久久久| 欧美区在线 | 久久国产精品99久久久久久老狼 | 男人电影天堂 | 天天干狠狠干 | 成人午夜视频在线观看 | 视频一区在线 | 免费精品 | 亚洲精品视频播放 | 欧美日韩中文 | 欧美在线观看一区 | 国产欧美精品一区二区 | av大片| 日韩视频区 | 高清国产午夜精品久久久久久 | 一级黄色片子看看 | 欧美日韩在线精品 | 在线欧美色 | 久久国产精品无码网站 | 韩国毛片在线 | 99久久久免费视频 | 人人澡人人草 | 欧美一区免费 | 欧美日在线| 亚洲福利一区 | 美女午夜视频 | 久久亚洲综合 | 国产精品一区在线观看 | 国产精品久久久久久久久免费丝袜 | 国产一级特黄aaa大片评分 | 中文字幕在线观看一区二区三区 | 久久免费视频在线 | 成人午夜在线 | 日韩在线 | 日本中文在线 | 国产激情视频在线观看 | 日韩在线视频观看 | 毛片日韩 | 99久久久无码国产精品 | 国产三级久久久久 | av黄色在线免费观看 | 婷婷在线免费视频 | 欧美日韩精品久久 | 成人黄色在线视频 | 免费观看毛片 | 一区二区精品在线 | 国产精品视频一区二区免费不卡 | 国产视频2021 | 亚洲不卡免费视频 | 亚洲精品一区二区网址 | av一区二区在线观看 | 精品国产天堂 | 亚洲精品福利视频 | 伊人久操 | 色综合久久久久久久久久久 | www.国产精品 | 国产综合区 | 成人综合在线观看 | www.亚洲成人网 | 亚洲精品一区二区在线 | 日韩性精品 | 国产精品免费一区二区三区四区 | 亚洲精品三级 | 久久久久久久一区 | 国产精品久久久精品 | 日本一区视频在线观看 | 中文字幕在线免费看 | 黑人精品xxx一区一二区 | 欧美日韩国产精品一区 | 激情开心成人网 | 青娱乐国产视频 | 国产精品原创av | 欧美高清一区 | 欧美日韩不卡合集视频 | 精品一区二区国产 | 黄av在线 | 欧美理论片在线观看 | 亚洲国产精品久久久久久久 | 中文字幕在线观看 | 精品国产乱码久久久久久久软件 | 女同理伦片在线观看禁男之园 | 久久久网页 | 国产98色在线 | 日韩 | 欧美日韩在线电影 | 欧美国产精品一区 | 亚洲精品日韩综合观看成人91 | 久久久精品电影 | 午夜影院a | 青青草久草在线 | 日韩电影免费在线观看中文字幕 | 国产精品1区2区 | 久久精品视频免费看 | 色鲁97精品国产亚洲 | 中文字幕在线一区 | 国产精品一区一区三区 | 日韩视频网 | 久久综合一区二区 | 青草视频在线免费观看 | 国产精品国产三级国产aⅴ原创 | 欧美在线观看一区 | 久久久欧美 | 国产精品精品 | 国产精品91久久久久 | 亚洲视频综合 | 日韩视频在线观看一区二区 | 日韩一区二区不卡 | 日韩天堂 | 亚洲网站在线免费观看 | 国产精品亚洲天堂 | 欧美精品色网 | 亚洲精品成人av | 国产午夜精品久久久久免费视高清 | 天天爽夜夜爽 | 欧美另类亚洲 | 亚洲午夜电影 | 日本中文在线 | 色综合99 | 日韩精品久久 | 日日操视频 | 国产在线视频一区二区 | 国产激情免费 | 美国特级a毛片免费网站 | 日韩久久一区二区 | 伊人av超碰久久久麻豆 | 国产成人免费视频网站高清观看视频 | 视频精品一区二区三区 | 毛片毛片毛片毛片毛片毛片 | 龙珠z中文版普通话 | 亚洲免费视频在线 | 日韩1区| 欧美色性| 91精品国产综合久久福利软件 | a在线观看 | 亚洲二区在线播放 | 不用播放器的av | 日本在线视频一区 | 中文精品在线 | 黄色一级免费看 | 国产精品久久九九 | 欧美日一区二区 | 国产精品96久久久久久久 | 欧美成人激情视频 | 99精品国产一区二区三区 | 精品在线不卡 | 国产女人和拘做受视频 | 亚洲成人精品一区 | 亚洲久久一区 | 久久精品一区二区三区四区 | 国产www视频 | 国产免费看| 亚洲视频在线播放 | 97伦理电影院 | www.男人天堂 | 欧洲亚洲精品久久久久 | 日韩中文字幕在线视频 | 久久999视频| 精品国产一区二区在线 | 亚洲第一av网站 | 久久精品视频在线播放 | 亚洲社区在线观看 | 国产在线一区二区三区 | 性大毛片视频 | 黄色大片网站 | 蜜臀网 | 日韩综合一区二区 | 黄色a在线观看 | 久久综合久久久 | 超级碰在线| 国产一区二 | 国产日韩精品视频 | 亚洲精品美女在线观看 | 亚洲免费人成在线视频观看 | 99免费在线播放99久久免费 | 一级黄色毛片免费观看 | 中文字幕日韩在线 | 99成人在线视频 | 最新av网址大全 | 中文久久 | 精品国产一区av | 五月婷婷丁香在线 | 色综合成人 | 国产一区在线不卡 | 国产午夜精品一区二区三区免费 | 国产精品美女在线观看 | 国产精品久久久久一区二区三区共 | 色综合色综合 | 色欧美片视频在线观看 | 99在线观看 | 亚洲国产精品va在线看黑人 | 国产中文在线 | 国产精品久久久久久久久久大牛 | 国产高清精 | 国产三级在线播放 | 成人免费视频网站在线看 | 欧美一区二区三区在线 | 欧美一区二区三区黄 | 免费看一区二区三区 | 久久精品欧美一区二区三区麻豆 | 国产精品一区二区三区免费视频 | 狠狠天天 | 亚洲综合一区二区三区 | 国产最新视频 | 久久福利电影 | 日韩毛片免费在线观看 | 欧美日韩在线播放 | 日韩亚洲 | 免费av在线 | 久久久久久亚洲一区二区三区蜜臀 | 一级一级一级毛片 | 国产成人影院 | 伊人网网站 | 欧美伦理电影一区二区 | 国产在线不卡 | 天天色av | 啪啪免费网站 | 欧美日韩成人在线播放 | 亚洲综合视频 | 在线播放国产精品 | 91麻豆产精品久久久久久 | 成人1区 | 国产亚洲女人久久久久毛片 | 日韩在线观看 | 草草网| 激情小说综合网 | 中文字幕一区在线观看视频 | 精品二区 | 人人人射 | 欧美中文日韩 | 欧美成人影院在线 | 久久精品国产99国产精品 | 国产一区二区三区不卡在线观看 | www.久久99 | 日本韩国欧美一区 | 免费一区 | 欧美视频精品 | 午夜大片在线观看 | 国产一区二区视频免费看 | 欧美韩日 | 国产高清第一页 | 一区二区中文 | 中文字幕在线观看亚洲 | 日日摸夜夜添夜夜添亚洲女人 | 成人情趣视频 | 中文字幕av黄色 | 国产精品亚洲精品 | 欧美日韩一区二区三区在线观看 | 久久精品免费 | 成人在线视频免费观看 | 国产精品久久久久久久久久久杏吧 | 成人国产精品免费网站 | 久久久久久久一区二区 | 国产99久久久久久免费看农村 | 人人艹人人 | 在线免费黄色小视频 | 欧美日韩亚洲视频 | 日本不卡一区二区 | 色黄视频在线观看 | 波多野结衣一区二区三区四区 | 日韩av免费在线观看 | 久久免费在线观看 | 四虎影音 | 七七婷婷婷婷精品国产 | 美女h视频| 欧美日韩一区二区三区四区 | 最新精品在线 | www.日韩系列 | 中文字幕亚洲视频 | 在线欧美一区 | 国产精品成人免费视频 | 黄色精品| 美女黄网站视频免费 | 国产精品久久久久久久久久 | 99亚洲| 久久一区二区精品 | 最新中文字幕在线 | 亚洲精品久久久狠狠狠爱 | av大片网 | 三级网址日本 | 久久99精品久久久久久噜噜 | 一级特黄毛片 | 国产v片| 日日夜夜天天干干 | 日本激情视频在线播放 | 二区在线视频 | 天天久 | 欧美日韩成人在线视频 | 在线观看91 | 国产九九在线观看 | 毛片网在线观看 | 美女张开腿视频网站免费 | 亚洲一区综合 | 日韩城人网站 | 波多野结衣一区二 | 91成人在线 | 日韩综合一区 | 成人h视频| 色婷婷av一区二区三区软件 | 成人精品一区二区三区电影黑人 | 日本一区二区精品视频 | 在线播放国产一区二区三区 | 美女又黄又免费 | 免费在线黄色电影 | 电影91久久久 | 久久一视频 | 免费黄色电影在线观看 | 欧美1区2区3区 | 欧美精品一 | aaaa网站| 韩日精品视频 | 精品视频久久久 | 亚洲成人av在线 | 99精品久久 | 91九色在线 | 亚洲视频免费观看 | 四虎视频| 毛片网站在线观看 | 久久大陆 | 国产精品久久久久久久久久久久 | 欧美成人一区二区三区片免费 | 成人黄色一级片 | 久久久久国产一区二区三区 | 国产精品久久久久久福利一牛影视 | 成人在线精品 | 国产www网站 | 成人日韩在线观看 | 99久久免费精品国产男女性高好 | 亚洲精品久久久久avwww潮水 | 欧美video| 成人天堂噜噜噜 | 亚洲成人免费网址 | 亚洲国产精品久久 | 久久男人天堂 | 成人狠狠干| 日本精品免费在线观看 | 亚洲大片免费观看 | 免费看国产片在线观看 | 亚洲精品免费观看 | 特级做a爰片毛片免费看108 | 99精品一区二区 | 亚洲一区成人在线 | 精品国产一区探花在线观看 | 久草天堂| 日韩视频免费在线观看 | 91久久久久久久久久久久久久 | 日韩婷婷 | 国产精品一区二区三区在线看 | 欧美爱爱视频 | 亚洲视频在线观看 | 日韩精品一区二区三区 | 三级成人在线 | 波多野结衣一区三区 | 久久不射电影网 | 国产精品理论电影 | 91久久精品国产亚洲a∨麻豆 | 国产精品色综合 | 亚洲伦理影院 | 亚洲精品9999 | 日韩一级免费观看 | 97久久久国产精品 | 久久伊人免费视频 | 成人午夜啪啪好大 | 精品国产欧美一区二区三区不卡 | 在线激情视频 | 欧美区亚洲区 | 欧洲毛片基地 | 亚洲一区二区三区四区五区中文 | 国产在线免费 | 91资源在线观看 | av在线精品 | cao视频| 国产日韩免费视频 | 精品成人一区 | 欧美中文字幕在线 | 亚洲欧美视频在线 | 一区二区三区影视 | 男人天堂视频在线观看 | 国产精品久久久久9999鸭 | 国产1区在线观看 | k8久久久一区二区三区 | av片免费看 | 亚洲三级在线 | 日韩在线免费电影 | 精品免费国产一区二区三区 | 久久免费黄色网址 | 久久久久久亚洲精品 | 亚洲综合在线视频 | 日韩精品在线一区 | 亚洲一区二区国产 | 黄色成人在线观看视频 | 久久久久久国产一级毛片高清版 | 久久视频免费在线 | 中文字幕亚洲一区二区va在线 | 狠狠亚洲 | 日本久久久久久 | 亚洲视频在线一区 | 久久久久国产精品一区二区 | 国产欧美日韩综合精品一 | 精品一区二区视频 | 91高清在线 | 久热亚洲 | 国产精品成人一区二区 | 中文字幕亚洲精品 | 亚洲毛片网站 | 国产成人综合在线 | 国产欧美日韩 | a毛片毛片av永久免费 | 伊人久久一区二区三区 | 成人av网站在线观看 | 五月激情综合网 | 婷婷五月在线视频 | 国内精品一区二区三区视频 | 久久三区 | 欧美久久久久久久久久久久久久 | 久久亚 | 妞干网福利视频 | 精品国产一区二区三区免费 | 天天草草草 | 一区二区在线视频 | 精品久久97 | 成人一区二区三区久久精品嫩草 | 国产欧美日韩 | 国产一区二区三区久久 | 日韩一区二区三区在线观看 | 91国在线高清视频 | 天天玩天天操天天射 | 手机亚洲第一页 | 免费毛片在线播放 | 国产在线1| 91精品国产91久久久久久最新 | 日韩午夜电影 | 精品www| 欧美八区 | 天天操天天操 | 一区二区精品 | 黄色毛片观看 | 免费在线一区二区 | 在线观看羞羞 | 成人一区二区在线 | 久久久亚洲成人 | 日韩在线视频一区 | 国产精品日韩欧美 | 国产激情网站 | 日韩欧美在线看 | 欧美成人在线网站 | 亚洲人成在线观看 | 天天操网址 | 在线色综合 | 久久久精品 | 狠狠爱天天干 | 中文字幕免费在线观看视频 | 国产91网| 中文精品在线 | 精品亚洲成人 | 国产亚洲欧美在线 | 色综合天天天天做夜夜夜夜做 | 久久蜜桃精品一区二区三区综合网 | 亚洲精品乱码久久久久久麻豆不卡 | 亚洲免费观看视频 | 黄视频网站免费观看 | 一区二区三区高清 | av在线一区二区 | 亚洲欧洲综合av | 亚洲国产天堂久久综合 | 日韩福利| 欧美亚洲国产一区二区三区 | 综合久久综合久久 | 亚洲成人一区二区三区 | 国产a免费 | 成人国产免费视频 | 中文字幕 在线观看 | 欧美一区二区三区在线视频 | 日韩中文一区 | 日本三级做a全过程在线观看 | www.日韩av.com| 亚洲第一福利视频 | 香蕉av在线 | 天堂中文字幕 | 亚洲一区二区三区四区五区午夜 | 久久韩国| 色中色综合 | 精品欧美乱码久久久久久 | 精品国产乱码久久久久久1区2区 | 999精品视频 | 99久久综合精品五月天 | 免费观看日韩一级片 | 日韩精品一区二区三区在线 | 狠狠操麻豆 | 欧美日韩一区在线 | 欧美在线亚洲 | 午夜精品亚洲日日做天天做 | 国产成人精品久久 | 少妇色欲网| 久久三区 | 国产女人爽到高潮免费视频 | 欧美久久免费 | 91精品国产综合久久精品 | 国产乱码精品一区二区三区忘忧草 | 天天爽夜夜爽夜夜爽精品视频 | 一区二区三区亚洲视频 | 啊v在线 | 中文字幕欧美在线观看 | 天天操天天插 | 91精品国产综合久久国产大片 | 午夜影院免费 | 99久久久无码国产精品 | 欧美日韩精品一区二区 | 在线观看国产视频 | 亚洲高清视频在线观看 | 青草青草久热精品视频在线观看 | 国产高清中文字幕 | 午夜精品久久久久久久 | 国内精品在线视频 | 91短视频版在线观看免费大全 | 91久久精品一区二区别 | 色精品| 色综合色综合 | 欧洲毛片 | 97国产在线视频 | 欧美精品一区二区三区中文字幕 | 国产高清久久久 | 欧美成人精品一区二区三区在线看 | 狠狠狠 | 亚州男人天堂 | 久久久精品一区 | 亚洲视频 欧美视频 | 婷婷激情在线 | 狠狠入ady亚洲精品经典电影 | 大香伊在人线免97 | 综合色爱 | 日韩国产精品一区二区三区 | 91精品久久久久久久99 | 91精品久久久久久 | 欧美电影一区 | 91麻豆精品国产91久久久更新资源速度超快 | 日韩精品一区二区三区中文在线 | 国产18av| 久久99深爱久久99精品 | 欧美在线一区二区三区 | 国产免费久久 | 色综合久久久久综合99 | 色综合99 | 欧美日韩精品一区二区在线观看 | 国产在线第一页 | 91成人短视频在线观看 | 精品久久一区二区 | 夜夜艹| 日韩欧美一区在线 | 亚洲国产精品久久久久 | 中文字幕日韩欧美一区二区三区 | 日韩精品一区二区在线观看 | 我要看一级黄色 | 欧美国产日韩在线 | 福利社午夜影院 | 电影91久久久 | 国产精品女同一区二区久久夜 | 成人99| 国产精品美女久久久久aⅴ国产馆 | 亚洲激情av | www,四虎 | 精品免费国产一区二区三区四区 | 午夜视频网站 | 久久久国产精品视频 | 国产精品亚洲视频 | 精品96久久久久久中文字幕无 | 久久国产视屏 | 成人av免费在线观看 | 色图综合 | 国产精品自产拍在线观看 | 欧美精品导航 | 91最新 | 狠狠躁夜夜躁人人爽天天高潮 | 国产wwwcom| 久久se精品一区精品二区 | 亚洲午夜精品视频 | 国产乱码精品一区二区三 | 91精品国产乱码久久久久久久久 | 国产精品毛片久久久久久 | 97精品国产| 亚洲欧美激情精品一区二区 | 中文字幕在线观看www | 国产一区二区av在线 | 91精品国产综合久久久久久蜜月 | 曰曰操 | 亚洲一区久久 | 国产精品99久久久久久动医院 | 国产九九精品视频 | 亚洲欧洲久久 | 91精品在线观看入口 |