日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分库分表之_分库分表 + 复杂查询

發(fā)布時間:2024/1/1 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分库分表之_分库分表 + 复杂查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

代碼配置暫時和和分庫分表之_分庫分表相同。但是為了測試下面的join查詢將user表的數量調整到了和company表的數量一致,以及給company添加了一個新的字段ref_user_id

1、開始Demo

1.1、hlj-08-sharding_db_table-range_group.sql

drop database if exists ds_0; create database ds_0 character set 'utf8' collate 'utf8_general_ci'; use ds_0;drop table if exists user_0; create table `user_0` (id bigint(20) unsigned not null,city varchar(20) not null default '',name varchar(20) not null default '',age int(11) not null default 0,status int(10) not null default '0' comment '狀態(tài)',create_time datetime not null default current_timestamp comment '創(chuàng)建時間',update_time datetime not null default current_timestamp on update current_timestamp comment '修改時間',primary key (id) ) engine = innodbdefault charset = utf8;drop table if exists user_1; create table `user_1` (id bigint(20) unsigned not null,city varchar(20) not null default '',name varchar(20) not null default '',age int(11) not null default 0,status int(10) not null default '0' comment '狀態(tài)',create_time datetime not null default current_timestamp comment '創(chuàng)建時間',update_time datetime not null default current_timestamp on update current_timestamp comment '修改時間',primary key (id) ) engine = innodbdefault charset = utf8;drop table if exists company_0; create table `company_0` (id bigint(20) unsigned not null comment '主鍵',ref_user_id bigint(20) unsigned not null comment '主鍵',name varchar(20) not null default '' comment '企業(yè)名稱',company_name_english varchar(128) not null default '' comment '企業(yè)英文名稱',status int(10) not null default '0' comment '狀態(tài)',create_time datetime not null default current_timestamp comment '創(chuàng)建時間',update_time datetime not null default current_timestamp on update current_timestamp comment '修改時間',primary key (id) ) engine = innodbdefault charset = utf8;drop table if exists company_1; create table `company_1` (id bigint(20) unsigned not null comment '主鍵',ref_user_id bigint(20) unsigned not null comment '主鍵',name varchar(20) not null default '' comment '企業(yè)名稱',company_name_english varchar(128) not null default '' comment '企業(yè)英文名稱',status int(10) not null default '0' comment '狀態(tài)',create_time datetime not null default current_timestamp comment '創(chuàng)建時間',update_time datetime not null default current_timestamp on update current_timestamp comment '修改時間',primary key (id) ) engine = innodbdefault charset = utf8;CREATE TABLE `demo_entity` (id bigint(20) unsigned NOT NULL COMMENT '主鍵',`name` varchar(64) NOT NULL,`phone` varchar(20) DEFAULT '' COMMENT '手機號',`email` varchar(64) DEFAULT '' COMMENT '郵箱',`age` int(10) DEFAULT NULL,`status` varchar(8) NOT NULL COMMENT '狀態(tài)',`create_user` bigint(16) unsigned DEFAULT NULL COMMENT '創(chuàng)建人',`create_name` varchar(64) DEFAULT '' COMMENT '創(chuàng)建人名稱',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',`update_user` bigint(16) unsigned DEFAULT NULL COMMENT '更新人',`update_name` varchar(64) DEFAULT '' COMMENT '更新人名稱',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',PRIMARY KEY (id) ) ENGINE = InnoDBDEFAULT CHARSET = utf8;drop database if exists ds_1; create database ds_1 character set 'utf8' collate 'utf8_general_ci'; use ds_1;drop table if exists user_0; create table `user_0` (id bigint(20) unsigned not null,city varchar(20) not null default '',name varchar(20) not null default '',age int(11) not null default 0,status int(10) not null default '0' comment '狀態(tài)',create_time datetime not null default current_timestamp comment '創(chuàng)建時間',update_time datetime not null default current_timestamp on update current_timestamp comment '修改時間',primary key (id) ) engine = innodbdefault charset = utf8;drop table if exists user_1; create table `user_1` (id bigint(20) unsigned not null,city varchar(20) not null default '',name varchar(20) not null default '',age int(11) not null default 0,status int(10) not null default '0' comment '狀態(tài)',create_time datetime not null default current_timestamp comment '創(chuàng)建時間',update_time datetime not null default current_timestamp on update current_timestamp comment '修改時間',primary key (id) ) engine = innodbdefault charset = utf8;drop table if exists company_0; create table `company_0` (id bigint(20) unsigned not null comment '主鍵',ref_user_id bigint(20) unsigned not null comment '主鍵',name varchar(20) not null default '' comment '企業(yè)名稱',company_name_english varchar(128) not null default '' comment '企業(yè)英文名稱',status int(10) not null default '0' comment '狀態(tài)',create_time datetime not null default current_timestamp comment '創(chuàng)建時間',update_time datetime not null default current_timestamp on update current_timestamp comment '修改時間',primary key (id) ) engine = innodbdefault charset = utf8;drop table if exists company_1; create table `company_1` (id bigint(20) unsigned not null comment '主鍵',ref_user_id bigint(20) unsigned not null comment '主鍵',name varchar(20) not null default '' comment '企業(yè)名稱',company_name_english varchar(128) not null default '' comment '企業(yè)英文名稱',status int(10) not null default '0' comment '狀態(tài)',create_time datetime not null default current_timestamp comment '創(chuàng)建時間',update_time datetime not null default current_timestamp on update current_timestamp comment '修改時間',primary key (id) ) engine = innodbdefault charset = utf8;

1.1.1、數據庫圖文

1.2、依賴

<!--shardingsphere--> <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1</version> </dependency>

1.3、配置文件:application.properties

server.port=8888# 配置 mybatis的一些配置,也可以在 application.properties 中配置,如果配置了就不需要了mybatis.xml #mybatis-plus.config-location=classpath:mybatis.xml #Maven 多模塊項目的掃描路徑需以 classpath*: 開頭 (即加載多個 jar 包下的 XML 文件) mybatis-plus.mapper-locations=classpath*:mapper/*.xml mybatis-plus.type-aliases-package=com.healerjean.proj.pojo ##主鍵類型 0:"數據庫ID自增,非常大", 1:"用戶輸入ID(如果用戶不輸入,則默認是0)",2:"全局唯一ID (數字類型唯一ID)", 3:"全局唯一ID UUID"; mybatis-plus.id-type: 0 #字段策略 0:"忽略判斷",1:"非 NULL 判斷"),2:"非空判斷" mybatis-plus.field-strategy: 2 #數據庫大寫下劃線轉換 mybatis-plus.capital-mode: true mybatis-plus.refresh-mapper: true# #當遇到同樣名字的時候,是否允許覆蓋注冊 spring.main.allow-bean-definition-overriding=true # 顯示SQL spring.shardingsphere.props.sql.show=true############################## ## 分庫分表 ############################# spring.shardingsphere.datasource.names=ds0,ds1# 數據源 spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver spring.shardingsphere.datasource.ds0.url=jdbc:mysql://localhost:3306/ds_0?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true spring.shardingsphere.datasource.ds0.username=root spring.shardingsphere.datasource.ds0.password=123456spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver spring.shardingsphere.datasource.ds1.url=jdbc:mysql://localhost:3306/ds_1?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true spring.shardingsphere.datasource.ds1.username=root spring.shardingsphere.datasource.ds1.password=123456# 分庫配置 #spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=id #spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{id % 2} spring.shardingsphere.sharding.default-database-strategy.standard.sharding-column=id spring.shardingsphere.sharding.default-database-strategy.standard.precise-algorithm-class-name=com.healerjean.proj.config.datasource.CustomShardingDBAlgorithm# user company 分表 # user_0,user_1,user_2(自定義分表算法) spring.shardingsphere.sharding.tables.user.actual-data-nodes=ds$->{0..1}.user_$->{0..1} spring.shardingsphere.sharding.tables.user.table-strategy.standard.sharding-column=id spring.shardingsphere.sharding.tables.user.table-strategy.standard.precise-algorithm-class-name=com.healerjean.proj.config.datasource.CustomShardingTableAlgorithm # company_0,company_1 (inline分表策略 表達式 id%2) spring.shardingsphere.sharding.tables.company.actual-data-nodes=ds$->{0..1}.company_$->{0..1} spring.shardingsphere.sharding.tables.company.database-strategy.inline.sharding-column=ref_user_id spring.shardingsphere.sharding.tables.company.database-strategy.inline.algorithm-expression=ds${ref_user_id.longValue() % 2} spring.shardingsphere.sharding.tables.company.table-strategy.inline.sharding-column=ref_user_id spring.shardingsphere.sharding.tables.company.table-strategy.inline.algorithm-expression=company_${ref_user_id.longValue() % 2}## 默認數據源指定(不分庫的表) spring.shardingsphere.sharding.default-data-source-name=ds0

1.4、具體測試方法和類

1.4.1、實體類

1.4.1.1、User.java

@Data @Accessors(chain = true) public class User implements Serializable {private static final long serialVersionUID = 1L;/** 主鍵 */private Long id;private String name;private String city;private Integer age;private String status;private Date createTime;private Date updateTime; }

1.4.1.2、Company.java

@Data public class Company {private Long id;private Long refUserId;private String name;private String companyNameEnglish;private String status;private Date createTime;private Date updateTime; }

1.4.1.3、DemoEntity.java

@Data @Accessors(chain = true) public class DemoEntity implements Serializable {private static final long serialVersionUID = 1L;private Long id;private String name;private String phone;private String email;private Integer age;private String status;private Long createUser;private String createName;private java.util.Date createTime;private Long updateUser;private String updateName;private java.util.Date updateTime;}

1.4.1.4、新對象 UserRefCompany

@Data public class UserRefCompany {/** 主鍵 */private Long userId;private String name;private String city;private String status;private Long companyId;private String companyName;private String companyNameEnglish;private Integer avgAge;private Integer sumAge;}

1.4.2、DTO數據

1.4.2.1、UserDTO.java

@Data @Accessors(chain = true) @ApiModel(value = "demo實體類") @JsonInclude(JsonInclude.Include.NON_NULL) public class UserDTO {@ApiModelProperty(value = "主鍵", hidden = true)@JsonSerialize(using = JsonLongSerializer.class )private Long id;@ApiModelProperty(value = "姓名")@NotBlank(message = "姓名不能為空", groups = ValidateGroup.HealerJean.class)private String name;@ApiModelProperty(value = "城市")private String city;@ApiModelProperty(value = "年齡")private Integer age;@ApiModelProperty(value = "狀態(tài)", hidden = true)private String status;@ApiModelProperty(value = "創(chuàng)建時間", hidden = true)@JsonFormat(pattern = DateUtils.YYYY_MM_dd_HH_mm_ss, timezone = "GMT+8")private Date createTime;@ApiModelProperty(value = "修改時間", hidden = true)@JsonFormat(pattern = DateUtils.YYYY_MM_dd_HH_mm_ss, timezone = "GMT+8")private Date updateTime;private Integer pageNow ;private Integer pageSize ;}

1.4.2.2、CompanyDTO.java

@Data public class CompanyDTO {@JsonSerialize(using = JsonLongSerializer.class)private Long id;private Long refUserId;private String name;private String companyNameEnglish;private String status;@ApiModelProperty(value = "創(chuàng)建時間", hidden = true)@JsonFormat(pattern = DateUtils.YYYY_MM_dd_HH_mm_ss, timezone = "GMT+8")private Date createTime;@ApiModelProperty(value = "修改時間", hidden = true)@JsonFormat(pattern = DateUtils.YYYY_MM_dd_HH_mm_ss, timezone = "GMT+8")private Date updateTime; }

1.4.2.3、DemoDTO.java

@Data @Accessors(chain = true) @ApiModel(value = "demo實體類") @JsonInclude(JsonInclude.Include.NON_NULL) public class DemoDTO extends PageQuery {@JsonSerialize(using = JsonLongSerializer.class )private Long id;@ApiModelProperty(value = "姓名")@NotBlank(message = "姓名不能為空", groups = ValidateGroup.HealerJean.class)private String name;@ApiModelProperty(value = "年齡")private Integer age;@ApiModelProperty(value = "手機號")private String phone;@ApiModelProperty(value = "郵箱")private String email;@ApiModelProperty(value = "是否刪除,10可用,99刪除 ", hidden = true)private String status;@ApiModelProperty(value = "創(chuàng)建人", hidden = true)private Long createUser;@ApiModelProperty(value = "創(chuàng)建人名字", hidden = true)private String createName;@ApiModelProperty(value = "創(chuàng)建時間", hidden = true)private java.util.Date createTime;@ApiModelProperty(value = "更新人", hidden = true)private Long updateUser;@ApiModelProperty(value = "更新人名稱", hidden = true)private String updateName;@ApiModelProperty(hidden = true)private java.util.Date updateTime;}

1.4.3、Mapper

1.4.3.1、UserMapper.java

public interface UserMapper extends BaseMapper<User> {}

1.4.3.1、CompanyMapper.java

public interface CompanyMapper extends BaseMapper<Company> {}

1.4.3.1、DemoEntityMapper.java

public interface DemoEntityMapper extends BaseMapper<DemoEntity> {}

1.4.4、Service

1.4.4.1、 UserService.java

public interface UserService {UserDTO insert(UserDTO userDTO);UserDTO findById(Long id);List<UserDTO> list();}

1.4.4.2、 CompanyService.java

public interface CompanyService {CompanyDTO insert(CompanyDTO companyDTO);CompanyDTO findById(Long id);List<CompanyDTO> list(); }

1.4.4.3、 DemoEntityService.java

public interface DemoEntityService {DemoDTO insert(DemoDTO demoEntity);DemoDTO findById(Long id);List<DemoDTO> list();}

1.4.5、ServiceImpl.java

1.4.5.1、UserServiceImpl.java

@Service @Slf4j public class UserServiceImpl implements UserService {@Resourceprivate UserMapper userMapper;@Overridepublic UserDTO insert(UserDTO userDTO) {User user = BeanUtils.dtoToUserDTO(userDTO);user.setStatus(StatusEnum.生效.code);userMapper.insert(user);userDTO.setId(user.getId());return userDTO;}@Overridepublic UserDTO findById(Long id) {User user = userMapper.selectById(id);return user == null ? null : BeanUtils.userToDTO(user);}@Overridepublic List<UserDTO> list() {List<User> users = userMapper.selectList(null);List<UserDTO> list = null;if (!EmptyUtil.isEmpty(users)) {list = users.stream().map(BeanUtils::userToDTO).collect(Collectors.toList());}return list;}}

1.4.5.2、CompanyServiceImpl.java

@Service public class CompanyServiceImpl implements CompanyService {@Resourceprivate CompanyMapper companyMapper;@Overridepublic CompanyDTO insert(CompanyDTO companyDTO) {Company company = BeanUtils.dtoToCompany(companyDTO);company.setStatus(StatusEnum.生效.code);companyMapper.insert(company);companyDTO.setId(company.getId());return companyDTO;}@Overridepublic CompanyDTO findById(Long id) {Company company = companyMapper.selectById(id);return company == null ? null : BeanUtils.companyToDTO(company);}@Overridepublic List<CompanyDTO> list() {List<Company> companys = companyMapper.selectList(null);List<CompanyDTO> list = null;if (!EmptyUtil.isEmpty(companys)) {list = companys.stream().map(BeanUtils::companyToDTO).collect(Collectors.toList());}return list;} }

1.4.5.3、DemoEntityServiceImpl.java

@Service @Slf4j public class DemoEntityServiceImpl implements DemoEntityService {@Resourceprivate DemoEntityMapper demoEntityMapper;@Resourceprivate CompanyService companyService;@Resourceprivate UserService userService;@Overridepublic DemoDTO insert(DemoDTO demoDTO) {DemoEntity demoEntity = BeanUtils.dtoToDemo(demoDTO);demoEntity.setStatus(StatusEnum.生效.code);demoEntityMapper.insert(demoEntity);demoDTO.setId(demoEntity.getId());return demoDTO;}@Overridepublic DemoDTO findById(Long id) {DemoEntity demoEntity = demoEntityMapper.selectById(id);return demoEntity == null ? null : BeanUtils.demoToDTO(demoEntity);}@Overridepublic List<DemoDTO> list() {List<DemoDTO> collect = null;List<DemoEntity> list = demoEntityMapper.selectList(null);if (!EmptyUtil.isEmpty(list)) {collect = list.stream().map(BeanUtils::demoToDTO).collect(Collectors.toList());}return collect;}}

1.4.6、Controller

1.4.6.1、UserController.java

@ApiResponses(value = {@ApiResponse(code = 200, message = "訪問正常"),@ApiResponse(code = 301, message = "邏輯錯誤"),@ApiResponse(code = 500, message = "系統(tǒng)錯誤"),@ApiResponse(code = 401, message = "未認證"),@ApiResponse(code = 403, message = "禁止訪問"),@ApiResponse(code = 404, message = "url錯誤") }) @Api(description = "demo控制器") @Controller @RequestMapping("hlj/demo") @Slf4j public class UserController {@Autowiredprivate UserService userService;@ApiOperation(value = "insert",notes = "insert",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,produces = MediaType.APPLICATION_JSON_VALUE,response = UserDTO.class)@PostMapping(value = "insert", produces = "application/json; charset=utf-8")@ResponseBodypublic ResponseBean insert(UserDTO userDTO) {log.info("樣例--------mybaits-plus添加demo實體------數據信息{}", userDTO);String validate = ValidateUtils.validate(userDTO, ValidateGroup.HealerJean.class);if (!validate.equals(CommonConstants.COMMON_SUCCESS)) {throw new BusinessException(ResponseEnum.參數錯誤, validate);}return ResponseBean.buildSuccess(userService.insert(userDTO));}@ApiOperation(notes = "findById",value = "findById",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,produces = MediaType.APPLICATION_JSON_VALUE,response = UserDTO.class)@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "demo主鍵", required = true, paramType = "path", dataType = "long"),})@GetMapping("findById/{id}")@ResponseBodypublic ResponseBean findById(@PathVariable Long id) {log.info("樣例--------findById------數據:id:{}", id);return ResponseBean.buildSuccess(userService.findById(id));}@ApiOperation(notes = "list",value = "list",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,produces = MediaType.APPLICATION_JSON_VALUE,response = UserDTO.class)@GetMapping("list")@ResponseBodypublic ResponseBean list() {log.info("樣例--------list------");return ResponseBean.buildSuccess(userService.list());}}

1.4.6.2、CompanyController.java

@ApiResponses(value = {@ApiResponse(code = 200, message = "訪問正常"),@ApiResponse(code = 301, message = "邏輯錯誤"),@ApiResponse(code = 500, message = "系統(tǒng)錯誤"),@ApiResponse(code = 401, message = "未認證"),@ApiResponse(code = 403, message = "禁止訪問"),@ApiResponse(code = 404, message = "url錯誤") }) @Api(description = "demo控制器") @Controller @RequestMapping("hlj/company") @Slf4j public class CompanyController {@Autowiredprivate CompanyService companyService;@ApiOperation(value = "insert",notes = "insert",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,produces = MediaType.APPLICATION_JSON_VALUE,response = UserDTO.class)@PostMapping(value = "insert", produces = "application/json; charset=utf-8")@ResponseBodypublic ResponseBean insert(CompanyDTO companyDTO) {log.info("user--------insert------請求參數:{}", companyDTO);return ResponseBean.buildSuccess(companyService.insert(companyDTO));}@ApiOperation(notes = "findById",value = "findById",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,produces = MediaType.APPLICATION_JSON_VALUE,response = UserDTO.class)@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "demo主鍵", required = true, paramType = "path", dataType = "long"),})@GetMapping("findById/{id}")@ResponseBodypublic ResponseBean findById(@PathVariable Long id) {log.info("company--------findById------id:{}", id);return ResponseBean.buildSuccess(companyService.findById(id));}@ApiOperation(notes = "list",value = "list",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,produces = MediaType.APPLICATION_JSON_VALUE,response = UserDTO.class)@GetMapping("list")@ResponseBodypublic ResponseBean list() {log.info("company--------list------");return ResponseBean.buildSuccess(companyService.list());}}

1.4.6.3、DemoController.java

@ApiResponses(value = {@ApiResponse(code = 200, message = "訪問正常"),@ApiResponse(code = 301, message = "邏輯錯誤"),@ApiResponse(code = 500, message = "系統(tǒng)錯誤"),@ApiResponse(code = 401, message = "未認證"),@ApiResponse(code = 403, message = "禁止訪問"),@ApiResponse(code = 404, message = "url錯誤") }) @Api(description = "demo控制器") @Controller @RequestMapping("hlj/demo") @Slf4j public class DemoController {@Autowiredprivate DemoEntityService demoEntityService;@ApiOperation(value = "insert",notes = "insert",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,produces = MediaType.APPLICATION_JSON_VALUE,response = UserDTO.class)@PostMapping(value = "insert", produces = "application/json; charset=utf-8")@ResponseBodypublic ResponseBean insert(DemoDTO demoDTO) {log.info("demo--------insert------請求參數:{}", demoDTO);return ResponseBean.buildSuccess(demoEntityService.insert(demoDTO));}@ApiOperation(notes = "findById",value = "findById",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,produces = MediaType.APPLICATION_JSON_VALUE,response = UserDTO.class)@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "demo主鍵", required = true, paramType = "path", dataType = "long"),})@GetMapping("findById/{id}")@ResponseBodypublic ResponseBean findById(@PathVariable Long id) {log.info("demo--------findById------id:{}", id);return ResponseBean.buildSuccess(demoEntityService.findById(id));}@ApiOperation(notes = "list",value = "list",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,produces = MediaType.APPLICATION_JSON_VALUE,response = UserDTO.class)@GetMapping("list")@ResponseBodypublic ResponseBean list() {log.info("demo--------list------");return ResponseBean.buildSuccess(demoEntityService.list());}}

1.4.6、自定義分表算法 CustomShardingTableAlgorithm

@Slf4j public class CustomShardingTableAlgorithm implements PreciseShardingAlgorithm<Long> {@Overridepublic String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {for (String tableName : availableTargetNames) {if (tableName.endsWith(shardingValue.getValue() % 3 + "")) {log.info("表為:{}, 主鍵為:{}, 最終被分到的表為:{}", availableTargetNames, shardingValue, tableName);return tableName;}}throw new IllegalArgumentException();} }

1.4.7、自定義分庫算法:CustomShardingDBAlgorithm

@Slf4j public class CustomShardingDBAlgorithm implements PreciseShardingAlgorithm<Long> {@Overridepublic String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {for (String dbName : availableTargetNames) {if (dbName.endsWith(shardingValue.getValue() % 2 + "")) {log.info("庫為:{}, 主鍵為:{}, 最終被分到的庫為:【{}】", availableTargetNames, shardingValue, dbName);return dbName;}}throw new IllegalArgumentException();} }

2、開始測試

基本的增刪改成就不測試了,我們這里主要是測試一些分庫后可能出問題的一些語句

2.1、limit查詢:成功

2.1.1、代碼如下

2.1.1.1、UserService.java

public interface UserService {List<UserDTO> limit(UserDTO userDTO);}

2.1.1.2、UserServiceImpl.java

@Service @Slf4j public class UserServiceImpl implements UserService {/*** limit 成功*/@Overridepublic List<UserDTO> limit(UserDTO userDTO) {Wrapper<User> userWrapper = new QueryWrapper<User>().lambda().orderByDesc(User::getCreateTime).last("limit " + userDTO.getPageNow() + ", " + userDTO.getPageSize());List<User> users = userMapper.selectList(userWrapper);List<UserDTO> list = null;if (!EmptyUtil.isEmpty(users)) {list = users.stream().map(BeanUtils::userToDTO).collect(Collectors.toList());}return list;}}

2.1.1.3、UserController.java

@Controller @RequestMapping("hlj/user") @Slf4j public class UserController {@ApiOperation(notes = "limit",value = "limit",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,produces = MediaType.APPLICATION_JSON_VALUE,response = UserDTO.class)@GetMapping("limit")@ResponseBodypublic ResponseBean limit(UserDTO userDTO) {log.info("demo--------limit------");return ResponseBean.buildSuccess(userService.limit(userDTO));}}

2.1.2、訪問測試

現在所有的User表數據匯總:

namecityagecreateTime
a北京12020-03-30 18:15:14
b北京22020-03-30 18:16:14
c山西32020-03-30 18:16:20
d山西42020-03-30 18:16:27
e河北52020-03-30 18:16:38
f江蘇62020-03-30 18:16:46

2.1.2.1、訪問:pageNow:0,pageSize:2

{"success": true,"result": [{"id": "1244569246752800769","name": "f","city": "江蘇","age": 6,"status": "10","createTime": "2020-03-30 18:16:46","updateTime": "2020-03-30 18:16:46"},{"id": "1244569214813175810","name": "e","city": "河北","age": 5,"status": "10","createTime": "2020-03-30 18:16:38","updateTime": "2020-03-30 18:16:38"}],"msg": "","code": 200,"date": "1585563469572" }

控制臺sql日志

# 日志匯總 Logic SQL: SELECT id,name,city,age,status,create_time,update_time FROM user ORDER BY create_time DESC limit 0, 2 # 數據庫日志 Actual SQL: ds0 ::: SELECT id,name,city,age,status,create_time,update_time FROM user_0 ORDER BY create_time DESC limit 0, 2 ShardingSphere-SQL.log[89]Actual SQL: ds0 ::: SELECT id,name,city,age,status,create_time,update_time FROM user_1 ORDER BY create_time DESC limit 0, 2Actual SQL: ds1 ::: SELECT id,name,city,age,status,create_time,update_time FROM user_0 ORDER BY create_time DESC limit 0, 2 Actual SQL: ds1 ::: SELECT id,name,city,age,status,create_time,update_time FROM user_1 ORDER BY create_time DESC limit 0, 2

2.1.2.2、訪問:pageNow:3,pageSize:1

{"success": true,"result": [{"id": "1244569141396078594","name": "c","city": "山西","age": 3,"status": "10","createTime": "2020-03-30 18:16:20","updateTime": "2020-03-30 18:16:20"}],"msg": "","code": 200,"date": "1585563506891" }

控制臺sql日志

# 日志匯總 Actual SQL: SELECT id,name,city,age,status,create_time,update_time FROM user ORDER BY create_time DESC limit 3, 1 # 數據庫日志 Actual SQL: ds0 ::: SELECT id,name,city,age,status,create_time,update_time FROM user_0 ORDER BY create_time DESC limit 0, 4Actual SQL: ds0 ::: SELECT id,name,city,age,status,create_time,update_time FROM user_1 ORDER BY create_time DESC limit 0, 4Actual SQL: ds1 ::: SELECT id,name,city,age,status,create_time,update_time FROM user_0 ORDER BY create_time DESC limit 0, 4Actual SQL: ds1 ::: SELECT id,name,city,age,status,create_time,update_time FROM user_1 ORDER BY create_time DESC limit 0, 4

2.1.3、歸納總結:

成功,可以看到分表向每個數據庫的每個表中發(fā)送了sql語句

2.2、groupBy + 函數 :成功

2.2.1、代碼如下

2.2.1.1、UserMapper.java

public interface UserMapper extends BaseMapper<User> {List<UserRefCompany> groupByCity(); }

2.2.1.2、UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.healerjean.proj.dao.mapper.UserMapper"><select id="groupByCity" resultType="com.healerjean.proj.pojo.UserRefCompany">select city , sum(age) as sumAge, avg(age) as avgAge from user group by city</select></mapper>

2.2.1.3、UserService.java

@Service @Slf4j public class UserServiceImpl implements UserService {/*** groupBy 成功*/@Overridepublic List<UserRefCompany> group() {List<UserRefCompany> list = userMapper.groupByCity();return list;}}

2.2.1.4、UserController.java

@Controller @RequestMapping("hlj/user") @Slf4j public class UserController {@ApiOperation(notes = "group",value = "group",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,produces = MediaType.APPLICATION_JSON_VALUE,response = UserDTO.class)@GetMapping("group")@ResponseBodypublic ResponseBean group() {log.info("demo--------group------");return ResponseBean.buildSuccess(userService.group());}}

2.1.2、測試

現在所有的User表數據匯總:

namecityage
a北京1
b北京2
c山西3
d山西4
e河北5
f江蘇6

2.1.2.1、訪問測試

{"success": true,"result": [{"userId": null,"name": null,"city": "北京","status": null,"companyId": null,"companyName": null,"companyNameEnglish": null,"avgAge": 1,"sumAge": 3},{"userId": null,"name": null,"city": "山西","status": null,"companyId": null,"companyName": null,"companyNameEnglish": null,"avgAge": 3,"sumAge": 7},{"userId": null,"name": null,"city": "江蘇","status": null,"companyId": null,"companyName": null,"companyNameEnglish": null,"avgAge": 6,"sumAge": 6},{"userId": null,"name": null,"city": "河北","status": null,"companyId": null,"companyName": null,"companyNameEnglish": null,"avgAge": 5,"sumAge": 5}],"msg": "","code": 200,"date": "1585563964870" }

控制臺日志

Logic SQL: select city , sum(age) as sumAge, avg(age) as avgAge from user group by city Actual SQL: ds0 ::: select city , sum(age) as sumAge, avg(age) as avgAge , COUNT(age) AS AVG_DERIVED_COUNT_0 , SUM(age) AS AVG_DERIVED_SUM_0 from user_0 group by city ORDER BY city ASC ShardingSphere-SQL.log[89]Actual SQL: ds0 ::: select city , sum(age) as sumAge, avg(age) as avgAge , COUNT(age) AS AVG_DERIVED_COUNT_0 , SUM(age) AS AVG_DERIVED_SUM_0 from user_1 group by city ORDER BY city ASC Actual SQL: ds1 ::: select city , sum(age) as sumAge, avg(age) as avgAge , COUNT(age) AS AVG_DERIVED_COUNT_0 , SUM(age) AS AVG_DERIVED_SUM_0 from user_0 group by city ORDER BY city ASC Actual SQL: ds1 ::: select city , sum(age) as sumAge, avg(age) as avgAge , COUNT(age) AS AVG_DERIVED_COUNT_0 , SUM(age) AS AVG_DERIVED_SUM_0 from user_1 group by city ORDER BY city ASC

2.1.3、歸納總結:

成功,可以看到分表向每個數據庫的每個表中發(fā)送了sql語句 (取出數據后,自動講里面獲取的數字進行計算)

2.3、between and :成功

2.3.1、代碼如下

2.3.1.1、UserService.java

public interface UserService {List<UserDTO> between();}

2.3.1.2、UserServiceImpl.java

@Service @Slf4j public class UserServiceImpl implements UserService {/*** between 成功*/@Overridepublic List<UserDTO> between() {Wrapper<User> userWrapper = new QueryWrapper<User>().lambda().between(User::getAge, 1, 3).orderByDesc(User::getCreateTime);List<User> users = userMapper.selectList(userWrapper);List<UserDTO> list = null;if (!EmptyUtil.isEmpty(users)) {list = users.stream().map(BeanUtils::userToDTO).collect(Collectors.toList());}return list;}}

2.3.1.3、UserController.java

@Controller @RequestMapping("hlj/user") @Slf4j public class UserController {@ApiOperation(notes = "between",value = "group",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,produces = MediaType.APPLICATION_JSON_VALUE,response = UserDTO.class)@GetMapping("between")@ResponseBodypublic ResponseBean between() {log.info("demo--------between------");return ResponseBean.buildSuccess(userService.between());}}

2.3.2、測試

現在所有的User表數據匯總:

namecityagecreateTime
a北京12020-03-30 18:15:14
b北京22020-03-30 18:16:14
c山西32020-03-30 18:16:20
d山西42020-03-30 18:16:27
e河北52020-03-30 18:16:38
f江蘇62020-03-30 18:16:46

2.3.2.1、訪問測試 :between 1 and 3 orderby createTime desc

{"success": true,"result": [{"id": "1244569141396078594","name": "c","city": "山西","age": 3,"status": "10","createTime": "2020-03-30 18:16:20","updateTime": "2020-03-30 18:16:20"},{"id": "1244569114653196290","name": "b","city": "北京","age": 2,"status": "10","createTime": "2020-03-30 18:16:14","updateTime": "2020-03-30 18:16:14"},{"id": "1244568862747492353","name": "a","city": "北京","age": 1,"status": "10","createTime": "2020-03-30 18:15:14","updateTime": "2020-03-30 18:15:14"}],"msg": "","code": 200,"date": "1585564394319" }

2.3.3、歸納總結:

成功,可以看到分表向每個數據庫的每個表中發(fā)送了sql語句

2.2、left join: 連接查詢

2.2.1、代碼如下

2.2.1.1、UserMapper.java

public interface UserMapper extends BaseMapper<User> {List<UserRefCompany> leftJoin();}

2.2.1.2、UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.healerjean.proj.dao.mapper.UserMapper"><select id="leftJoin" resultType="com.healerjean.proj.pojo.UserRefCompany">select u.id,u.name ,c.id as companyId,c.name as companyName,c.ref_user_id as refUserId,c.company_name_english as companyNameEnglishfrom user u left join company c on u.id = c .ref_user_id order by u.create_time</select></mapper>

2.2.1.3、UserService.java

@Service @Slf4j public class UserServiceImpl implements UserService {/*** left join 設置了綁定關系后成功*/@Overridepublic List<UserRefCompany> leftJoin() {List<UserRefCompany> userRefCompanies = userMapper.leftJoin();return userRefCompanies;}}

2.2.1.4、UserController.java

@Controller @RequestMapping("hlj/user") @Slf4j public class UserController {@ApiOperation(notes = "leftJoin",value = "leftJoin",consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,produces = MediaType.APPLICATION_JSON_VALUE,response = UserDTO.class)@GetMapping("leftJoin")@ResponseBodypublic ResponseBean leftJoin() {log.info("demo--------leftJoin------");return ResponseBean.buildSuccess( userService.leftJoin());}}

2.2.2、訪問測試:

現在所有的User表數據匯總:

idnamecityage
1244568862747492353a北京1
1244569114653196290b北京2
1244569141396078594c山西3
1244569167870525442d山西4
1244569214813175810e河北5
1244569246752800769f江蘇6

現在所有的company表數據匯總、添加這個數據的時候,其實我們已經做了一些小動作了,company表的分庫分表是按照ref_user_id進行分庫的(和user表中id的分庫策略一致),這樣就保證了后面綁定關系之后查詢的成功

idref_user_idnamecompany_name_englishcreate_time
12445756321821818891244568862747492353北京小米有限公司xiaomi2020-03-30 18:42:08
12445756925088563211244569114653196290北京字節(jié)跳動zijie2020-03-30 18:42:22
12445757549159055381244569141396078594山西愛酷科技Iku2020-03-30 18:42:37
12445758171677655061244569214813175810河北騰訊tecent2020-03-30 18:42:52

2.2.2.1、默認失敗

{"success": true,"result": [{"userId": null,"name": "a","city": null,"status": null,"companyId": 1244585691742093300,"companyName": "北京小米有限公司","companyNameEnglish": "xiaomi","avgAge": null,"sumAge": null},{"userId": null,"name": "a","city": null,"status": null,"companyId": null,"companyName": null,"companyNameEnglish": null,"avgAge": null,"sumAge": null},{"userId": null,"name": "b","city": null,"status": null,"companyId": 1244585869291176000,"companyName": "北京字節(jié)跳動","companyNameEnglish": "zijie","avgAge": null,"sumAge": null},{"userId": null,"name": "b","city": null,"status": null,"companyId": null,"companyName": null,"companyNameEnglish": null,"avgAge": null,"sumAge": null},{"userId": null,"name": "c","city": null,"status": null,"companyId": 1244585918465196000,"companyName": "山西愛酷科技","companyNameEnglish": "Iku","avgAge": null,"sumAge": null},{"userId": null,"name": "c","city": null,"status": null,"companyId": null,"companyName": null,"companyNameEnglish": null,"avgAge": null,"sumAge": null},{"userId": null,"name": "d","city": null,"status": null,"companyId": null,"companyName": null,"companyNameEnglish": null,"avgAge": null,"sumAge": null},{"userId": null,"name": "d","city": null,"status": null,"companyId": null,"companyName": null,"companyNameEnglish": null,"avgAge": null,"sumAge": null},{"userId": null,"name": "e","city": null,"status": null,"companyId": 1244585970768167000,"companyName": "河北騰訊","companyNameEnglish": "tecent","avgAge": null,"sumAge": null},{"userId": null,"name": "e","city": null,"status": null,"companyId": null,"companyName": null,"companyNameEnglish": null,"avgAge": null,"sumAge": null},{"userId": null,"name": "f","city": null,"status": null,"companyId": null,"companyName": null,"companyNameEnglish": null,"avgAge": null,"sumAge": null},{"userId": null,"name": "f","city": null,"status": null,"companyId": null,"companyName": null,"companyNameEnglish": null,"avgAge": null,"sumAge": null}],"msg": "","code": 200,"date": "1585567537634" } Response Code

控制臺日志(整理了下),可以看到下面的查詢類似于卡迪爾積,每個x和每個y數組里面的分別join了一次,所以導致了錯誤的出現,

要查詢的結果 Logic SQL: select u.id,u.name ,c.id as companyId,c.name as companyName,c.ref_user_id as refUserId,c.company_name_english as companyNameEnglishfrom user uleft join company c on u.id = c .ref_user_id ShardingSphere-SQL.log[89]分庫查詢 Actual SQL: ds0 ::: select ^^^ from user_1 u left join company_1 c on u.id = c .ref_user_id select ^^^ from user_1 u left join company_0 c on u.id = c .ref_user_id select ^^^ from user_0 u left join company_1 c on u.id = c .ref_user_id select ^^^ from user_0 u left join company_0 c on u.id = c .ref_user_id Actual SQL: ds1 ::: select ^^^ from user_1 u left join company_1 c on u.id = c .ref_user_id select ^^^ from user_1 u left join company_0 c on u.id = c .ref_user_id select ^^^ from user_0 u left join company_1 c on u.id = c .ref_user_id select ^^^ from user_0 u left join company_0 c on u.id = c .ref_user_id

2.2.3、配置user和company的綁定關系 :成功

如果要保證一對一的表關系,必須保證2點

1、user和company的表數量以及所在節(jié)點要完全一模一樣

2、從表的的外鍵規(guī)則和主表的外鍵分庫分表策略要一直

# user company 分表 # user_0,user_1,user_2(自定義分表算法) spring.shardingsphere.sharding.tables.user.actual-data-nodes=ds$->{0..1}.user_$->{0..1} spring.shardingsphere.sharding.tables.user.table-strategy.standard.sharding-column=id spring.shardingsphere.sharding.tables.user.table-strategy.standard.precise-algorithm-class-name=com.healerjean.proj.config.datasource.CustomShardingTableAlgorithm # company_0,company_1 (inline分表策略 表達式 id%2) spring.shardingsphere.sharding.tables.company.actual-data-nodes=ds$->{0..1}.company_$->{0..1} spring.shardingsphere.sharding.tables.company.database-strategy.inline.sharding-column=ref_user_id spring.shardingsphere.sharding.tables.company.database-strategy.inline.algorithm-expression=ds${ref_user_id.longValue() % 2} spring.shardingsphere.sharding.tables.company.table-strategy.inline.sharding-column=ref_user_id spring.shardingsphere.sharding.tables.company.table-strategy.inline.algorithm-expression=company_${ref_user_id.longValue() % 2}# 綁定表規(guī)則列表 spring.shardingsphere.sharding.binding-tables[0]=user,company

2.2.3.1、訪問測試

{"success": true,"result": [{"userId": null,"name": "a","city": null,"status": null,"companyId": 1244585691742093300,"companyName": "北京小米有限公司","companyNameEnglish": "xiaomi","avgAge": null,"sumAge": null},{"userId": null,"name": "b","city": null,"status": null,"companyId": 1244585869291176000,"companyName": "北京字節(jié)跳動","companyNameEnglish": "zijie","avgAge": null,"sumAge": null},{"userId": null,"name": "c","city": null,"status": null,"companyId": 1244585918465196000,"companyName": "山西愛酷科技","companyNameEnglish": "Iku","avgAge": null,"sumAge": null},{"userId": null,"name": "d","city": null,"status": null,"companyId": null,"companyName": null,"companyNameEnglish": null,"avgAge": null,"sumAge": null},{"userId": null,"name": "e","city": null,"status": null,"companyId": 1244585970768167000,"companyName": "河北騰訊","companyNameEnglish": "tecent","avgAge": null,"sumAge": null},{"userId": null,"name": "f","city": null,"status": null,"companyId": null,"companyName": null,"companyNameEnglish": null,"avgAge": null,"sumAge": null}],"msg": "","code": 200,"date": "1585567592799" }

控制臺日志

要查詢的結果 Logic SQL: select u.id,u.name ,c.id as companyId,c.name as companyName,c.ref_user_id as refUserId,c.company_name_english as companyNameEnglishfrom user uleft join company c on u.id = c .ref_user_id ShardingSphere-SQL.log[89]分庫查詢 Actual SQL: ds0 ::: select ^^^ from user_1 u left join company_1 c on u.id = c .ref_user_id select ^^^ from user_0 u left join company_0 c on u.id = c .ref_user_id Actual SQL: ds1 ::: select ^^^ from user_1 u left join company_1 c on u.id = c .ref_user_id select ^^^ from user_0 u left join company_0 c on u.id = c .ref_user_id

2.3、默認數據源,配合數據源看

默認數據源指定(不分庫的表)

默認數據源指定(不分庫的表) spring.shardingsphere.sharding.default-data-source-name=ds0

2.4、配置廣播表

為了防止跨庫查,可以將那些永遠不會改變的表。在每個庫中復制一份。一般適用于配置類的數據,(如果插入數據,會向所有的數據庫同時進行插入)

# 配置廣播表(為了防止跨庫查,可以將那些永遠不會改變的表。在每個庫中復制一份。一般適用于配置類的數據,(如果插入數據,會向所有的數據庫同時進行插入) spring.shardingsphere.sharding.broadcast-tables=demo_entity

總結

以上是生活随笔為你收集整理的分库分表之_分库分表 + 复杂查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

91免费的视频在线播放 | 日韩免费在线观看视频 | 国产精品美女久久 | 久久久国产精品亚洲一区 | 久久成年人视频 | 国产精品美女久久久网av | 夜夜躁狠狠躁日日躁 | 成人免费观看网址 | 国产精品一区二区三区视频免费 | 激情久久一区二区三区 | 午夜在线日韩 | 国产中文字幕av | 在线观看黄污 | 色大片免费看 | 久影院 | 久草在线电影网 | www.色婷婷 | 成 人 黄 色视频免费播放 | 黄色av在 | 国产精品一区久久久久 | 亚洲精品色视频 | 日韩xxx视频 | 又爽又黄又刺激的视频 | 性色av免费在线观看 | 日韩激情在线视频 | 最新av网址大全 | av综合 日韩| 亚洲精品456在线播放第一页 | 色天天综合久久久久综合片 | 91九色最新 | 欧美亚洲国产日韩 | 黄色毛片在线观看 | 在线视频福利 | 狠狠躁日日躁 | 91九色丨porny丨丰满6 | 婷婷色网 | 免费看国产曰批40分钟 | 久久电影网站中文字幕 | 久久久久久久久久久久久久免费看 | 精品999在线观看 | 国产96精品 | 亚洲欧美日韩一级 | 天天操天天草 | 精品夜夜嗨av一区二区三区 | 亚洲专区欧美 | 国产在线2020 | 四虎国产精品成人免费影视 | 久久9999久久 | 久久久久久久久久久福利 | 天天草天天操 | 少妇搡bbbb搡bbb搡忠贞 | 中文字幕影片免费在线观看 | 国产精品激情偷乱一区二区∴ | 国产视频1区2区 | 国产日本三级 | 亚洲视频 在线观看 | 日韩国产欧美在线视频 | 蜜臀av免费一区二区三区 | 91精品国产欧美一区二区 | 国产黄色观看 | 97色国产 | 国产一区二区免费在线观看 | 日韩一区视频在线 | 欧美视频日韩视频 | 婷婷久久丁香 | 国际精品久久 | 精品在线小视频 | 麻豆精品91 | 亚洲一区二区高潮无套美女 | 五月天婷婷免费视频 | 国产精品理论片在线播放 | 成人免费中文字幕 | 色全色在线资源网 | 欧美在线一二 | 人人爱人人舔 | 97人人爽人人 | 精品亚洲视频在线观看 | 天天在线视频色 | 亚州视频在线 | 国产高清免费在线观看 | 久久国产福利 | 精品免费久久久久 | 激情五月激情综合网 | 国产成人综合图片 | 国际精品网 | 久久国产品 | 天天综合视频在线观看 | 日韩电影一区二区在线 | 国产欧美精品一区二区三区四区 | 日夜夜精品视频 | 91九色国产 | 在线观看免费黄视频 | 亚洲综合欧美日韩狠狠色 | 天堂素人在线 | 国产精品一码二码三码在线 | 国产精品密入口果冻 | 2024国产在线 | 久久久www免费电影网 | 99免费在线观看 | 日韩免费在线观看网站 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 国内久久久久久 | 蜜臀久久99静品久久久久久 | 久久精品国产一区 | 国产精品国产亚洲精品看不卡15 | 日批在线观看 | 欧美一级免费片 | 在线观看视频在线 | 国产一级大片在线观看 | 人人爽人人爽人人片 | 国产免费成人 | 狠狠操狠狠干2017 | 国产成人精品日本亚洲999 | 婷婷视频在线播放 | 国产精品99久久久久久有的能看 | 久久理论电影网 | 亚洲视频大全 | 国产精品久久久久久久久久妇女 | 91成人短视频在线观看 | 97电影网手机版 | 国产亚洲精品久久19p | 日日草视频 | 91porny九色91啦中文 | 国产视频18 | 国产高清久久久久 | 成人资源网 | 99在线热播 | 国产一级一级国产 | 三级黄色a| 欧美一级片在线 | 久草电影免费在线观看 | 久久激情视频免费观看 | 国产色啪 | 欧美综合久久 | 久久精品日韩 | 在线视频日韩欧美 | 99久久久国产免费 | 日韩在线观看 | 91成人在线视频观看 | 日韩在线视频线视频免费网站 | 久香蕉 | 免费成人av在线看 | 日本最新高清不卡中文字幕 | 欧美激情片在线观看 | 欧美另类xxxxx | 免费av网站在线看 | 亚洲精品玖玖玖av在线看 | 久久久精品国产一区二区电影四季 | 国产999精品久久久影片官网 | 99久久精品国产系列 | 欧美日韩中文在线观看 | 国产一级久久 | 国产亚洲永久域名 | 久久久久成 | 91精品久 | 干干干操操操 | 91精品国产综合久久婷婷香蕉 | 久久这里只有精品久久 | 激情开心 | 色综合国产 | 国产九九九九九 | 亚洲一二视频 | 天天干天天做天天操 | 日韩av黄 | 天天射天天色天天干 | 色婷婷av一区二 | 天堂av观看 | 国产精品嫩草69影院 | av大全免费在线观看 | 国产精品入口传媒 | 午夜丁香网 | 免费色婷婷 | 国产高h视频 | 久久精品一区二区三区四区 | 久草在线手机视频 | 草久中文字幕 | 99爱国产精品 | 岛国片在线| 国产中的精品av小宝探花 | 91在线免费观看网站 | 99中文字幕视频 | 99热这里只有精品久久 | 激情综合国产 | www.玖玖玖| 九九热1 | 青春草视频在线播放 | 美女网站色免费 | 国产天天爽 | 久久综合给合久久狠狠色 | 国产91电影在线观看 | 激情小说久久 | 在线日韩亚洲 | 在线免费中文字幕 | 在线看v片 | 草久久av | 日韩欧美成人网 | 国产成人av免费在线观看 | 日本狠狠色 | 国产成人精品午夜在线播放 | 久久爱992xxoo| 久久理论片 | 日韩一二三在线 | 99亚洲国产精品 | 亚洲免费在线播放视频 | 一区电影 | 亚洲视频一 | 久久av在线 | 天天综合网 天天综合色 | 亚洲国产精品一区二区久久hs | 中文字幕高清视频 | 午夜久久影视 | 91精品国产高清 | 亚洲国产中文字幕 | 欧美日韩二区三区 | 婷婷在线看 | 国产精品毛片网 | 视频在线观看91 | 国产在线播放一区二区 | 国产一卡久久电影永久 | 亚洲精品国产麻豆 | 伊人天堂av | 81国产精品久久久久久久久久 | 999久久a精品合区久久久 | 欧美九九视频 | 国模精品一区二区三区 | 这里只有精品视频在线观看 | 国产精品区二区三区日本 | 久久精品在线免费观看 | 在线精品在线 | 亚洲aⅴ乱码精品成人区 | 91在线免费公开视频 | av在线免费网站 | 婷婷久久精品 | 99久久久久国产精品免费 | 免费在线观看黄网站 | 不卡的av | 五月婷婷网站 | 欧美va天堂va视频va在线 | 九色porny真实丨国产18 | 欧美日韩另类在线观看 | 91亚洲在线观看 | 亚洲欧美视频一区二区三区 | 国产理论影院 | 东方av在线免费观看 | 日韩精品91偷拍在线观看 | 国产麻豆精品传媒av国产下载 | 操高跟美女| 久久精品一区二区三区国产主播 | 国产又粗又猛又色又黄网站 | 中文字幕电影一区 | 欧美黑人性爽 | 亚洲成人精品国产 | 一级黄色a视频 | 欧美中文字幕第一页 | 少妇bbb搡bbbb搡bbbb′ | 99热手机在线观看 | 97成人精品视频在线播放 | 亚洲女同ⅹxx女同tv | 一区二区三区高清在线观看 | 尤物九九久久国产精品的分类 | 婷婷色狠狠 | 色资源在线 | 成人播放器| 色婷婷电影 | 亚在线播放中文视频 | 午夜99| 欧美一级片在线播放 | 国产日韩亚洲 | 国产一区二区在线免费 | 91精品视频在线观看免费 | 最近高清中文字幕 | 丁香综合网 | 伊甸园永久入口www 99热 精品在线 | 国产精品videossex国产高清 | 中文字幕久久久精品 | 欧美激情精品久久久久久免费印度 | 成人在线免费观看视视频 | 97精品国产97久久久久久粉红 | 欧美日韩三级 | 欧美日韩中文字幕在线视频 | 99精品在线看 | 国产一区二区三区在线 | 夜夜躁日日躁狠狠久久av | 在线成人观看 | 99国产精品久久久久老师 | 亚洲欧美视频一区二区三区 | 综合色站| 久久久久久久久久伊人 | 天天操天天色天天射 | 日韩免费成人av | 久久免费av电影 | 波多野结衣在线播放一区 | 欧美日韩在线精品一区二区 | a天堂中文在线 | 亚洲视频资源在线 | 国产成人三级一区二区在线观看一 | 国产精品一区二区在线播放 | 久久久久久久久久久电影 | 欧美精品亚洲二区 | 在线观看中文字幕一区二区 | 免费日韩av片 | 中文字幕中文字幕在线中文字幕三区 | 成年人在线视频观看 | 五月婷婷丁香在线观看 | 国产成人精品福利 | 欧美日韩中文在线 | 四虎成人免费影院 | 免费成人黄色av | 天天天天天天天天操 | 91免费观看网站 | 国产亚洲视频中文字幕视频 | 日韩久久精品一区二区三区下载 | 欧美一区二区三区免费观看 | 久久资源在线 | 激情综合网色播五月 | 免费高清男女打扑克视频 | 久久黄色美女 | 天天操夜夜想 | 丰满少妇在线观看网站 | 激情视频一区二区三区 | 久久精品综合一区 | www.69xx| 国产亚洲精品女人久久久久久 | 久章操 | 黄色成人在线观看 | 亚洲精品午夜aaa久久久 | 久久综合狠狠综合久久激情 | 黄色特级毛片 | 青青五月天 | 在线视频区 | 性色av香蕉一区二区 | 久草网站| 久久久久久久久免费 | 国产xxxx| 天天射综合网视频 | 天天爽夜夜爽精品视频婷婷 | 青青看片 | 久久精品—区二区三区 | 999亚洲国产996395 | 在线观看免费视频你懂的 | 91在线看视频 | 日本xxxx.com| 日本3级在线观看 | 国产精品久久一区二区无卡 | 成人免费视频观看 | 高清不卡一区二区在线 | 五月色婷 | 一区二区免费不卡在线 | 婷婷丁香综合 | 亚洲国产成人精品在线观看 | 色天天中文 | 久久欧美精品 | 精品影院一区二区久久久 | 91精品久久久久 | 色噜噜狠狠色综合中国 | 日韩欧美一区二区在线播放 | 亚洲另类久久 | 国产精品一区免费在线观看 | 天天干天天摸天天操 | 99久久999久久久精玫瑰 | 亚洲精品美女视频 | 一区二区精品国产 | 男女激情片在线观看 | 天天射天天色天天干 | 久草在线99 | 欧美精品小视频 | 亚洲一级特黄 | 天天做日日爱夜夜爽 | 日韩视频一区二区在线 | 欧美日韩激情视频8区 | 91最新网址| 97视频在线播放 | 99视频在线观看一区三区 | 天天爽夜夜爽人人爽一区二区 | 日本mv大片欧洲mv大片 | 啪啪精品 | 日韩在线观看a | 激情 亚洲| 午夜精品三区 | 在线一区二区三区 | 亚洲国产成人在线播放 | 丁香花在线视频观看免费 | 欧美日韩精 | 久久综合五月天婷婷伊人 | 最近2019中文免费高清视频观看www99 | www.天天射.com | 伊人影院在线观看 | av免费看在线 | 国产精品毛片一区二区在线看 | 草久中文字幕 | av电影中文 | 一区二区三区免费在线观看视频 | 欧美日韩中字 | 色就是色综合 | 久久久午夜精品理论片中文字幕 | 国产欧美精品一区二区三区四区 | 色综合久久久久综合99 | 一区二区毛片 | 国产伦理久久精品久久久久_ | 五月婷婷国产 | 国产免码va在线观看免费 | 亚洲精品白浆高清久久久久久 | 成人在线一区二区 | 黄色一级在线视频 | 成人av手机在线 | 四虎成人网 | 日韩91精品 | 99热在线免费观看 | 欧美性精品 | 免费看在线看www777 | 国产精品午夜av | 久久综合中文字幕 | 国产亚洲精品久久 | 久久久久久久久久久久电影 | 91久久奴性调教 | 国产黄| 国产高清不卡在线 | 国产成人久久 | 91综合在线| 美女亚洲精品 | 国产理论一区二区三区 | 香蕉视频国产在线观看 | 日本在线成人 | 就要色综合 | 日韩欧美在线视频一区二区三区 | 国产精品二区在线 | 狠狠激情中文字幕 | 久久综合九色九九 | 国产精品一区免费看8c0m | 久久婷婷丁香 | 成人午夜电影久久影院 | 亚洲欧洲一区二区在线观看 | 97在线观看 | 99热播精品 | 黄色av免费看 | 久久久精品久久日韩一区综合 | 国产欧美综合在线观看 | 日本中文一区二区 | 天天干天天色2020 | 国产成人99久久亚洲综合精品 | 亚洲电影影音先锋 | 99久国产| 色妞色视频一区二区三区四区 | av亚洲产国偷v产偷v自拍小说 | 亚洲视频久久久久 | 嫩草伊人久久精品少妇av | 久久精品直播 | 亚洲精品国精品久久99热 | 97成人在线观看 | 中文字幕人成不卡一区 | 黄色亚洲在线 | 国产99久久久国产精品免费二区 | 亚洲精品大全 | 最新av在线网址 | 91桃色视频| 亚洲成人精品 | 91福利视频一区 | 久久精品国产免费看久久精品 | 天天天干夜夜夜操 | 日韩黄色av网站 | 国产馆在线播放 | 操久| 人人爱人人做人人爽 | 夜夜操网站 | 亚洲1区在线 | 在线日韩 | 天天操天天操天天操天天 | 欧美先锋影音 | 色吊丝在线永久观看最新版本 | 国产精品久久久久久久久久久久 | 国产高清av| 中文字幕国产一区二区 | 69av在线视频| 摸bbb搡bbb搡bbbb| 波多野结衣一区二区三区中文字幕 | 97在线免费视频观看 | 日本一区二区免费在线观看 | 又色又爽又黄高潮的免费视频 | 狠狠的操狠狠的干 | 日韩欧美在线影院 | 97人人超| 久久国产亚洲精品 | 国产资源中文字幕 | 国产高清免费 | 成人在线视频在线观看 | 精品在线一区二区 | 欧美男同网站 | 久久久国产精品成人免费 | 日韩大片在线观看 | 久久久久久久精 | 精品亚洲网 | 99精品国产成人一区二区 | 九九免费视频 | 久久看免费视频 | 射久久 | 中文字幕字幕中文 | 国内外成人免费在线视频 | 成人免费视频免费观看 | 免费观看久久久 | 色综合天天 | 久久久高清免费视频 | 91在线播放综合 | 最新日韩视频 | 国产福利一区二区在线 | 亚洲国产精品成人综合 | 中文字幕在线观看2018 | 国产精品99久久99久久久二8 | 色婷婷国产精品 | 久久国产99| 天天色天天干天天 | av中文字幕免费在线观看 | 2021久久 | 精品日韩中文字幕 | 人人爽人人澡人人添人人人人 | 免费av的网站 | 中文字幕在线视频网站 | 一区二区 不卡 | 99精品视频在线播放免费 | 在线观看中文字幕第一页 | 日韩成人免费在线观看 | www.色午夜.com | 在线免费观看视频一区二区三区 | 久久久免费视频播放 | 91在线资源 | 午夜婷婷在线播放 | 美女免费黄视频网站 | 在线免费中文字幕 | 69精品久久久 | 久久免费av | 欧美日韩天堂 | av成人资源 | 国产一级免费观看视频 | 成人在线播放网站 | 久久久久久久99 | 亚洲精品国产精品国自产 | 欧美va天堂va视频va在线 | 国产美女视频 | 97精品久久 | av电影 一区二区 | 日韩免 | 在线成人免费 | 亚洲国产免费 | 成人黄大片视频在线观看 | a级片韩国 | 在线观看免费版高清版 | 成年在线观看 | 中文av字幕在线观看 | 久草国产在线观看 | www最近高清中文国语在线观看 | 午夜影院日本 | 91精品久 | 国产不卡免费视频 | 亚洲视频在线免费看 | 成人18视频 | 色婷婷视频在线 | 91人人澡人人爽 | 在线视频一二三 | 日本少妇高清做爰视频 | 久久精品国产成人精品 | 91视频免费网址 | 五月天丁香亚洲 | 婷婷色网视频在线播放 | 亚洲国产99 | 精品久久久成人 | 欧美一级高清片 | 国产品久精国精产拍 | 久久久九九 | 国产精品爽爽久久久久久蜜臀 | 中文字幕 成人 | 激情小说网站亚洲综合网 | 国产99精品在线观看 | 日韩精品免费一区二区三区 | 99国产在线| 婷婷在线观看视频 | 在线观看av网站 | 91人人射 | 久久神马影院 | 国产又粗又猛又黄视频 | 国产原创av片 | 999久久久| 99riav1国产精品视频 | 日韩免费一区 | 六月色丁香| 国产高清av免费在线观看 | 国产精品高 | 99九九视频 | 天天操天天爱天天爽 | 最新婷婷色 | av免费看在线 | 欧美一二三区在线观看 | 亚洲成av人影院 | 中文字幕一区二区三区四区在线视频 | 国产精品久久久久久吹潮天美传媒 | 亚洲一区二区黄色 | 欧美99精品 | 美女黄视频免费看 | 少妇高潮冒白浆 | 韩国精品福利一区二区三区 | 黄色aa久久 | 久草在线手机观看 | 在线免费观看视频一区 | 人人爽人人插 | 国产高清免费 | 天天干天天色2020 | 人人插人人费 | 青青网视频| 99热最新精品 | 国产视频1| 黄色一级大片免费看 | 欧美一区二区三区四区夜夜大片 | 337p日本欧洲亚洲大胆裸体艺术 | 欧美日韩一区久久 | 国产精品对白一区二区三区 | 国产精品成人av在线 | 亚洲一区二区三区四区精品 | 久久久精品免费看 | 欧美色精品天天在线观看视频 | 玖玖在线资源 | 欧美激情在线网站 | 免费在线观看av网址 | 久草.com| 精品你懂的 | av一区在线播放 | a特级毛片 | 黄色成人在线 | 国产高清在线免费视频 | 成人aaa毛片| 久久久网页 | 夜夜骑日日 | 国产精品不卡在线播放 | 亚洲一区日韩精品 | 玖玖玖在线观看 | 午夜精品久久久久久久99热影院 | 国产视频在线免费 | 在线观看久久 | 中文在线免费观看 | 中文字幕免费观看全部电影 | 麻豆国产精品永久免费视频 | 日本动漫做毛片一区二区 | 日韩欧美一区二区三区免费观看 | 天天插日日插 | 成人国产精品久久久春色 | 免费在线色电影 | 欧美日韩中文在线观看 | 国产情侣一区 | 精品一区二区视频 | 欧美,日韩| 在线播放91| 欧美成人h版电影 | 很黄很黄的网站免费的 | 精品中文字幕视频 | 99麻豆久久久国产精品免费 | 91中文字幕一区 | 一级α片免费看 | 99热高清| 国产一区免费观看 | 免费福利片 | 亚洲一级国产 | 不卡的av中文字幕 | 免费网址在线播放 | 99精品一级欧美片免费播放 | 99久久99热这里只有精品 | 中文字幕在线观看一区 | 友田真希av| 亚洲激情 在线 | 国产在线专区 | 久草在线视频在线 | 国产精品久久久电影 | 久久久久久久久国产 | 日韩黄色影院 | 国产日产高清dvd碟片 | 日韩黄色免费在线观看 | 久久免费福利 | 久久激情五月丁香伊人 | 日本精品午夜 | 国产在线播放观看 | av一级二级 | 亚洲男模gay裸体gay | 五月综合激情婷婷 | 精品999国产| 免费看污污视频的网站 | av激情五月 | 中文av在线天堂 | 国产成人av电影在线 | 免费看片亚洲 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 亚洲草视频 | 日韩区欠美精品av视频 | 久草国产精品 | 香蕉视频在线网站 | 国产91勾搭技师精品 | 亚洲最大激情中文字幕 | 349k.cc看片app | 国产成人精品网站 | 久久1电影院 | 国产精品一级视频 | 免费a视频 | 久久综合久久综合这里只有精品 | 日本性视频 | 亚洲一区在线看 | 少妇搡bbbb搡bbb搡69 | av电影久久 | 热99久久精品 | 夜夜干天天操 | 日韩成年视频 | 精品免费久久久久久 | 911精品美国片911久久久 | 99色网站| 色婷婷综合久久久久中文字幕1 | 精品一区二区三区香蕉蜜桃 | 夜夜躁日日躁狠狠躁 | 国内精品久久久久影院一蜜桃 | 99热在线免费观看 | 免费av网站在线 | 毛片美女网站 | 超碰在线人人 | 特级西西www44高清大胆图片 | 国产精品理论视频 | 精品一区二区三区久久 | 91成人蝌蚪 | 亚洲人人网 | 亚洲视频在线观看免费 | 毛片激情永久免费 | 国产精品私人影院 | 激情图片久久 | 天天操天天操天天爽 | 草久视频在线 | 日韩av午夜在线观看 | 五月婷婷狠狠 | 蜜桃av综合网 | 91福利视频久久久久 | 一区二区三高清 | 超碰在线98| 国产精品不卡在线播放 | 狠狠色2019综合网 | 在线亚洲人成电影网站色www | 日韩精品一区二区在线观看 | 中文字幕丝袜制服 | 狠狠色丁香婷婷综合久小说久 | 国模视频一区二区三区 | 亚洲精品国偷拍自产在线观看 | 国产91精品看黄网站在线观看动漫 | 国产日韩精品一区二区三区 | 中文字幕精品www乱入免费视频 | 日韩极品视频在线观看 | 在线观看成人福利 | 亚洲精品动漫久久久久 | 国产91全国探花系列在线播放 | 97香蕉视频| 丁香av| 日韩免费电影在线观看 | 久久视频免费观看 | 亚洲综合在线五月 | 蜜臀久久99精品久久久无需会员 | 最新国产在线 | 91人人澡 | 99视频国产精品 | 久久精品久久久久 | 国产精品igao视频网入口 | 欧美坐爱视频 | 青青河边草免费直播 | 2020天天干天天操 | 欧美一区二区精品在线 | 国内成人av | 午夜视频免费 | 五月婷婷丁香综合 | 九九热免费精品视频 | 国产一区二区综合 | 日日夜夜草 | 免费人成网 | www免费| 亚洲精品动漫久久久久 | 成人综合婷婷国产精品久久免费 | 99久久精品国产亚洲 | 99视频在线免费播放 | 亚洲日本中文字幕在线观看 | 在线免费视频a | 国产亚洲精品久久 | 中文字幕免费 | 中文字幕亚洲高清 | 亚洲高清激情 | 91视频链接| 97精品超碰一区二区三区 | 91探花在线视频 | 黄色电影在线免费观看 | 99久久999久久久精玫瑰 | 伊甸园永久入口www 99热 精品在线 | 悠悠av资源片 | 免费能看的黄色片 | 97视频网站 | 国产你懂的在线 | 在线观看免费中文字幕 | 99久久综合国产精品二区 | 视频国产在线 | 精品国产一区二区三区蜜臀 | 热99在线| 91黄色影视 | 免费97视频 | 日韩av播放在线 | 日韩精品一卡 | 在线视频 区| 久久久久国产精品免费免费搜索 | 色婷婷激情 | 天天干夜夜夜 | 久久免费看 | 亚洲精品自拍视频在线观看 | 天天操操| 亚洲精品免费在线观看 | 国产精品精品国产色婷婷 | 97碰在线 | 又色又爽又黄高潮的免费视频 | 91精品国产乱码久久桃 | 久久精品这里热有精品 | 99热国产在线观看 | 亚洲精品久久久久久中文传媒 | 三上悠亚一区二区在线观看 | 国产精品每日更新 | 91成人免费视频 | 精品成人国产 | 美女久久久久久久久久久 | 婷婷视频导航 | 色视频网站在线观看一=区 a视频免费在线观看 | 精品国产一区二 | 国产精品午夜8888 | 中文字幕在线观 | 亚洲欧美国产精品va在线观看 | 日韩伦理片一区二区三区 | 欧美a视频在线观看 | 国产精品69久久久久 | 成人午夜网 | 久久精品99国产国产精 | 日本色小说视频 | 亚洲一级黄色av | 三级av免费观看 | 久久久久久久影院 | 中文字幕免费观看视频 | 国产一区av在线 | 成人中心免费视频 | 日韩极品在线 | 国产视频欧美视频 | 在线观看视频免费大全 | 久草综合视频 | 久久久久成人精品免费播放动漫 | 国产麻豆电影在线观看 | 久久精品播放 | 成人av在线观 | 在线观看久草 | 久久这里精品视频 | 国产96精品 | www黄在线| 国产美女被啪进深处喷白浆视频 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 欧美a√在线 | 免费看片成人 | 青青河边草免费直播 | 福利电影一区二区 | 国产免费黄视频在线观看 | 久久高清免费视频 | 99在线视频精品 | 国产精品自产拍在线观看蜜 | 精品免费国产一区二区三区四区 | 精品国产1区2区3区 国产欧美精品在线观看 | 国产精品美乳一区二区免费 | 免费又黄又爽视频 | 国产亚洲免费观看 | 精品国产一二区 | 九色激情网 | 欧美日韩高清国产 | 亚洲影院国产 | 十八岁以下禁止观看的1000个网站 | 婷婷丁香久久五月婷婷 | 人人狠狠综合久久亚洲婷 | 在线观看视频你懂的 | 国产一区电影在线观看 | 婷婷成人综合 | 尤物97国产精品久久精品国产 | 国产精品毛片久久 | 丰满少妇对白在线偷拍 | 亚洲精品国产高清 | 日韩三级精品 | 国产精品乱码久久久久久1区2区 | 成人性生交大片免费看中文网站 | 在线观看深夜福利 | 国产色在线 | 精品国产一二三 | 97品白浆高清久久久久久 | 国产一性一爱一乱一交 | 伊人色综合久久天天网 | 91精品福利在线 | 色在线国产 | 91 在线视频播放 | 日日夜夜婷婷 | 欧美日韩国产mv | 91资源在线播放 | 亚洲天堂va| 久草视频视频在线播放 | 免费试看一区 | 最近中文字幕大全中文字幕免费 | 一区二区三区免费在线观看视频 | 久久精品激情 | 亚洲经典中文字幕 | 国产免费又爽又刺激在线观看 | 亚洲成a人片在线观看网站口工 | 国产精品麻豆一区二区三区 | 97视频免费在线 | 激情小说网站亚洲综合网 | 国产亚洲婷婷 | 91久久国产露脸精品国产闺蜜 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 国产原创在线 | 激情久久综合网 | 天天干天天插 | 日日夜夜天天操 | 国产精品露脸在线 | 久久综合精品国产一区二区三区 | 一区二区三区电影大全 | 久福利| 国产裸体视频网站 | 国产免费视频在线 | 91传媒在线观看 | 亚洲资源在线网 | 色狠狠操 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 2019精品手机国产品在线 | 一级欧美日韩 | 在线 影视 一区 | 久久精国产 | 中文字幕 国产 一区 | www.91成人 | 国产精品大片在线观看 | 久久伊人操 | 久久伊人精品天天 | 久久99视频免费观看 | 日韩精选在线观看 | 亚洲一级在线观看 | 国产伦精品一区二区三区在线 | 国产美女免费观看 | 国产精品h在线观看 | 成片视频免费观看 | 久久精品五月 | 欧美国产日韩在线观看 | 免费激情在线电影 | 国产在线视频一区二区 | 中文乱码视频在线观看 | 精品一区二区av | 中文在线中文资源 | 99久久精品免费看国产一区二区三区 | 亚洲欧美日本国产 | 亚洲一区av | 亚洲国产精久久久久久久 | 久久综合网色—综合色88 | 日本三级吹潮在线 | 毛片1000部免费看 | 国产传媒一区在线 | 成人aⅴ视频 | 亚洲综合在线五月 | 免费av成人在线 | 在线免费黄 | 欧美日本国产在线观看 | 国产亚洲精品久久久久久移动网络 | 美女激情影院 | 色偷偷人人澡久久超碰69 | 免费在线电影网址大全 | 91高清免费看 | 91成版人在线观看入口 | 中文字幕在线国产 | 精品伦理一区二区三区 | 黄色亚洲精品 | 狠狠操狠狠干天天操 | 日韩欧美国产精品 | 黄色在线网站噜噜噜 | 久久精品中文字幕少妇 | 日韩中文幕 | a国产精品 | 亚洲视频一区二区三区在线观看 | www最近高清中文国语在线观看 | 97在线免费视频 | 精品久久久久一区二区国产 | www.久久成人| 国产美女视频免费 | 91在线精品观看 | 狠狠躁天天躁综合网 | 日韩av片在线 | 夜夜骑首页 | 成人av影院在线观看 | 在线国产一区二区三区 | 欧美国产亚洲精品久久久8v | 欧美极度另类性三渗透 | 狠色在线| 在线视频在线观看 | 精品国产91亚洲一区二区三区www | 国产精品第一页在线 | 激情久久婷婷 | 久久综合9988久久爱 | 久二影院 | 中文字幕免费高 | 免费看av在线 | 一区二区激情视频 |