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

三分鐘數(shù)據(jù)持久化:Spring Boot, JPA 與 SQLite 的完美融合

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
SQLite 是一個(gè)用 C 語(yǔ)言編寫(xiě)的開(kāi)源、輕量級(jí)、快速、獨(dú)立且高可靠性的 SQL 數(shù)據(jù)庫(kù)引擎,它提供了功能齊全的數(shù)據(jù)庫(kù)解決方案。對(duì)于大多數(shù)的應(yīng)用,SQLite 都可以滿足。

在快節(jié)奏的軟件開(kāi)發(fā)領(lǐng)域,每一個(gè)簡(jiǎn)化工作流程的機(jī)會(huì)都不容錯(cuò)過(guò)。想要一個(gè)無(wú)需繁瑣配置、能夠迅速啟動(dòng)的數(shù)據(jù)持久化方案嗎?這篇文章將是你的首選攻略。在這里,我們將向你展示如何將 Spring Boot 的便捷性、JPA 的強(qiáng)大查詢能力和 SQLite 的輕量級(jí)特性結(jié)合在一起,實(shí)現(xiàn)快速而又優(yōu)雅的數(shù)據(jù)管理。

為什么選擇 SQLite

SQLite 是一個(gè)用 C 語(yǔ)言編寫(xiě)的開(kāi)源、輕量級(jí)、快速、獨(dú)立且高可靠性的 SQL 數(shù)據(jù)庫(kù)引擎,它提供了功能齊全的數(shù)據(jù)庫(kù)解決方案。對(duì)于大多數(shù)的應(yīng)用,SQLite 都可以滿足。使用 SQLite 可以零配置啟動(dòng),對(duì)于小型應(yīng)用或者快速原型設(shè)計(jì)是一個(gè)非常大的優(yōu)勢(shì)。

使用 SQLite 具有下面幾個(gè)優(yōu)點(diǎn):

  1. 1. 輕量級(jí):SQLite很小巧,不需要獨(dú)立服務(wù)器,便于集成到應(yīng)用中。
  2. 2. 零配置:?jiǎn)⒂?SQLite 無(wú)需復(fù)雜配置,只需指定一個(gè)文件路徑存放 DB 文件,簡(jiǎn)化了數(shù)據(jù)庫(kù)的設(shè)置流程。
  3. 3. 便于移植:數(shù)據(jù)庫(kù)是單一文件,方便備份和在不同環(huán)境間遷移。
  4. 4. 跨平臺(tái):SQLite 支持各種操作系統(tǒng),容易實(shí)現(xiàn)應(yīng)用的跨平臺(tái)運(yùn)行。
  5. 5. 性能良好:對(duì)于小型應(yīng)用,SQLite 提供足夠的讀寫(xiě)性能。
  6. 6. 遵循ACID:SQLite事務(wù)符合ACID原則,數(shù)據(jù)操作可靠。
  7. 7. 社區(qū)支持:雖然簡(jiǎn)單,但擁有強(qiáng)大的社區(qū)和廣泛的文檔資源。

之前寫(xiě)過(guò)一篇 SQLite 入門(mén)教程 (https://www.wdbyte.com/db/sqlite/)[1],感情的同學(xué)可以參考。

為什么 選擇 JPA

Spring Data JPA 是Spring Data項(xiàng)目的一部分,旨在簡(jiǎn)化基于JPA(Java Persistence API)的數(shù)據(jù)訪問(wèn)層(Repository層)的實(shí)現(xiàn)。JPA是一種 ORM(對(duì)象關(guān)系映射)規(guī)范,它允許開(kāi)發(fā)者以面向?qū)ο蟮姆绞絹?lái)操作數(shù)據(jù)庫(kù),

通常應(yīng)用程序?qū)崿F(xiàn)數(shù)據(jù)訪問(wèn)層可能非常麻煩,必須編寫(xiě)太多的樣板代碼才能實(shí)現(xiàn)簡(jiǎn)單的查詢,更不用說(shuō)分頁(yè)等其他操作,而 Spring Data JPA 可以讓開(kāi)發(fā)者非常容易地實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的各種操作,顯著減少實(shí)際需要的工作量。

詳細(xì)介紹 JPA 并不是本文目的,關(guān)于 JPA 的更多內(nèi)容可以訪問(wèn):

  1. 1. Spring Data JPA 官網(wǎng):https://spring.io/projects/spring-data-jpa[2]。
  2. 2. Spring Boot 使用 Spring Data JPA[3]

創(chuàng)建 Spring Boot 項(xiàng)目

用于后續(xù)演示,首先創(chuàng)建一個(gè)簡(jiǎn)單的 Spring Boot 項(xiàng)目。你可以自由創(chuàng)建,或者使用 Spring 官網(wǎng)提供的快速創(chuàng)建工具:https://start.spring.io/[4]

注意,文章示例項(xiàng)目使用 Java 21 進(jìn)行演示。

為了方便開(kāi)發(fā),創(chuàng)建一個(gè)基礎(chǔ)的 Spring Boot 項(xiàng)目后,添加以下依賴。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 從 Hibernate 6 開(kāi)始,支持 SQLite 方言。-->
<!-- https://mvnrepository.com/artifact/org.hibernate.orm/hibernate-community-dialects -->
<dependency>
    <groupId>org.hibernate.orm</groupId>
    <artifactId>hibernate-community-dialects</artifactId>
    <version>6.4.3.Final</version>
</dependency>
<!-- sqlite jdbc 驅(qū)動(dòng) -->
<dependency>
    <groupId>org.xerial</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.45.1.0</version>
</dependency>
<!-- Lombok 簡(jiǎn)化 get set tostring log .. -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<!-- apache java 通用工具庫(kù) -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.13.0</version>
</dependency>
<!-- 編碼通用工具庫(kù) -->
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.16.0</version>
</dependency>

配置 SQLite & JPA

在 Spring Boot 中,對(duì) SQLite 的配置非常簡(jiǎn)單,只需要指定一個(gè)位置存放 SQLite 數(shù)據(jù)庫(kù)文件。SQLite 無(wú)服務(wù)端,因此可以直接啟動(dòng)。

spring.datasource.url=jdbc:sqlite:springboot-sqlite-jpa.db
spring.datasource.driver-class-name=org.sqlite.JDBC
# JPA Properties
spring.jpa.database-platform=org.hibernate.community.dialect.SQLiteDialect
# create 每次都重新創(chuàng)建表,update,表若存在則不重建
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

配置實(shí)體映射

在使用 JPA 開(kāi)發(fā)時(shí),就是使用 jakarta.persistence 包中的注解配置 Java 實(shí)體類和表的映射關(guān)系,比如使用 @Table 指定表名,使用 @Column 配置字段信息。

import java.time.LocalDateTime;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Entity
@Getter
@Setter
@ToString
@Table(name = "website_user")
public class WebsiteUser {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "username", nullable = false, unique = true, length = 64)
    private String username;

    @Column(name = "password", nullable = false, length = 255)
    private String password;

    @Column(name = "salt", nullable = false, length = 16)
    private String salt;

    @Column(name = "status", nullable = false, length = 16, columnDefinition = "VARCHAR(16) DEFAULT 'active'")
    private String status;

    @Column(name = "created_at", nullable = false, columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
    private LocalDateTime createdAt;
  
    @Column(name = "updated_at", nullable = false, columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
    private LocalDateTime updatedAt;
}

編寫(xiě) JPA 查詢方法

Spring Data JPA 提供了多種便捷的方法來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的查詢操作,使得能夠以非常簡(jiǎn)潔的方式編寫(xiě)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)和查詢邏輯。比如 Spring Data JPA 允許通過(guò)在接口中定義遵循一定命名方法的方式來(lái)創(chuàng)建數(shù)據(jù)庫(kù)查詢。如findByName 將生成一個(gè)根據(jù) name 查詢指定實(shí)體的 SQL。

代碼示例:

@Repository
public interface WebsiteUserRepository extends CrudRepository<WebsiteUser, Long> {

    /**
     * 根據(jù) username 查詢數(shù)據(jù)
     * @param name
     * @return
     */
    WebsiteUser findByUsername(String name);
}

代碼示例中,繼承的 CrudRepository 接口中包含了常見(jiàn)的 CURD 操作方法。自定義的 findByUsername 方法可以根據(jù) WebsiteUser 中的 Username 進(jìn)行查詢。

編寫(xiě) Controller

編寫(xiě)三個(gè) API 用來(lái)演示 Spring Boot 結(jié)合 SQLite 以及 JPA 是否成功。

初始化方法 init():

  • ? 映射到 "/sqlite/init" 的 GET請(qǐng)求。
  • ? 創(chuàng)建了10個(gè) WebsiteUser 實(shí)體,為每個(gè)用戶生成隨機(jī)的用戶名和鹽值,并用MD5加密其密碼("123456" + 鹽)。
  • ? 用戶信息包括用戶名、加鹽后的密碼、創(chuàng)建和更新的時(shí)間戳,以及用戶狀態(tài)。
  • ? 用戶信息被保存到數(shù)據(jù)庫(kù)中,并記錄日志。

查找用戶方法 findByUsername(String username):

  • ? 映射到 "/sqlite/find" 的GET請(qǐng)求。
  • ? 通過(guò)用戶名查詢用戶。如果找到,返回用戶的字符串表示;否則返回 null。

登錄方法 findByUsername(String username, String password):

  • ? 映射到 "/sqlite/login" 的GET請(qǐng)求。
  • ? 驗(yàn)證傳入的用戶名和密碼。首先通過(guò)用戶名查詢用戶,然后將傳入的密碼與鹽值結(jié)合,并與數(shù)據(jù)庫(kù)中存儲(chǔ)的加鹽密碼進(jìn)行MD5加密比對(duì)。
  • ? 如果密碼匹配,則認(rèn)證成功,返回 "login succeeded";否則,返回 "login failed"。

代碼示例:

import java.time.LocalDateTime;
import com.wdbyte.springsqlite.model.WebsiteUser;
import com.wdbyte.springsqlite.repository.WebsiteUserRepository;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author https://www.wdbyte.com
 */
@Slf4j
@RestController
public class SqliteController {

    @Autowired
    private WebsiteUserRepository userRepository;

    @GetMapping("/sqlite/init")
    public String init() {
        for (int i = 0; i < 10; i++) {
            WebsiteUser websiteUser = new WebsiteUser();
            // 隨機(jī)4個(gè)字母
            websiteUser.setUsername(RandomStringUtils.randomAlphabetic(4));
            // 隨機(jī)16個(gè)字符用于密碼加鹽加密
            websiteUser.setSalt(RandomStringUtils.randomAlphanumeric(16));
            String password = "123456";
            // 密碼存儲(chǔ) = md5(密碼+鹽)
            password = password + websiteUser.getSalt();
            websiteUser.setPassword(DigestUtils.md5Hex(password));
            websiteUser.setCreatedAt(LocalDateTime.now());
            websiteUser.setUpdatedAt(LocalDateTime.now());
            websiteUser.setStatus("active");
            WebsiteUser saved = userRepository.save(websiteUser);
            log.info("init user {}", saved.getUsername());
        }
        return "init success";
    }

    @GetMapping("/sqlite/find")
    public String findByUsername(String username) {
        WebsiteUser websiteUser = userRepository.findByUsername(username);
        if (websiteUser == null) {
            return null;
        }
        return websiteUser.toString();
    }

    @GetMapping("/sqlite/login")
    public String findByUsername(String username, String password) {
        WebsiteUser websiteUser = userRepository.findByUsername(username);
        if (websiteUser == null) {
            return "login failed";
        }
        password = password + websiteUser.getSalt();
        if (StringUtils.equals(DigestUtils.md5Hex(password), websiteUser.getPassword())) {
            return "login succeeded";
        } else {
            return "login failed";
        }
    }
}

至此,項(xiàng)目編寫(xiě)完成,完整目錄結(jié)構(gòu)如下:

├── pom.xml
└── src
    ├── main
        ├── java
        │   └── com
        │       └── wdbyte
        │           └── springsqlite
        │               ├── SpringBootSqliteApp.java
        │               ├── controller
        │               │   └── SqliteController.java
        │               ├── model
        │               │   └── WebsiteUser.java
        │               └── repository
        │                   └── WebsiteUserRepository.java
        └── resources
            ├── application.properties
            ├── static
            └── templates

啟動(dòng)測(cè)試

Spring Boot 啟動(dòng)時(shí)由于庫(kù)表不存在,自動(dòng)創(chuàng)建庫(kù)表:

Hibernate: create table website_user (id integer, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP not null, password varchar(255) not null, salt varchar(16) not null, status VARCHAR(16) DEFAULT 'active' not null, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP not null, username varchar(64) not null unique, primary key (id))
Hibernate: alter table website_user drop constraint UK_61p1pfkd4ht22uhlib72oj301
2024-02-27T20:00:21.279+08:00  INFO 70956 --- [main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2024-02-27T20:00:21.578+08:00  WARN 70956 --- [main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2024-02-27T20:00:21.931+08:00  INFO 70956 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path ''
2024-02-27T20:00:21.938+08:00  INFO 70956 --- [main] c.w.springsqlite.SpringBootSqliteApp     : Started SpringBootSqliteApp in 3.944 seconds (process running for 5.061)

請(qǐng)求初始化接口

$ curl http://127.0.0.1:8080/sqlite/init
init success

可以看到輸出日志成功寫(xiě)入了 10條數(shù)據(jù),且輸出了 username 值。

2024-02-27T20:01:04.120+08:00 ...SqliteController : init user HUyz
Hibernate: insert into website_user (created_at,password,salt,status,updated_at,username) values (?,?,?,?,?,?)
Hibernate: select last_insert_rowid()
2024-02-27T20:01:04.123+08:00 ...SqliteController : init user ifQU
Hibernate: insert into website_user (created_at,password,salt,status,updated_at,username) values (?,?,?,?,?,?)
Hibernate: select last_insert_rowid()
2024-02-27T20:01:04.126+08:00 ...SqliteController : init user GBPK
Hibernate: insert into website_user (created_at,password,salt,status,updated_at,username) values (?,?,?,?,?,?)
Hibernate: select last_insert_rowid()
2024-02-27T20:01:04.129+08:00 ...SqliteController : init user rytE
Hibernate: insert into website_user (created_at,password,salt,status,updated_at,username) values (?,?,?,?,?,?)
Hibernate: select last_insert_rowid()
2024-02-27T20:01:04.132+08:00 ...SqliteController : init user iATH
Hibernate: insert into website_user (created_at,password,salt,status,updated_at,username) values (?,?,?,?,?,?)
Hibernate: select last_insert_rowid()
2024-02-27T20:01:04.134+08:00 ...SqliteController : init user ZQRW
Hibernate: insert into website_user (created_at,password,salt,status,updated_at,username) values (?,?,?,?,?,?)
Hibernate: select last_insert_rowid()
2024-02-27T20:01:04.137+08:00 ...SqliteController : init user cIPM
Hibernate: insert into website_user (created_at,password,salt,status,updated_at,username) values (?,?,?,?,?,?)
Hibernate: select last_insert_rowid()
2024-02-27T20:01:04.140+08:00 ...SqliteController : init user MemS
Hibernate: insert into website_user (created_at,password,salt,status,updated_at,username) values (?,?,?,?,?,?)
Hibernate: select last_insert_rowid()
2024-02-27T20:01:04.143+08:00 ...SqliteController : init user GEeX
Hibernate: insert into website_user (created_at,password,salt,status,updated_at,username) values (?,?,?,?,?,?)
Hibernate: select last_insert_rowid()
2024-02-27T20:01:04.146+08:00 ...SqliteController : init user ZQrT

請(qǐng)求查詢用戶接口

$ curl http://127.0.0.1:8080/sqlite/find\?username\=ZQrT
WebsiteUser(id=10, username=ZQrT, password=538ea3b5fbacd1f9354a1f367b36135a, salt=RxaivBHlyJCxtOEv, status=active, createdAt=2024-02-27T20:01:04.144, updatedAt=2024-02-27T20:01:04.144)

查詢成功,回顯了查詢到的用戶信息。

請(qǐng)求登錄接口

在初始化數(shù)據(jù)時(shí),密碼統(tǒng)一配置為 123456,下面的測(cè)試可以看到使用正確的密碼可以通過(guò)校驗(yàn)。

$ curl http://127.0.0.1:8080/sqlite/login\?username\=ZQrT\&password\=123456
login succeeded
$ curl http://127.0.0.1:8080/sqlite/login\?username\=ZQrT\&password\=12345
login failed

SQLite 3 數(shù)據(jù)審查

使用 Sqlite3 命令行工具查看 SQLite 數(shù)據(jù)庫(kù)內(nèi)容。

$ ./sqlite3 springboot-sqlite-jpa.db
SQLite version 3.42.0 2023-05-16 12:36:15
Enter ".help" for usage hints.
sqlite> .tables
website_user

sqlite> .mode table
sqlite> select * from website_user;
+----+---------------+----------------------------------+------------------+--------+---------------+----------+
| id |  created_at   |             password             |       salt       | status |  updated_at   | username |
+----+---------------+----------------------------------+------------------+--------+---------------+----------+
| 1  | 1709035264074 | 4b2b68c0df77669540fc0a487d753400 | 1njFP8ykWmlu01Z8 | active | 1709035264074 | HUyz     |
| 2  | 1709035264120 | 7e6444d57f753cfa6c1592a17e68e66e | 9X3El5jQaMhrROSf | active | 1709035264120 | ifQU     |
| 3  | 1709035264124 | 1d24c4ddb351eb56f665adb13708f981 | Jn9IrT6MYqVqzpu8 | active | 1709035264124 | GBPK     |
| 4  | 1709035264126 | 960747cc48aeed71e8ff714deae42e87 | wq8pb1G9pIalGHwP | active | 1709035264126 | rytE     |
| 5  | 1709035264129 | cf1037b95a997a1b1b9d9aa598b9f96b | An0hwV2n9cN4wpOy | active | 1709035264129 | iATH     |
| 6  | 1709035264132 | b68d42108e5046bd25b74cda947e0ffc | EozfDAkpn5Yx4yin | active | 1709035264132 | ZQRW     |
| 7  | 1709035264134 | 78d4841af9a12603204f077b9bf30dcc | 2FRNQ2zWksJHOyX9 | active | 1709035264135 | cIPM     |
| 8  | 1709035264137 | 60b8051ca3379c569a3fb41ed5ff05aa | KpT3IGwWmhlWIUq7 | active | 1709035264137 | MemS     |
| 9  | 1709035264140 | 0ca0a2dce442315c11f5488c0127f905 | RhGOYnNEMYbnWoat | active | 1709035264140 | GEeX     |
| 10 | 1709035264144 | 538ea3b5fbacd1f9354a1f367b36135a | RxaivBHlyJCxtOEv | active | 1709035264144 | ZQrT     |
+----+---------------+----------------------------------+------------------+--------+---------------+----------+
sqlite>

一如既往,文章中代碼存放在 Github.com/niumoo/javaNotes[5].

參考

? https://docs.spring.io/spring-data/jpa/reference/jpa.html

引用鏈接

[1] SQLite 入門(mén)教程 (https://www.wdbyte.com/db/sqlite/): https://www.wdbyte.com/db/sqlite/

[2] Spring Data JPA 官網(wǎng):https://spring.io/projects/spring-data-jpa: https://spring.io/projects/spring-data-jpa

[3] Spring Boot 使用 Spring Data JPA: https://www.wdbyte.com/2019/03/springboot/springboot-10-data-jpa

[4] https://start.spring.io/: https://start.spring.io/#!type=maven-project&language=java&platformVersion=3.2.3&packaging=jar&jvmVersion=21&groupId=com.example&artifactId=springboot-sqlite-jpa&name=springboot-sqlite-jpa&description=Demo project for Spring Boot&packageName=com.example.springboot-sqlite-jpa&dependencies=web,lombok,data-jpa

[5] Github.com/niumoo/javaNotes: https://github.com/niumoo/JavaNotes/tree/master/springboot/springboot-sqlite-jpa

責(zé)任編輯:武曉燕 來(lái)源: 程序猿阿朗
相關(guān)推薦

2022-02-16 19:42:25

Spring配置開(kāi)發(fā)

2020-11-20 08:36:59

Jpa數(shù)據(jù)代碼

2024-05-16 11:13:16

Helm工具release

2024-12-18 10:24:59

代理技術(shù)JDK動(dòng)態(tài)代理

2009-11-09 12:55:43

WCF事務(wù)

2021-09-16 10:29:05

開(kāi)發(fā)技能代碼

2020-03-08 16:45:58

數(shù)據(jù)挖掘學(xué)習(xí)數(shù)據(jù)量

2021-04-20 13:59:37

云計(jì)算

2022-02-17 09:24:11

TypeScript編程語(yǔ)言javaScrip

2023-12-27 08:15:47

Java虛擬線程

2024-01-16 07:46:14

FutureTask接口用法

2024-08-30 08:50:00

2020-06-30 10:45:28

Web開(kāi)發(fā)工具

2013-06-28 14:30:26

棱鏡計(jì)劃棱鏡棱鏡監(jiān)控項(xiàng)目

2025-10-27 01:35:00

2015-10-23 17:47:32

BaaSPaaS移動(dòng)中間件

2025-05-07 00:10:00

2020-07-21 07:42:29

數(shù)據(jù)庫(kù)信息技術(shù)

2023-12-23 18:04:40

服務(wù)Eureka工具

2009-11-10 16:05:21

VB.NET格式化
點(diǎn)贊
收藏

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

国产一区视频导航| 欧美三级美国一级| 亚洲一级片在线观看| 97视频中文字幕| 日韩成人一区二区三区| 久久影院资源站| 性做久久久久久免费观看欧美| 成人免费视频视频在| 国产精品成人aaaa在线| 日韩欧美中文字幕电影| 欧日韩精品视频| 好色先生视频污| 香蕉av在线播放| 青青草精品视频| 超薄丝袜一区二区| 国产麻豆天美果冻无码视频| 日韩网站中文字幕| 亚洲男人天堂av| 国产日韩精品一区观看| 天堂网一区二区| 欧美成人日韩| 亚洲精品永久免费精品| 天天干天天色天天干| 男女羞羞在线观看| 亚洲男人的天堂在线aⅴ视频 | 少妇又紧又色又爽又刺激视频| 希岛爱理av一区二区三区| 亚洲激情 国产| 我要看一级黄色大片| 欧美人体视频xxxxx| 久久久国产精品不卡| 91av免费看| 成人免费a视频| 一级欧洲+日本+国产| 亚洲精品中文字幕有码专区| 中文字幕在线观看日| 亚洲精品福利电影| 亚洲精品日日夜夜| 亚洲国产精品www| 亚洲欧美精品| 99精品人妻国产毛片| 午夜激情久久| 亚洲天堂日韩电影| 国产大学生视频| 国产精品一区二区精品| 色综合久久中文综合久久牛| 国产系列第一页| 国产在线三区| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲最大福利视频网| 中国a一片一级一片| 男人的天堂亚洲在线| 国内精品免费午夜毛片| 999福利视频| 久久不见久久见中文字幕免费 | 久久激五月天综合精品| 性视频1819p久久| 美女福利视频在线观看| 日本激情一区| 亚洲美女中文字幕| 玖玖爱在线精品视频| 日韩欧美久久| 日韩欧美精品三级| 日韩精品视频网址| 亚洲人成777| 欧美精品乱码久久久久久| 九热视频在线观看| 欧美成人精品三级网站| 日韩欧美在线中文字幕| 日韩免费一级视频| 国产另类xxxxhd高清| 欧美日韩久久不卡| 日日夜夜精品视频免费观看| 亚洲国产欧美在线观看| 精品福利在线导航| 性欧美13一14内谢| 欧美女优在线视频| 久久视频在线免费观看| 久草网视频在线观看| 99香蕉国产精品偷在线观看| 日本精品视频在线播放| 夜夜躁狠狠躁日日躁av| 国产精品1区2区3区| 极品尤物一区二区三区| 国产色a在线| 成人免费在线播放视频| 免费人成自慰网站| 深夜视频一区二区| 欧美一级高清片| 成人网站免费观看| 99久久99久久精品国产片果冰| 色综合天天综合网国产成人网 | 亚洲永久字幕| 国产在线观看不卡| 熟妇人妻av无码一区二区三区| 久久久一区二区三区| 国产免费色视频| 日本在线影院| 69p69国产精品| 丝袜美腿中文字幕| 亚洲最新色图| 国产成人精品999| 国产黄a三级三级看三级| 91麻豆免费观看| 亚洲黄色网址在线观看| 悠悠资源网亚洲青| 日韩欧美在线观看一区二区三区| 三级电影在线看| 午夜日韩在线| 国产一区二区在线播放| 无码精品人妻一区二区| 国产精品第一页第二页第三页| 日韩视频在线视频| 粉嫩av国产一区二区三区| 日韩精品在线观| 久久久久久天堂| 免费在线观看成人| 欧美激情第六页| 美足av综合网| 欧美一区二区三区视频免费播放| 能免费看av的网站| 亚洲国产一区二区精品专区| 国产欧美一区二区三区久久| 日本ー区在线视频| 亚洲高清不卡在线| 亚洲图片 自拍偷拍| sdde在线播放一区二区| 91干在线观看| 亚洲精品.www| 亚洲精品自拍动漫在线| 超碰人人草人人| 欧洲杯什么时候开赛| 91av视频导航| 天天干天天爽天天操| 一区二区三区资源| 一级网站在线观看| 97精品视频| 国产啪精品视频| 91美女视频在线| 欧美性猛交xxxx乱大交退制版| 人妻丰满熟妇aⅴ无码| 日韩视频一区二区三区在线播放免费观看| 亚洲tv在线观看| 国产一二三区在线观看| 欧美色精品在线视频| 青娱乐国产视频| 日韩avvvv在线播放| 免费在线一区二区| 香蕉视频亚洲一级| 亚洲视频在线免费看| 午夜精品久久久久久久蜜桃| 久久精品亚洲一区二区三区浴池| 波多野结衣家庭教师视频| 西野翔中文久久精品字幕| 97在线观看免费高清| 天堂中文在线视频| 色婷婷综合激情| 我不卡一区二区| 热久久久久久久| 正在播放一区| 色悠久久久久综合先锋影音下载| 欧美激情第6页| 四虎免费在线观看| 日韩欧美中文第一页| 91成人在线免费视频| 久久精品免费看| 最新av在线免费观看| 日本免费一区二区三区视频| 久久久久中文字幕2018| 午夜视频在线播放| 91福利视频网站| 女人裸体性做爰全过| 激情综合色播激情啊| 一二三在线视频| 福利电影一区| 国产精品高潮呻吟久久av野狼 | 欧美精品一区二区久久| 国产精品久久久久久久美男| 黄色在线播放网站| 精品国产一区二区三区久久久蜜月| 国产精品二区一区二区aⅴ| 久久久久久亚洲综合| 中文字幕免费高清在线| 国产精品99一区二区| 欧美激情导航| 日本亚洲视频| 秋霞成人午夜鲁丝一区二区三区| 淫片在线观看| 亚洲精品99999| 亚洲手机在线观看| 亚洲成av人**亚洲成av**| 欧美a在线播放| 成人免费观看男女羞羞视频| 老熟妇仑乱视频一区二区| 在线精品视频在线观看高清| 精品亚洲欧美日韩| 国产精品成人**免费视频| 韩国一区二区电影| 黄色免费网站在线观看| 亚洲美女性视频| 午夜精品久久久久久久第一页按摩 | 91一区在线观看| 日韩a一级欧美一级| 欧美综合国产| 亚洲国产精品无码观看久久| 欧美wwwww| 欧美精品二区三区四区免费看视频 | 亚洲黄色av| 欧美爱爱视频网站| 国产一区二区区别| 国产亚洲欧美一区二区| 国产专区精品| 国产美女高潮久久白浆| 白白色在线观看| 久久九九国产精品怡红院| 免费在线黄色网址| 亚洲精品国产电影| 亚洲AV无码精品国产| 欧美酷刑日本凌虐凌虐| 一级黄色av片| 欧美午夜宅男影院在线观看| 精品无码久久久久久久| 亚洲人成在线播放网站岛国| 日韩免费成人av| 久久免费偷拍视频| 插我舔内射18免费视频| 国产河南妇女毛片精品久久久| 亚洲黄色小视频在线观看| 亚洲女同同性videoxma| 日韩网站在线免费观看| 欧美国产专区| 亚洲成人动漫在线| 亚洲蜜桃视频| 日韩不卡一二区| 欧美 日韩 国产 一区| 黄瓜视频免费观看在线观看www| 国产精品日韩精品中文字幕| 欧美高清www午色夜在线视频| 91蝌蚪视频在线观看| 亚洲电影在线| 极品粉嫩国产18尤物| 欧美午夜不卡影院在线观看完整版免费| 在线免费一区| 在线精品小视频| 国产片侵犯亲女视频播放| 午夜亚洲福利| av女优在线播放| 中文欧美日韩| 中文字幕无码精品亚洲35| 国产视频亚洲| 日日摸天天爽天天爽视频| 日韩国产高清影视| 最新国产黄色网址| 国精品**一区二区三区在线蜜桃 | 中文字幕激情小说| 欧美视频专区一二在线观看| 中文字幕超碰在线| 在线观看av不卡| 中国女人真人一级毛片| 欧美乱妇15p| 亚洲AV无码一区二区三区少妇| 欧美va天堂va视频va在线| 色屁屁草草影院ccyycom| 日韩av综合中文字幕| 美女毛片在线看| 色系列之999| 污的网站在线观看| 98视频在线噜噜噜国产| 日韩三区在线| 亚洲精品免费在线视频| 加勒比视频一区| 日韩欧美视频一区二区三区四区| 欧美国产一级| 全黄性性激高免费视频| 视频在线观看一区| 99九九精品视频| 99久久婷婷国产精品综合| 亚洲成人黄色av| 亚洲欧美另类图片小说| 香蕉免费毛片视频| 欧美日韩国产一区| 亚洲乱码在线观看| 亚洲天堂久久av| 国产网站在线免费观看| 亚洲91精品在线观看| 高清在线一区| 国产九色91| 91中文字幕精品永久在线| 青娱乐自拍偷拍| 国产中文字幕一区| 少妇按摩一区二区三区| 1区2区3区国产精品| 日韩乱码在线观看| 欧美日韩国产在线观看| 午夜影院在线视频| 久久久国产在线视频| 麻豆免费版在线观看| 91久久精品国产91久久| 久久99蜜桃| 色综合久久66| 国产中文字幕视频| 日韩亚洲欧美在线| 国产美女视频一区二区三区 | 私库av在线播放| 在线观看国产日韩| 天堂中文字幕av| 欧美成人久久久| 成人全视频免费观看在线看| 国产一区二区无遮挡| 亚洲国产精品成人| 999精品视频在线| 97久久人人超碰| 久久老司机精品视频| 7777精品伊人久久久大香线蕉完整版| 午夜视频福利在线观看| 久久久久久尹人网香蕉| 四虎国产精品永久在线国在线| 欧美12av| 亚洲麻豆av| 中文字幕18页| 伊人性伊人情综合网| 亚洲天堂777| 国产亚洲一区二区在线| 在线观看网站免费入口在线观看国内| 99久久伊人精品影院| 亚洲国产日韩欧美在线| 潘金莲激情呻吟欲求不满视频| 欧美国产成人精品| 国产又粗又猛又黄视频| 亚洲美女视频网站| 亚洲欧美韩国| 久中文字幕一区| 一区二区三区国产盗摄| 一本加勒比波多野结衣| 香蕉久久一区二区不卡无毒影院 | 一区二区在线视频| 免费观看一级欧美片| 国内一区在线| 国产情侣久久| 老司机福利av| 在线视频国内一区二区| 国产系列在线观看| 国产精品6699| 成人在线电影在线观看视频| 少妇激情一区二区三区| 亚洲国产精品精华液2区45| 波多野结衣黄色| 日韩一区二区av| 国产精品久久免费视频| 日韩一级免费看| 成人精品gif动图一区| 国产精品成人网站| 日韩精品极品视频| 国产免费不卡| 亚洲国产午夜伦理片大全在线观看网站 | 五月天av在线播放| 亚洲摸摸操操av| 六月婷婷综合网| 国产成人精品a视频一区www| 欧美大人香蕉在线| 免费观看一区二区三区| 精品福利在线观看| 国外av在线| 91精品视频免费观看| 一色桃子av在线| 日韩精品在线观| 成人亚洲综合| 欧美日韩dvd| 99国产一区二区三精品乱码| www.久久久久久久| 在线色欧美三级视频| 96视频在线观看欧美| 成人午夜精品久久久久久久蜜臀| 91免费精品国自产拍在线不卡| www.av88| 欧美福利视频在线| 亚洲视频分类| 国产大片一区二区三区| 五月天一区二区三区| 高清中文字幕一区二区三区| 亚洲a中文字幕| 男人的天堂亚洲在线| 永久免费看片直接| 日韩精品极品视频| 国产美女精品视频免费播放软件| av在线播放天堂| 中文久久乱码一区二区| 亚洲黄色在线观看视频| 国产福利成人在线| 欧美日韩视频一区二区三区| 新91视频在线观看| 日韩免费视频线观看| 校园春色亚洲色图| 成人免费网站入口| 国产精品网站导航| 午夜影院免费体验区| 91最新在线免费观看| 日韩中文字幕区一区有砖一区| 久久久久成人网站| 视频在线一区二区|