精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從單體架構(gòu)到分布式數(shù)據(jù)持久化,ORM 框架之 Mybatis

開發(fā) 架構(gòu) 分布式
大多數(shù)程序員在學(xué)習(xí) Java 的過程中,當(dāng)學(xué)習(xí)到 Java 訪問數(shù)據(jù)庫的時候,一定會先學(xué)習(xí) JDBC,它是一種用于執(zhí)行 SQL 語句的 Java API,為數(shù)據(jù)庫提供統(tǒng)一訪問,并把數(shù)據(jù)“持久化”到數(shù)據(jù)庫中。

[[377400]]

本文轉(zhuǎn)載自微信公眾號「會點代碼的大叔」,作者會點代碼的大叔 。轉(zhuǎn)載本文請聯(lián)系會點代碼的大叔公眾號。

1前置概念

01 持久化

持久化就是把數(shù)據(jù)保存到可以永久保存的存儲設(shè)備中,比如磁盤。

02 JDBC

大多數(shù)程序員在學(xué)習(xí) Java 的過程中,當(dāng)學(xué)習(xí)到 Java 訪問數(shù)據(jù)庫的時候,一定會先學(xué)習(xí) JDBC,它是一種用于執(zhí)行 SQL 語句的 Java API,為數(shù)據(jù)庫提供統(tǒng)一訪問,并把數(shù)據(jù)“持久化”到數(shù)據(jù)庫中。

我再通俗地解釋一下(對 JDBC 有一定了解的同學(xué)可以直接跳過):

Sun 公司在 97 年發(fā)布 JDK1.1 ,JDBC 就是這個版本中一個重要的技術(shù)點,要用 Java 語言連接數(shù)據(jù)庫,正常的思維都是 Sun 公司自己來實現(xiàn)如何連接數(shù)據(jù)庫、如果執(zhí)行 SQL 語句,但是市場上的數(shù)據(jù)庫太多了,數(shù)據(jù)庫之間的差異也很大,而且 Sun 公司也不可能了解每個數(shù)據(jù)庫的內(nèi)部細(xì)節(jié)吶...

于是為了讓 Java 代碼能更好地與數(shù)據(jù)庫連接,Sun 公司于是制定了一系列的接口,說是接口,其實也就是一套【標(biāo)準(zhǔn)】、一套【規(guī)范】,具體代碼如何實現(xiàn)由各個數(shù)據(jù)庫廠商來敲代碼;所以我們常說的“驅(qū)動類”,就是各個廠商的實現(xiàn)類。

所以我們在用 JDBC 連接數(shù)據(jù)庫的時候,第一步需要注冊驅(qū)動,就是要告訴 JVM 使用的是操作哪個數(shù)據(jù)庫的實現(xiàn)類。

 

03 ORM

在沒有 ORM 框架之前,我們操作數(shù)據(jù)庫需要這樣:

 

我們可以看到使用 JDBC 操作數(shù)據(jù)庫,代碼比較繁瑣,參數(shù)拼寫在 SQL 中容易出錯,而且可讀性比較差,增加了代碼維護(hù)的難度。

有了 ORM 框架之后,我們操作數(shù)據(jù)庫是這樣的:

 

ORM 框架在 Java 對象和數(shù)據(jù)庫表之間做了一個映射,封裝了數(shù)據(jù)庫的訪問細(xì)節(jié),我們再需要操作數(shù)據(jù)庫語句的時候,直接操作 Java 對象就可以了。

2Spring Boot 集成 MyBatis

Java 常用的 ORM 框架有 Hibernate、MyBatis、JPA 等等,我在后文中在比較這集中框架的優(yōu)缺點,本章節(jié)主要介紹 Spring Boot 項目集成 MyBatis 訪問數(shù)據(jù)庫。

Step 1. 添加依賴

  1. <dependency> 
  2.     <groupId>mysql</groupId> 
  3.     <artifactId>mysql-connector-java</artifactId> 
  4. </dependency> 
  5.  
  6. <dependency> 
  7.     <groupId>org.mybatis.spring.boot</groupId> 
  8.     <artifactId>mybatis-spring-boot-starter</artifactId> 
  9.     <version>2.0.1</version> 
  10. </dependency> 

Step 2. 配置數(shù)據(jù)庫鏈接

在 application.yml 文件中配置數(shù)據(jù)庫相關(guān)信息。

  1. #數(shù)據(jù)源配置 
  2. spring: 
  3.   datasource: 
  4.     #數(shù)據(jù)庫驅(qū)動 
  5.     driver-class-name: com.mysql.cj.jdbc.Driver 
  6.     #數(shù)據(jù)庫 url 
  7.     url: jdbc:mysql://127.0.0.1:3306/arch?characterEncoding=UTF-8&serverTimezone=UTC 
  8.     #用戶名 
  9.     username: root 
  10.     #密碼 
  11.     password: root 

Step 3. 配置數(shù)據(jù)庫鏈接

在我們本機的數(shù)據(jù)庫上,創(chuàng)建一個用戶表,并插入一條數(shù)據(jù):

  1. CREATE TABLE IF NOT EXISTS `user`( 
  2.    `id` INT UNSIGNED AUTO_INCREMENT,     
  3.    `userid` VARCHAR(100) NOT NULL
  4.    `username` VARCHAR(100) NOT NULL
  5.    `gender` CHAR(1) NOT NULL
  6.    `age` INT NOT NULL
  7.    PRIMARY KEY ( `id` ) 
  8. )ENGINE=InnoDB DEFAULT CHARSET=utf8; 
  9.  
  10. insert into user(userid ,username, gender, age) values('dashu','大叔','M',18); 

Step 4. 創(chuàng)建 Model 層

通常用于接收數(shù)據(jù)庫中數(shù)據(jù)的對象,我會單獨創(chuàng)建一個 model package,類中的屬性我習(xí)慣和字段保持相同。

  1. package com.archevolution.chapter4.model; 
  2.  
  3. public class User { 
  4.   private int id;//主鍵ID,自增長 
  5.   private String userId;//用戶ID,或看做登錄名 
  6.   private String userName;//用戶姓名 
  7.   private String gender;//性別 
  8.   private int age;//年齡 
  9.   //省略 get、set、toString 方法 

Step 5. 創(chuàng)建 Dao 層

通常直接和數(shù)據(jù)庫打交道的代碼,我們把它們放在 DAO 層(Data Access Object),數(shù)據(jù)訪問邏輯全都在這里;

我們新建一個 dao package,并在下面新建一個**接口**,注意是接口:

  1. @Mapper 
  2. public interface UserDao { 
  3.   @Select("SELECT id, userId, userName, gender, age FROM USER WHERE id = #{id}"
  4.   public User queryUserById(@Param("id"int id); 

這里我多說幾句!

從技術(shù)角度來說,model 中的屬性可以和表中的字段不一樣,比如我們在數(shù)據(jù)庫中增加一個手機號的字段叫做 [mobilephone] :

  1. --增加手機號字段 
  2. ALTER TABLE user ADD mobilephone varchar(15) ; 
  3.  
  4. --更新 userid = 1 數(shù)據(jù)的手機號 
  5. update user set mobilephone = '13800000000' where userid = '1'

我們在 User.java 中添加一個字段,叫做 [telephone]:

我們自己知道 [telephone] 是和數(shù)據(jù)庫中的 [mobilephone] 對應(yīng),但是如何讓 Mybatis 知道這兩個字段要對應(yīng)上呢?有幾個辦法:

01. 在 SQL 語句中控制,對名字不相同的字段起別名:

  1. @Select("SELECT id, userId, userName, gender, age, mobilephone as telephone FROM USER WHERE id = #{id}"
  2. public User queryUserTelById(@Param("id"int id); 

02. 使用 @Results 標(biāo)簽,將屬性和字段不相同的設(shè)置映射(名稱相同的可以不寫):

  1. @Select("SELECT id, userId, userName, gender, age, mobilephone FROM USER WHERE id = #{id}"
  2. @Results({ 
  3.   @Result(property = "telephone" , column = "mobilephone")   
  4. }) 
  5. public User queryUserTelById2(@Param("id"int id); 

不過我還是建議大家在寫 model 類的時候,屬性和表中的字段保持一模一樣,這樣不僅可以減少代碼的復(fù)雜程度,還能很大程度地增加代碼的可讀性,減少出錯的可能;

有些同學(xué)可能會有疑問,很多項目的數(shù)據(jù)結(jié)構(gòu)設(shè)計的不是那么規(guī)范,比如字段名稱可能是一個很奇怪的名字,比如 flag01、flag02,如果這樣的字段從數(shù)據(jù)庫中查詢出來,通過接口返回,那么會不會造成接口的可讀性太差?

通常我們不會把 model 中的內(nèi)容直接包裝返回,model 很多的是數(shù)據(jù)庫和 Java 對象的映射,而傳輸數(shù)據(jù)的話,通常需要 DTO;我們從數(shù)據(jù)庫中查詢出來數(shù)據(jù)放到 model 中,在接口中返回數(shù)據(jù)之前,把 model 轉(zhuǎn)換成 DTO,而 DTO 中的屬性需要保證其規(guī)范性和見名知意。

 

Step 6. 創(chuàng)建 Service 層

我們的項目現(xiàn)在已經(jīng)有了 Dao 層,用于訪問數(shù)據(jù),有 Controller 層,用戶提供接口訪問,那么 Controller 是否能直接調(diào)用 Dao 中的方法呢?最好不要直接調(diào)用!

通常我們會創(chuàng)建一個 Service 層,用于存放業(yè)務(wù)邏輯,這時候完整的調(diào)用流程是:

Controller - Service - Dao

創(chuàng)建 Service package 之后,在里面創(chuàng)建一個 UserService :

  1. @Service 
  2. public class UserService { 
  3.   @Autowired 
  4.   UserDao userDao; 
  5.  
  6.   public User queryUserById(int id) { 
  7.     return userDao.queryUserById(id); 
  8.   } 

Step 7. 在 Controller 層增加接口

增加一個接口,通過 userId 查詢客戶信息,并返回客戶信息:

  1. @RequestMapping(value = "/queryUser/{id}"
  2. @ResponseBody 
  3. public String queryUserById(@PathVariable("id"int id){ 
  4.     User user = userService.queryUserById(id); 
  5.     return user == null ? "User is not find" : user.toString() ; 

Step 8. 測試驗證

在瀏覽器或客戶端中訪問接口進(jìn)行調(diào)試測試,可以查詢到客戶信息:

  1. http://127.0.0.1:8088/queryUser/1 
  2.  
  3. User [id=1, userId=dashu, userName=大叔, gender=M, age=18, telephone=null

03MyBatis 的其他操作

只給出關(guān)鍵代碼,完整代碼請參考本章節(jié)的項目代碼。

01. 新增

  1. @Insert("INSERT INTO USER(userId, userName, gender, age) values" 
  2.         + " (#{userId}, #{userName}, #{gender}, #{age})"
  3. public void insertUser(User user); 

02. 修改

  1. @Update("UPDATE USER SET mobilephone = #{telephone} WHERE id = #{id}"
  2. public void updateUserTel(User user); 

03. 刪除

  1. @Delete("DELETE FROM USER WHERE id = #{id}"
  2. public void deleteUserById(@Param("id"int id); 

4代碼完善

上面我們就完成了 Spring Boot 和 MyBatis 最簡單的集成,可以正常地讀取數(shù)據(jù)庫做 CRUD 了,但是因為是最簡單的集成,所以有一些細(xì)節(jié)需要完善一下,比如:

參數(shù)都在顯示在了 url 中;

直接返回 Object.toString(), 不是很友好;

查詢不到數(shù)據(jù)或發(fā)生異常,沒有做特殊處理;

下面讓我們逐步完善

01. 使用 Json 作為參數(shù)發(fā)送 Post 請求

如果嚴(yán)格地遵守 Restful 風(fēng)格,那么需要遵守:

查詢:GET /url/xxx

新增:POST /url

修改:PUT /url/xxx

刪除:DELETE /url/xxx

在這里我們就單純地認(rèn)為把參數(shù)寫在 url 中,容易一眼就看到我們的參數(shù)內(nèi)容,并且如果參數(shù)比較多的時候會造成 url 過長,所以通常我們比較習(xí)慣使用 Json 作為參數(shù)發(fā)送 Post 請求。比如新增 User 的接口可以寫成這樣:

新增 DTO package 并新建 UserDTO:

  1. //使用了 Josn 作為參數(shù),需要設(shè)置 headers = {"content-type=application/json"
  2. //@RequestBody UserDto userDto 可以讓 JSON 串自動和 UserDto 綁定和轉(zhuǎn)換 
  3. @RequestMapping(value = "/insertUser2",headers = {"content-type=application/json"}) 
  4. @ResponseBody 
  5. public String insertUser2(@RequestBody UserDto userDto){ 
  6.     //DTO 轉(zhuǎn)成  Model 
  7.     User user = new User(); 
  8.     user.setUserId(userDto.getUserId()); 
  9.     user.setUserName(userDto.getUserName()); 
  10.     user.setGender(userDto.getGender()); 
  11.     user.setAge(userDto.getAge()); 
  12.  
  13.     userService.insertUser(user); 
  14.  
  15.     return "Success" ; 

新增 User 的接口:

  1. //使用了 Josn 作為參數(shù),需要設(shè)置 headers = {"content-type=application/json"
  2. //@RequestBody UserDto userDto 可以讓 JSON 串自動和 UserDto 綁定和轉(zhuǎn)換 
  3. @RequestMapping(value = "/insertUser2",headers = {"content-type=application/json"}) 
  4. @ResponseBody 
  5. public String insertUser2(@RequestBody UserDto userDto){ 
  6.     //DTO 轉(zhuǎn)成  Model 
  7.     User user = new User(); 
  8.     user.setUserId(userDto.getUserId()); 
  9.     user.setUserName(userDto.getUserName()); 
  10.     user.setGender(userDto.getGender()); 
  11.     user.setAge(userDto.getAge()); 
  12.  
  13.     userService.insertUser(user); 
  14.  
  15.     return "Success" ; 

讓我們調(diào)用接口測試一下:

  1. {  
  2.   "userId""lisi",  
  3.    "userName""李四",  
  4.    "gender""F",  
  5.    "age""40",  
  6.    "telephone""18600000000" 

02. 規(guī)范回參

直接返回 Object.toString(), 不是很友好;

讓我們設(shè)計一個簡單的回參對象,包括 code-狀態(tài)碼,message-異常信息描述,data-數(shù)據(jù):

  1. public class JsonResponse { 
  2.   private String code; 
  3.   private String message; 
  4.   private Object data; 
  5.   //省略 set、get 方法 

其中 code 我們就參考 Http 狀態(tài)碼,使用常用的幾個:

  1. public class ResponseCode { 
  2.   public static final String SUCCESS = "200";//查詢成功 
  3.   public static final String SUCCESS_NULL = "204";//查詢成功,但是沒有數(shù)據(jù) 
  4.   public static final String PARAMETERERROR = "400";//參數(shù)錯誤 
  5.   public static final String FAIL = "500";//服務(wù)器異常 

這時我們再來重寫一下查詢接口:

  1. @RequestMapping(value = "/queryUser2"
  2. @ResponseBody 
  3.   public JsonResponse queryUser2ById(@RequestBody UserDto userDto){ 
  4.   JsonResponse res = new JsonResponse(); 
  5.  
  6.   //省略參數(shù)校驗 
  7.  
  8.   User user = userService.queryUserById(userDto.getUserId()); 
  9.  
  10.   if(user != null){ 
  11.     //能查詢到結(jié)果,封裝到回參中 
  12.     res.setCode(ResponseCode.SUCCESS); 
  13.     res.setData(user);; 
  14.   }else
  15.     //如果查詢不到結(jié)果,則返回 '204' 
  16.     res.setCode(ResponseCode.SUCCESS_NULL); 
  17.     res.setMessage("查詢不到數(shù)據(jù)"); 
  18.   } 
  19.  
  20.   return res; 

調(diào)用結(jié)果可以看到封裝后的回參,看起來是不是規(guī)范了很多:

  1.    "code""200"
  2.    "message"null
  3.    "data": { 
  4.       "id": 3, 
  5.       "userId""lisi"
  6.       "userName""李四"
  7.       "gender""F"
  8.       "age": 40, 
  9.       "telephone"null 
  10.    } 

03. 異常處理

如果代碼在運行過程中發(fā)生異常,那么改如何處理呢?直接把異常信息返回給前端么?這樣做對調(diào)用方不是很友好,通常我們把錯誤日志打印到本地,給調(diào)用方返回一個異常狀態(tài)碼即可。

Service、Dao 層的集成都往上拋:

  1. public User queryUserById(int userId) throws Exception{ 
  2.   return userDao.queryUserById(userId); 

在 Controller 層抓住異常,并封裝回參:

  1. User user = new User(); 
  2. try { 
  3.   user = userService.queryUserById(userDto.getId()); 
  4. } catch (Exception e) { 
  5.   res.setCode(ResponseCode.FAIL); 
  6.   res.setMessage("服務(wù)異常"); 

4MyBatis 常見問題

01. 為什么 MyBatis 被稱為半自動 ORM 框架?

有半自動就會有全自動;

Hibernate 就屬于全自動 ORM 框架,使用 Hibernate 可以完全根據(jù)對象關(guān)系模型進(jìn)行操作,也就是指操作 Java 對象不需要寫 SQL,因此是全自動的;而 MyBatis 在關(guān)聯(lián)對象的時候,需要手動編寫 SQL 語句,因此被稱作“半自動”。

02. 使用注解還是 XML?

相信大部分項目使用 MyBatis 的時候,都是使用 XML 配置 SQL 語句,而我們課程中的例子,都是使用注解的方式,那么這兩者有什么區(qū)別呢?我們在實際開發(fā)中,要如何選擇呢?

首先官方是比較推薦使用 XML 的,因為使用注解的方式,拼接動態(tài) SQL 比較費勁兒,如果你們的 SQL 比較復(fù)雜,需要多表關(guān)聯(lián),還是使用 XML 比較好;而且現(xiàn)在也有很多插件,可以自動生成 MyBatis XML。

但是事物總是有兩方面的,復(fù)雜的 SQL 并不是值得驕傲的事情,如果你們的項目能做到?jīng)]有復(fù)雜 SQL 的話,使用注解會是更好的選擇(我們現(xiàn)在的項目 95% 以上的 SQL 都是單表查詢)。

03. #{} 和 ${} 的區(qū)別是什么?

${} 是字符串替換,#{} 是預(yù)編譯處理;使用 #{} 可以防止 SQL 注入,提高系統(tǒng)安全性。

04. 如何做批量插入?

注解的方式同樣可以使用動態(tài) SQL :

  1. @Insert({ 
  2.     "<script>" 
  3.         + "INSERT INTO USER(userId, userName, gender, age) values" 
  4.         + "<foreach collection='userList' item='item' index='index' separator=','>" 
  5.         + " (#{item.userId}, #{item.userName}, #{item.gender}, #{item.age})" 
  6.         + "</foreach>" 
  7.         + "</script>" 
  8. }) 
  9. public void insertUserList(@Param(value="userList") List<User> userList); 

Spring Boot 集成 MyBatis 做數(shù)據(jù)庫增刪查改的操作,是比較基礎(chǔ)的知識,希望對初學(xué) Java 的人有所幫助。

 

責(zé)任編輯:武曉燕 來源: 會點代碼的大叔
相關(guān)推薦

2025-05-13 03:22:00

2024-04-11 12:42:30

2024-06-12 09:06:48

2021-11-26 06:43:19

Java分布式

2022-03-06 21:43:05

Citus架構(gòu)PostgreSQL

2023-06-14 17:56:54

2019-07-04 15:13:16

分布式緩存Redis

2017-09-01 05:35:58

分布式計算存儲

2019-12-26 08:59:20

Redis主從架構(gòu)

2023-05-29 14:07:00

Zuul網(wǎng)關(guān)系統(tǒng)

2019-10-10 09:16:34

Zookeeper架構(gòu)分布式

2022-12-04 22:41:15

IPC分布式機制

2018-04-19 10:46:39

3N層框架

2013-06-07 13:46:29

分布式存儲自動化運維

2021-03-17 10:51:16

架構(gòu)運維技術(shù)

2024-05-16 07:51:55

分布式系統(tǒng)架構(gòu)

2021-12-28 17:03:29

數(shù)據(jù)質(zhì)量分布式

2010-04-08 10:29:54

TwitterGizzard數(shù)據(jù)存儲

2018-07-17 08:14:22

分布式分布式鎖方位

2024-06-07 07:41:03

點贊
收藏

51CTO技術(shù)棧公眾號

伊人久久亚洲影院| 韩国中文免费在线视频| 亚洲国产精品久久久久蝴蝶传媒| 欧美二区在线观看| 少妇高潮大叫好爽喷水| 国产 欧美 精品| 香蕉精品999视频一区二区 | 亚州精品天堂中文字幕| 亚洲熟妇无码av| 欧美天堂一区二区| 夜夜嗨av一区二区三区四季av| 久久99精品国产99久久| 日本黄色中文字幕| 午夜天堂精品久久久久| 亚洲性日韩精品一区二区| gogo亚洲国模私拍人体| 日韩av中字| 亚洲综合偷拍欧美一区色| 日本公妇乱淫免费视频一区三区| 不卡视频在线播放| 日韩高清国产一区在线| 午夜精品免费视频| 亚洲二区在线播放| 亚洲另类春色校园小说| 日韩一区二区中文字幕| 日本www高清视频| caoporn-草棚在线视频最| 国产精品无码永久免费888| 国产精品一区二区三区免费| 中文字字幕在线观看| 99精品国产一区二区青青牛奶 | 免费污视频在线观看| 欧美经典一区二区三区| 久久99精品久久久久久青青日本| 精品人妻一区二区三区浪潮在线 | 91久久精品一区| 日韩在线播放中文字幕| 在线看片成人| 欧美日韩成人黄色| 免费成人美女女在线观看| 亚洲人成亚洲精品| 亚洲国产91色在线| 久久久久久久久久久影视| 97久久中文字幕| 欧美日韩国产系列| 天天操天天爱天天爽| 成人免费看黄| 色综合久久久久网| 成人免费毛片网| 日韩伦理福利| 欧美日韩免费在线| 欧美亚洲一二三区| 涩涩在线视频| 欧美性videos高清精品| www黄色日本| 久久久男人天堂| 精品成人在线视频| 国产极品在线视频| 福利影院在线看| 精品免费在线视频| 欧美亚洲一二三区| 欧美最新精品| 欧美性生活影院| 中文字幕在线综合| 日韩成人一区| 欧美一区二区在线免费观看| 无码人妻一区二区三区在线视频| 亚洲精品在线国产| 亚洲成人黄色网址| 亚洲精品在线视频免费观看| 亚洲色图美女| 在线视频中文亚洲| 男人在线观看视频| 国内精品福利| 欧美又大粗又爽又黄大片视频| 亚洲熟女综合色一区二区三区| 日韩电影免费一区| 成人黄色生活片| www.亚洲天堂.com| 2024国产精品| 性欧美大战久久久久久久免费观看| 午夜伦理在线| 一区二区免费看| 日韩在线一级片| 伦一区二区三区中文字幕v亚洲| 91精品中文字幕一区二区三区| 国产裸体视频网站| 亚洲欧洲色图| 久久天天躁日日躁| 日韩av在线播放观看| 日韩成人伦理电影在线观看| 亚洲sss综合天堂久久| 高清乱码毛片入口| 国产日韩欧美电影| 黄色录像特级片| 欧美大片免费观看网址| 91精品欧美福利在线观看| 白嫩情侣偷拍呻吟刺激 | 自拍另类欧美| caoprom在线| 欧美日韩三级一区二区| 秘密基地免费观看完整版中文| 自拍视频一区| 九九久久国产精品| 久久久久久无码午夜精品直播| 国产自产高清不卡| 精品视频免费观看| 黄色网址视频在线观看| 欧美午夜激情在线| 亚洲成人av免费观看| 国产一区二区三区不卡视频网站| 久久97久久97精品免视看| 亚洲精品毛片一区二区三区| 成人午夜视频网站| 欧美aaa在线观看| 日韩av大片站长工具| 精品日韩99亚洲| 五月婷婷综合激情网| 午夜亚洲一区| 国产精品一区二区欧美| 高h视频在线观看| 欧洲精品在线观看| 少妇一级淫片免费放播放| 一区二区三区毛片免费| 国产精品丝袜白浆摸在线| 亚洲人妻一区二区三区| 亚洲精品久久久蜜桃| 最新天堂在线视频| 精品国产乱码久久久| 91高清视频免费| 蜜臀av午夜精品| 亚洲老司机在线| 思思久久精品视频| 日本在线电影一区二区三区| 国产成人av网| 免费在线观看一级毛片| 欧美日韩国产色视频| 亚洲天堂av网站| 亚洲国产裸拍裸体视频在线观看乱了中文 | 狂野欧美性猛交xxxx| 亚洲天堂免费视频| 久久99精品波多结衣一区| 成人aa视频在线观看| 成人在线免费观看网址| 北岛玲精品视频在线观看| 色偷偷噜噜噜亚洲男人的天堂| 日本黄色中文字幕| 国产日韩一级二级三级| 国产一级片黄色| 国产精品一在线观看| 4444欧美成人kkkk| 免费理论片在线观看播放老| 一本久久a久久精品亚洲| 少妇光屁股影院| 国产精品美女久久久浪潮软件| 精品午夜一区二区三区| 美女高潮在线观看| 精品视频—区二区三区免费| 中文字幕一区二区人妻电影| 久久精品男人天堂av| 男操女免费网站| 天天综合精品| 精品福利在线看| 毛片av一区二区三区| 青草国产精品| 91精品短视频| 91麻豆精品国产91久久久久| 天堂а√在线中文在线鲁大师| 麻豆精品蜜桃视频网站| 亚洲伊人婷婷| 欧美视频精品全部免费观看| 欧美丰满少妇xxxx| 色wwwwww| 在线看日本不卡| 美女视频久久久| 成人午夜免费av| 精品国产成人av在线免| 日韩美女一区二区三区在线观看| 91视频国产高清| 99在线视频影院| 亚洲丝袜一区在线| 一级淫片免费看| 亚洲444eee在线观看| 欧美18—19性高清hd4k| 国产呦萝稀缺另类资源| 国产片侵犯亲女视频播放| 亚洲都市激情| 亚洲qvod图片区电影| 色是在线视频| 日韩在线观看免费| 亚州精品国产精品乱码不99按摩| 欧美三级在线看| 不卡的免费av| 日本一区二区综合亚洲| 亚洲熟妇一区二区| 久久久精品日韩| 亚洲av首页在线| 国产精品视频一区二区三区四蜜臂| 成人精品在线视频| 中国字幕a在线看韩国电影| 精品国内自产拍在线观看| 天堂中文在线官网| 91麻豆精品久久久久蜜臀 | 免费av网站观看| 在线亚洲一区二区| 久久精品视频日本| 中文字幕一区二区三区乱码在线| 午夜男人的天堂| 久久99久久99| 免费日韩视频在线观看| 欧美成人久久| 伊人精品久久久久7777| 无码日韩精品一区二区免费| 亚洲资源在线看| 91久久久久久白丝白浆欲热蜜臀| 久久久日本电影| 2024最新电影免费在线观看| 中文字幕国内精品| 四虎精品在线| 精品99久久久久久| 国产农村妇女毛片精品| 欧美色国产精品| 97人妻一区二区精品视频| 欧美日韩国产在线播放| 久草视频在线资源| 亚洲男人的天堂一区二区| 黄色三级生活片| 久久久久久久久久久久久夜| 看全色黄大色黄女片18| 国产成人亚洲精品青草天美| 中日韩av在线播放| 奇米一区二区三区| 激情五月婷婷久久| 久久精品国语| 黑森林福利视频导航| av成人激情| 成熟丰满熟妇高潮xxxxx视频| 欧美日韩三区| 韩日视频在线观看| aaa一区二区三区| 亚洲av激情无码专区在线播放| 成年人网站在线| 中国色在线日|韩| 欧美变态tickling挠脚心| 日本一区二区三区久久| 色综合久久久久综合体桃花网| 国产女同在线观看| 亚洲一区电影777| 久草国产在线观看| 亚洲最大色网站| 久久免费精彩视频| 亚洲午夜影视影院在线观看| 久久久久久久久99| 午夜天堂影视香蕉久久| 国产午夜视频在线| 黄网动漫久久久| 国产精品视频免费播放| 色综合久久中文综合久久牛| 在线视频一区二区三区四区| 色婷婷av一区二区三区软件| 欧美高清69hd| 欧美高清视频不卡网| 国产av一区二区三区| 欧美成人aa大片| 无码国产精品96久久久久| 亚洲男人天堂视频| 一广人看www在线观看免费视频| 日韩有码片在线观看| jizz性欧美10| 97国产成人精品视频| 日韩久久一区二区三区| 国产主播欧美精品| 亚洲五码在线| 欧美精品一区三区在线观看| 日韩在线精品| 美女黄色免费看| 久久一区二区三区超碰国产精品| 免费看国产黄色片| 国产福利视频一区二区三区| 中文字幕在线视频播放| 久久精品一区二区三区不卡| www日韩在线| 偷窥少妇高潮呻吟av久久免费| 五月婷婷激情五月| 91精品国产aⅴ一区二区| 人妻丰满熟妇av无码区hd| 亚洲天堂av在线播放| 久cao在线| 欧美在线www| 精品视频一区二区三区在线观看| 精品国产综合| 99精品在线免费在线观看| 霍思燕三级露全乳照| 全部av―极品视觉盛宴亚洲| 国产chinese中国hdxxxx| 国产欧美日韩在线| 麻豆视频在线观看| 91黄色免费版| 蜜桃av中文字幕| www日韩中文字幕在线看| 国产高清中文字幕在线| 成人妇女淫片aaaa视频| 亚洲另类春色校园小说| 视色,视色影院,视色影库,视色网| 免费在线欧美黄色| 伊人影院在线观看视频| 欧美国产成人精品| www.国产高清| 欧美一区二区三区爱爱| 在线免费黄色| 91国自产精品中文字幕亚洲| 久久久久久久久久久久电影| 色视频一区二区三区| 99国产精品| xxxxwww一片| **欧美大码日韩| 中日韩av在线| 日韩精品极品在线观看播放免费视频| 黄色视屏免费在线观看| 国产精品观看在线亚洲人成网| 波多野结衣在线一区二区 | 亚洲三级黄色片| 操人视频在线观看欧美| 97人人做人人爽香蕉精品| 久久99精品国产一区二区三区| 欧美久久九九| 久久综合桃花网| 亚洲天堂成人网| 一级特黄特色的免费大片视频| 国产香蕉97碰碰久久人人| 美女的胸无遮挡在线观看| 国产精品永久入口久久久| 午夜精品999| 精品人妻人人做人人爽夜夜爽| 自拍偷拍亚洲欧美日韩| 一级黄色片视频| 日韩中文字幕免费看| 欧美日韩女优| 视频一区二区三| 日本大胆欧美人术艺术动态| 波多野结衣一本| 色乱码一区二区三区88| 国产一区精品| 国产成人鲁鲁免费视频a| 国产一区二区三区四区大秀| 国产日韩成人内射视频 | 日韩亚洲欧美精品| 日韩在线卡一卡二| 丰满的亚洲女人毛茸茸| 欧美亚洲综合网| 男人的天堂在线视频免费观看| 国产日韩av在线播放| 亚洲国产不卡| 91成人在线观看喷潮蘑菇| 亚洲综合免费观看高清完整版| 朝桐光av在线一区二区三区| 欧美激情一级精品国产| 欧美大胆视频| 国内外成人免费激情视频| 国产偷国产偷亚洲高清人白洁 | 日韩国产高清在线| 免费观看特级毛片| 91精品国产麻豆| 白白色在线观看| 久久精品aaaaaa毛片| 日韩高清一区在线| 亚洲女人久久久| 日韩视频在线观看一区二区| 91九色国产在线播放| 欧美日韩一区在线播放| 另类小说一区二区三区| 一级黄色录像视频| 亚洲国模精品一区| 久久夜夜操妹子| 国产日韩第一页| 不卡的av网站| 精品乱码一区内射人妻无码| 久久99视频免费| 国产亚洲一区二区三区啪| 国内自拍第二页| 天天综合天天综合色| 成人jjav| 成人xxxxx色| 奶水喷射视频一区| 国产少妇在线观看| 日韩av在线影院| 亚洲色图图片| 99精品在线免费视频| 中文字幕一区二区三区色视频| 人妻偷人精品一区二区三区| 国产精品99久久久久久www| 最新国产精品| 69精品无码成人久久久久久| 欧美一区二区视频在线观看2020| 免费成人在线电影| 一区二区三区av在线| 99国产精品久久久| 97av免费视频| 国产第一区电影| 亚洲大片av|