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

Spring JDBCTemplate 核心架構與執行流程詳解:從原理到實踐

開發 架構
JDBCTemplate 是 Spring 框架對 JDBC 的封裝,它簡化了傳統 JDBC 的開發流程,減少了大量樣板代碼。下面是一個完整的 JDBCTemplate 入門案例。

圖表 系統解析了 Spring JDBCTemplate 的核心架構與執行流程,包含以下內容:

  1. 架構設計:展示 JdbcTemplateDataSourceRowMapper 等核心組件的協作關系,對比傳統 JDBC 的簡化設計。
  2. 執行流程:以查詢和更新操作為例,詳細拆解 SQL 執行、參數綁定、結果映射、資源釋放等關鍵步驟。
  3. 交互與狀態:通過序列圖、流程圖和狀態圖,直觀呈現組件交互時序和操作狀態轉換。
  4. 擴展能力:涵蓋 NamedParameterJdbcTemplate 和自定義 RowMapper 等高級用法。

適合開發者快速掌握 JDBCTemplate 的 自動化資源管理、異常封裝 和 高效數據訪問 原理,為 Spring 數據層開發提供清晰指導。

一、Spring JDBCTemplate 相關設計圖

1、核心類圖

圖片圖片

2、JDBCTemplate 核心組件交互圖

圖片圖片


3. 查詢操作狀態圖

圖片圖片

4. JDBCTemplate 執行流程圖(以 query 方法為例)

圖片圖片

5. 更新操作流程圖

圖片圖片

這些圖表展示了:

  1. JDBCTemplate 的核心組件及其關系
  2. 執行 SQL 查詢時的完整流程
  3. 各組件之間的交互順序
  4. 操作的不同狀態轉換

關鍵點說明:

  • JdbcTemplate 通過 DataSource 獲取數據庫連接
  • 使用 PreparedStatement 防止 SQL 注入
  • RowMapper 負責結果集到對象的映射
  • 自動處理資源的打開和關閉
  • 統一轉換 SQLException 為 DataAccessException

二、Spring JDBCTemplate 入門案例

JDBCTemplate 是 Spring 框架對 JDBC 的封裝,它簡化了傳統 JDBC 的開發流程,減少了大量樣板代碼。下面是一個完整的 JDBCTemplate 入門案例。

1. 準備工作

1.1 添加依賴

首先需要在項目中添加 Spring JDBC 和數據庫驅動的依賴(以 Maven 為例):

<!-- Spring JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.18</version>
</dependency>

<!-- 數據庫驅動 (以MySQL為例) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>

<!-- 數據源 (以HikariCP為例) -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
</dependency>

1.2 創建數據庫表

假設我們有一個簡單的用戶表:

CREATETABLE users (
    id INTPRIMARYKEYAUTO_INCREMENT,
    name VARCHAR(50)NOTNULL,
    age INT,
    email VARCHAR(100)
);

2. 配置數據源

2.1 Java 配置方式

importcom.zaxxer.hikari.HikariDataSource;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.jdbc.core.JdbcTemplate;

@Configuration
publicclassAppConfig{

@Bean
publicHikariDataSourcedataSource(){
HikariDataSource dataSource =newHikariDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/your_database");
        dataSource.setUsername("your_username");
        dataSource.setPassword("your_password");
        dataSource.setMaximumPoolSize(10);
return dataSource;
}

@Bean
publicJdbcTemplatejdbcTemplate(HikariDataSource dataSource){
returnnewJdbcTemplate(dataSource);
}
}

2.2 XML 配置方式

<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

<beanid="dataSource"class="com.zaxxer.hikari.HikariDataSource">
<propertyname="driverClassName"value="com.mysql.cj.jdbc.Driver"/>
<propertyname="jdbcUrl"value="jdbc:mysql://localhost:3306/your_database"/>
<propertyname="username"value="your_username"/>
<propertyname="password"value="your_password"/>
<propertyname="maximumPoolSize"value="10"/>
</bean>

<beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate">
<propertyname="dataSource"ref="dataSource"/>
</bean>
</beans>

3. 創建實體類

publicclassUser{
privateInteger id;
privateString name;
privateInteger age;
privateString email;

// 構造方法、getter和setter、toString等
publicUser(){}

publicUser(String name,Integer age,String email){
this.name = name;
this.age = age;
this.email = email;
}

// 省略其他getter和setter

@Override
publicStringtoString(){
return"User{"+
"id="+ id +
", name='"+ name + ''' +
", age="+ age +
", email='"+ email + ''' +
'}';
}
}

4. 創建 DAO 類

importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.jdbc.core.BeanPropertyRowMapper;
importorg.springframework.jdbc.core.JdbcTemplate;
importorg.springframework.jdbc.core.RowMapper;
importorg.springframework.stereotype.Repository;

importjava.util.List;

@Repository
publicclassUserDao{

@Autowired
privateJdbcTemplate jdbcTemplate;

// 添加用戶
publicintaddUser(User user){
String sql ="INSERT INTO users(name, age, email) VALUES(?, ?, ?)";
return jdbcTemplate.update(sql, user.getName(), user.getAge(), user.getEmail());
}

// 更新用戶
publicintupdateUser(User user){
String sql ="UPDATE users SET name=?, age=?, email=? WHERE id=?";
return jdbcTemplate.update(sql, user.getName(), user.getAge(), user.getEmail(), user.getId());
}

// 刪除用戶
publicintdeleteUser(Integer id){
String sql ="DELETE FROM users WHERE id=?";
return jdbcTemplate.update(sql, id);
}

// 根據ID查詢用戶
publicUsergetUserById(Integer id){
String sql ="SELECT * FROM users WHERE id=?";
RowMapper<User> rowMapper =newBeanPropertyRowMapper<>(User.class);
return jdbcTemplate.queryForObject(sql, rowMapper, id);
}

// 查詢所有用戶
publicList<User>getAllUsers(){
String sql ="SELECT * FROM users";
RowMapper<User> rowMapper =newBeanPropertyRowMapper<>(User.class);
return jdbcTemplate.query(sql, rowMapper);
}

// 查詢用戶數量
publicIntegergetCount(){
String sql ="SELECT COUNT(*) FROM users";
return jdbcTemplate.queryForObject(sql,Integer.class);
}
}

5. 測試類

importorg.springframework.context.ApplicationContext;
importorg.springframework.context.annotation.AnnotationConfigApplicationContext;

publicclassJdbcTemplateDemo{
publicstaticvoidmain(String[] args){
// 加載配置類
ApplicationContext context =newAnnotationConfigApplicationContext(AppConfig.class);

// 獲取UserDao實例
UserDao userDao = context.getBean(UserDao.class);

// 添加用戶
User user1 =newUser("張三",25,"zhangsan@example.com");
int result = userDao.addUser(user1);
System.out.println("添加用戶結果: "+ result);

// 查詢所有用戶
System.out.println("所有用戶:");
        userDao.getAllUsers().forEach(System.out::println);

// 更新用戶
User userToUpdate = userDao.getUserById(1);
        userToUpdate.setName("李四");
        userToUpdate.setEmail("lisi@example.com");
        result = userDao.updateUser(userToUpdate);
System.out.println("更新用戶結果: "+ result);

// 再次查詢所有用戶
System.out.println("更新后的所有用戶:");
        userDao.getAllUsers().forEach(System.out::println);

// 查詢用戶數量
System.out.println("用戶總數: "+ userDao.getCount());

// 刪除用戶
        result = userDao.deleteUser(1);
System.out.println("刪除用戶結果: "+ result);
}
}

6. 核心方法說明

JDBCTemplate 提供了多種便捷方法:

  • update()  - 執行 INSERT/UPDATE/DELETE 語句
jdbcTemplate.update(sql, params...);
  • queryForObject()  - 查詢單個對象
jdbcTemplate.queryForObject(sql, rowMapper, params...);
  • query()  - 查詢對象列表
jdbcTemplate.query(sql, rowMapper, params...);
  • queryForList()  - 查詢結果集到List[map]
jdbcTemplate.queryForList(sql, params...);
  • execute()  - 執行任意SQL語句
jdbcTemplate.execute(sql);

三、Spring JDBCTemplate 入門案例

下面我將通過一個完整的 Spring Boot 整合 JDBCTemplate 的案例,詳細介紹如何使用 JDBCTemplate 進行數據庫操作。

1. 創建 Spring Boot 項目

首先創建一個 Spring Boot 項目,可以使用 Spring Initializr 或 IDE 創建。

1.1 添加必要依賴

在 pom.xml 中添加以下依賴:

<dependencies>
<!-- Spring Boot Starter Web (可選,用于創建Controller測試) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- Spring Boot Starter JDBC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<!-- 數據庫驅動 (以MySQL為例) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

<!-- Lombok (可選,簡化代碼) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

<!-- 測試依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

2. 配置數據源

2.1 配置文件

在 application.properties 或 application.yml 中配置數據源:

# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/springboot_jdbc?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# HikariCP連接池配置 (Spring Boot默認使用HikariCP)
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000

或者使用 YAML 格式:

# application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/springboot_jdbc?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
username: root
password:123456
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size:10
minimum-idle:5
idle-timeout:600000
max-lifetime:1800000
connection-timeout:30000

3. 創建實體類

importlombok.Data;

@Data
publicclassUser{
privateInteger id;
privateString name;
privateInteger age;
privateString email;

// 無參構造和有參構造會被Lombok自動生成
}

4. 創建 Repository (DAO)

importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.jdbc.core.BeanPropertyRowMapper;
importorg.springframework.jdbc.core.JdbcTemplate;
importorg.springframework.jdbc.core.RowMapper;
importorg.springframework.stereotype.Repository;

importjava.util.List;

@Repository
publicclassUserRepository{

privatefinalJdbcTemplate jdbcTemplate;

@Autowired
publicUserRepository(JdbcTemplate jdbcTemplate){
this.jdbcTemplate = jdbcTemplate;
}

// 創建表
publicvoidcreateTable(){
String sql ="CREATE TABLE IF NOT EXISTS users ("+
"id INT PRIMARY KEY AUTO_INCREMENT,"+
"name VARCHAR(50) NOT NULL,"+
"age INT,"+
"email VARCHAR(100)"+
")";
        jdbcTemplate.execute(sql);
}

// 添加用戶
publicintsave(User user){
String sql ="INSERT INTO users(name, age, email) VALUES(?, ?, ?)";
return jdbcTemplate.update(sql, user.getName(), user.getAge(), user.getEmail());
}

// 批量添加用戶
publicint[]batchSave(List<User> users){
String sql ="INSERT INTO users(name, age, email) VALUES(?, ?, ?)";
return jdbcTemplate.batchUpdate(sql, users, users.size(),
(ps, user)->{
                ps.setString(1, user.getName());
                ps.setInt(2, user.getAge());
                ps.setString(3, user.getEmail());
});
}

// 更新用戶
publicintupdate(User user){
String sql ="UPDATE users SET name=?, age=?, email=? WHERE id=?";
return jdbcTemplate.update(sql, user.getName(), user.getAge(), user.getEmail(), user.getId());
}

// 刪除用戶
publicintdeleteById(Integer id){
String sql ="DELETE FROM users WHERE id=?";
return jdbcTemplate.update(sql, id);
}

// 根據ID查詢用戶
publicUserfindById(Integer id){
String sql ="SELECT * FROM users WHERE id=?";
RowMapper<User> rowMapper =newBeanPropertyRowMapper<>(User.class);
return jdbcTemplate.queryForObject(sql, rowMapper, id);
}

// 查詢所有用戶
publicList<User>findAll(){
String sql ="SELECT * FROM users";
RowMapper<User> rowMapper =newBeanPropertyRowMapper<>(User.class);
return jdbcTemplate.query(sql, rowMapper);
}

// 根據名稱查詢用戶
publicList<User>findByName(String name){
String sql ="SELECT * FROM users WHERE name LIKE ?";
RowMapper<User> rowMapper =newBeanPropertyRowMapper<>(User.class);
return jdbcTemplate.query(sql, rowMapper,"%"+ name +"%");
}

// 查詢用戶數量
publicIntegercount(){
String sql ="SELECT COUNT(*) FROM users";
return jdbcTemplate.queryForObject(sql,Integer.class);
}
}

5. 創建 Service 層

importorg.springframework.stereotype.Service;
importorg.springframework.transaction.annotation.Transactional;

importjava.util.List;

@Service
publicclassUserService{

privatefinalUserRepository userRepository;

publicUserService(UserRepository userRepository){
this.userRepository = userRepository;
}

// 初始化表
publicvoidinitTable(){
        userRepository.createTable();
}

// 保存用戶
publicintsave(User user){
return userRepository.save(user);
}

// 批量保存用戶
@Transactional
publicint[]batchSave(List<User> users){
return userRepository.batchSave(users);
}

// 更新用戶
publicintupdate(User user){
return userRepository.update(user);
}

// 刪除用戶
publicintdeleteById(Integer id){
return userRepository.deleteById(id);
}

// 根據ID查詢用戶
publicUserfindById(Integer id){
return userRepository.findById(id);
}

// 查詢所有用戶
publicList<User>findAll(){
return userRepository.findAll();
}

// 根據名稱查詢用戶
publicList<User>findByName(String name){
return userRepository.findByName(name);
}

// 查詢用戶數量
publicIntegercount(){
return userRepository.count();
}
}

6. 創建 Controller (可選)

importorg.springframework.web.bind.annotation.*;

importjava.util.List;

@RestController
@RequestMapping("/api/users")
publicclassUserController{

privatefinalUserService userService;

publicUserController(UserService userService){
this.userService = userService;
}

@PostMapping
publicintsave(@RequestBodyUser user){
return userService.save(user);
}

@PutMapping
publicintupdate(@RequestBodyUser user){
return userService.update(user);
}

@DeleteMapping("/{id}")
publicintdeleteById(@PathVariableInteger id){
return userService.deleteById(id);
}

@GetMapping("/{id}")
publicUserfindById(@PathVariableInteger id){
return userService.findById(id);
}

@GetMapping
publicList<User>findAll(){
return userService.findAll();
}

@GetMapping("/search")
publicList<User>findByName(@RequestParamString name){
return userService.findByName(name);
}

@GetMapping("/count")
publicIntegercount(){
return userService.count();
}
}

7. 測試代碼

7.1 單元測試

importorg.junit.jupiter.api.BeforeEach;
importorg.junit.jupiter.api.Test;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.test.context.SpringBootTest;

importjava.util.Arrays;
importjava.util.List;

importstaticorg.junit.jupiter.api.Assertions.*;

@SpringBootTest
classUserServiceTest{

@Autowired
privateUserService userService;

@BeforeEach
voidsetUp(){
        userService.initTable();
}

@Test
voidtestCRUD(){
// 測試保存
User user =newUser();
        user.setName("張三");
        user.setAge(25);
        user.setEmail("zhangsan@example.com");
int result = userService.save(user);
assertEquals(1, result);

// 測試查詢
List<User> users = userService.findAll();
assertFalse(users.isEmpty());
assertEquals("張三", users.get(0).getName());

// 測試更新
User updatedUser = users.get(0);
        updatedUser.setName("李四");
        result = userService.update(updatedUser);
assertEquals(1, result);

// 驗證更新
User foundUser = userService.findById(updatedUser.getId());
assertEquals("李四", foundUser.getName());

// 測試刪除
        result = userService.deleteById(foundUser.getId());
assertEquals(1, result);

// 驗證刪除
assertEquals(0, userService.count());
}

@Test
voidtestBatchSave(){
List<User> users =Arrays.asList(
newUser(null,"張三",25,"zhangsan@example.com"),
newUser(null,"李四",30,"lisi@example.com"),
newUser(null,"王五",28,"wangwu@example.com")
);

int[] results = userService.batchSave(users);
assertEquals(3, results.length);
assertEquals(1, results[0]);

assertEquals(3, userService.count());
}
}

7.2 主程序測試

importorg.springframework.boot.CommandLineRunner;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.context.annotation.Bean;

importjava.util.Arrays;

@SpringBootApplication
publicclassJdbcTemplateDemoApplication{

publicstaticvoidmain(String[] args){
SpringApplication.run(JdbcTemplateDemoApplication.class, args);
}

@Bean
publicCommandLineRunnerdemo(UserService userService){
return args ->{
// 初始化表
            userService.initTable();

// 添加單個用戶
User user1 =newUser();
            user1.setName("張三");
            user1.setAge(25);
            user1.setEmail("zhangsan@example.com");
            userService.save(user1);

// 批量添加用戶
List<User> users =Arrays.asList(
newUser(null,"李四",30,"lisi@example.com"),
newUser(null,"王五",28,"wangwu@example.com")
);
            userService.batchSave(users);

// 查詢所有用戶
System.out.println("所有用戶:");
            userService.findAll().forEach(System.out::println);

// 查詢用戶數量
System.out.println("用戶總數: "+ userService.count());
};
}
}

8. 高級特性

8.1 使用 NamedParameterJdbcTemplate

對于命名參數的支持:

importorg.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
importorg.springframework.jdbc.core.namedparam.MapSqlParameterSource;
importorg.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
importorg.springframework.jdbc.core.namedparam.SqlParameterSource;
importorg.springframework.stereotype.Repository;

importjava.util.List;

@Repository
publicclassUserNamedParameterRepository{

privatefinalNamedParameterJdbcTemplate namedParameterJdbcTemplate;

publicUserNamedParameterRepository(NamedParameterJdbcTemplate namedParameterJdbcTemplate){
this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
}

// 使用命名參數添加用戶
publicintsave(User user){
String sql ="INSERT INTO users(name, age, email) VALUES(:name, :age, :email)";
SqlParameterSource paramSource =newBeanPropertySqlParameterSource(user);
return namedParameterJdbcTemplate.update(sql, paramSource);
}

// 使用命名參數批量添加
publicint[]batchSave(List<User> users){
String sql ="INSERT INTO users(name, age, email) VALUES(:name, :age, :email)";
SqlParameterSource[] batchParams = users.stream()
.map(BeanPropertySqlParameterSource::new)
.toArray(SqlParameterSource[]::new);
return namedParameterJdbcTemplate.batchUpdate(sql, batchParams);
}

// 使用命名參數查詢
publicList<User>findByNameAndAge(String name,Integer age){
String sql ="SELECT * FROM users WHERE name LIKE :name AND age > :age";
SqlParameterSource paramSource =newMapSqlParameterSource()
.addValue("name","%"+ name +"%")
.addValue("age", age);
return namedParameterJdbcTemplate.query(sql, paramSource,
newBeanPropertyRowMapper<>(User.class));
}
}

8.2 自定義 RowMapper

importorg.springframework.jdbc.core.RowMapper;

importjava.sql.ResultSet;
importjava.sql.SQLException;

publicclassUserRowMapperimplementsRowMapper<User>{
@Override
publicUsermapRow(ResultSet rs,int rowNum)throwsSQLException{
User user =newUser();
        user.setId(rs.getInt("id"));
        user.setName(rs.getString("name"));
        user.setAge(rs.getInt("age"));
        user.setEmail(rs.getString("email"));
// 可以在這里進行額外的處理,如數據轉換等
return user;
}
}

// 使用自定義RowMapper
publicList<User>findAllWithCustomMapper(){
String sql ="SELECT * FROM users";
return jdbcTemplate.query(sql,newUserRowMapper());
}


責任編輯:武曉燕 來源: Solomon肖哥彈架構
相關推薦

2025-11-07 04:00:00

2025-11-11 07:54:21

2024-07-07 21:49:22

2022-02-07 07:48:17

MyBatisJavaORM

2024-03-27 10:14:48

2025-09-08 07:14:25

2025-09-04 01:33:00

Flowable工作流引擎

2025-09-05 07:13:13

2021-05-11 07:51:30

React ref 前端

2025-06-30 04:15:00

2022-02-28 10:05:12

組件化架構設計從原組件化模塊化

2025-10-30 07:45:06

2025-08-07 07:36:06

2024-12-12 09:00:28

2024-12-17 08:04:04

2025-04-02 07:29:14

2018-05-17 15:18:48

Logistic回歸算法機器學習

2025-11-13 08:08:15

2021-12-20 00:03:38

Webpack運行機制

2025-03-07 10:23:46

點贊
收藏

51CTO技術棧公眾號

日本一区二区在线不卡| 日韩视频精品在线观看| 91精品午夜视频| 欧美久久久久久久久久| 亚洲午夜未删减在线观看 | 欧美精品一级片| 欧美巨大xxxx| 欧美日韩久久久| 亚洲理论电影在线观看| 二区在线视频| 国产成人精品亚洲777人妖| 欧美在线视频免费观看| 黑人狂躁日本娇小| 日韩精品社区| 91精品国产综合久久香蕉麻豆| 大j8黑人w巨大888a片| 欧洲不卡av| 91片黄在线观看| 成人午夜在线视频一区| 亚洲天堂男人av| 欧美精品入口| 日韩在线高清视频| 国产精品815.cc红桃| 欧美一区一区| 91成人看片片| 日韩av一二三四区| 美女精品视频| 亚洲欧美一区二区久久| 日韩欧美国产二区| 特黄视频在线观看| 国产乱色国产精品免费视频| 青青久久av北条麻妃黑人| 久久久久久久久精| 天天天综合网| 国产一区二区三区在线看| 亚洲の无码国产の无码步美| 日韩三级精品| 7777精品伊人久久久大香线蕉完整版 | 成人福利在线视频| wwwwww在线观看| 亚洲综合另类| 亚洲3p在线观看| 亚洲国产精品午夜在线观看| 欧美a级片网站| 久久精品久久久久久国产 免费| 黄色av免费播放| 蜜桃国内精品久久久久软件9| 亚洲第一精品久久忘忧草社区| 国产不卡的av| 国产精品一区免费在线| 欧美日韩久久一区二区| 在线观看亚洲色图| 国产精品久久亚洲不卡| 在线亚洲欧美专区二区| 日韩福利视频在线| 天天综合网站| 欧美色国产精品| 国产小视频精品| 国产一区二区三区四区五区3d | 98精品在线视频| 日本天堂网在线观看| 在线欧美不卡| 欧美诱惑福利视频| 亚洲大尺度在线观看| 日本中文在线一区| 国产日韩欧美在线看| 国产一区二区三区黄片| 国产麻豆日韩欧美久久| 国产精品国产亚洲精品看不卡15| 亚洲精品久久久久avwww潮水| 国产成人一区在线| 国产午夜精品一区| 男生女生差差差的视频在线观看| 久久九九99视频| 天天综合狠狠精品| 黄色免费网站在线观看| 一区二区三区精品视频在线| 黄色大片在线免费看| 日韩伦理三区| 69堂国产成人免费视频| 美女网站视频在线观看| 蜜臀91精品国产高清在线观看| 国产小视频国产精品| 搜索黄色一级片| 亚洲国产日本| 国产精品视频26uuu| 亚洲精品国产精| 国产亲近乱来精品视频| 欧美性猛交内射兽交老熟妇| 麻豆视频在线看| 欧美性猛交xxxx黑人交| 风韵丰满熟妇啪啪区老熟熟女| 亚洲区小说区图片区qvod| 色偷偷综合社区| 久久免费精彩视频| 日本亚洲最大的色成网站www| 91香蕉亚洲精品| 性感美女视频一二三| 国产精品麻豆一区二区| 僵尸世界大战2 在线播放| 天然素人一区二区视频| 亚洲第一偷拍网| 青青草华人在线视频| 亚洲国产激情| 亚洲精品欧美极品| 成人精品一区二区| 亚洲不卡av一区二区三区| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 精品国产亚洲一区二区在线观看 | 国产精品无码在线| 婷婷精品进入| 国产999在线观看| 午夜久久久久久噜噜噜噜| 久久精品一区二区| 和岳每晚弄的高潮嗷嗷叫视频| 欧美美女福利视频| 亚洲乱码av中文一区二区| 九九热这里有精品视频| 久久99九九99精品| 日本高清视频一区二区三区 | 亚洲国产裸拍裸体视频在线观看乱了| 91激情视频在线| 伦理一区二区三区| 欧美大片免费看| 91九色蝌蚪91por成人| 久久久综合九色合综国产精品| 国产爆乳无码一区二区麻豆| 四虎国产精品永久在线国在线| 亚洲美女在线视频| 日本在线观看视频网站| 国产白丝网站精品污在线入口| 亚洲一区二区精品在线| 国产经典一区| 亚洲欧洲自拍偷拍| 五月天婷婷激情| caoporn国产一区二区| 丁香六月激情网| 亚洲日本视频在线| 欧美国产乱视频| 亚洲国产精品久久人人爱潘金莲 | 成人精品视频在线播放| 亚洲一区二区三区在线免费| 久久久精品在线| 国产精品一区二区av白丝下载| 国产精品网曝门| 在线免费观看av的网站| 成人写真视频| 国产精品久久久久久久久久ktv | 欧美午夜18电影| 久久久久国产精品www| 午夜老司机福利| 亚洲高清免费视频| 亚洲久久久久久| 国产美女诱惑一区二区| 欧美在线播放一区| 欧美free嫩15| 日韩视频免费中文字幕| 国产麻豆91视频| 亚洲精品高清在线| 亚洲欧洲国产视频| 999在线观看精品免费不卡网站| 国产精品久久久久久免费观看| 老牛影视精品| 亚洲天堂影视av| 91av久久久| 亚洲精品国产视频| 人妻无码中文久久久久专区| 午夜一级在线看亚洲| 日韩hmxxxx| 日韩精品一页| 欧美精品第一页在线播放| 手机看片一区二区三区| 在线看日韩精品电影| 中文字幕资源站| 国产xxx精品视频大全| 3d动漫一区二区三区| 精品一区二区三| 91免费高清视频| 爱啪啪综合导航| 在线观看国产精品淫| 99热这里只有精品1| 午夜a成v人精品| www.涩涩爱| 丁香天五香天堂综合| 日韩av一二三四区| 888久久久| 蜜桃久久精品乱码一区二区| 欧美系列精品| 海角国产乱辈乱精品视频| 九九热视频在线观看| 正在播放亚洲一区| 国产成人无码精品久久久久| 中文字幕第一区| 在线观看亚洲免费视频| 强制捆绑调教一区二区| 日韩极品视频在线观看 | 青青草原网站在线观看| 日韩成人动漫在线观看| 成人写真福利网| 中文在线免费二区三区| 久久亚洲一区二区三区四区五区高| 日韩有码第一页| 欧美精品乱码久久久久久| 午夜毛片在线观看| 亚洲精品乱码久久久久久日本蜜臀| 四虎永久免费影院| 国产精品77777| 亚洲不卡视频在线| 亚洲一区欧美二区| 成人国产在线看| 久久精品亚洲人成影院| 日本一区二区三区四区在线观看| 亚洲码欧美码一区二区三区| 国产日韩av高清| 成人av免费电影网站| 久久人人爽国产| 国产日产一区二区| 少妇av一区二区三区| 日本亚洲一区| 亚洲国产小视频| 亚洲av无码一区二区乱子伦| 欧美日韩成人综合| 国产黄网在线观看| 狠狠色噜噜狠狠狠狠97| 国产一级二级毛片| 亚洲男女一区二区三区| 久久精品色妇熟妇丰满人妻| 久久这里都是精品| 在线精品一区二区三区| 成人一级片网址| 精人妻一区二区三区| 国产剧情av麻豆香蕉精品| 欧美午夜aaaaaa免费视频| 久久高清国产| 国产91在线视频观看| 亚洲精品免费观看| av女优在线播放| 激情视频一区二区三区| 国产精品视频网站在线观看| 午夜国产一区| 黄色一级片国产| 欧美日韩第一区| 女人被男人躁得好爽免费视频| 亚洲有吗中文字幕| 四虎免费在线观看视频| 久久精品一区二区不卡| 99亚洲国产精品| 国产精品a级| r级无码视频在线观看| 一区二区亚洲| 国产精品va无码一区二区| 亚洲欧美久久久| 成年人黄色片视频| 免费在线观看日韩欧美| 欧美成人黄色网址| 精品午夜一区二区三区在线观看| 午夜一级免费视频| 国产一区二区视频在线播放| 可以看的av网址| 成人精品国产一区二区4080| 男人网站在线观看| 99久久精品99国产精品| 免费看黄色的视频| 国产精品女上位| 强乱中文字幕av一区乱码| 亚洲h动漫在线| 国产一区二区视频免费| 欧美日韩成人综合| 亚洲女同志亚洲女同女播放| 日韩电影中文 亚洲精品乱码| 国产小视频免费在线网址| 日韩在线中文字幕| 色av手机在线| 欧日韩不卡在线视频| 欧美xxxx网站| 国产精品日韩一区二区| 精品国产中文字幕第一页 | 亚洲人www| 激情视频综合网| 国产麻豆精品视频| 丝袜美腿中文字幕| 亚洲免费观看在线视频| 欧美一区二区激情视频| 欧美日韩精品一区二区在线播放| 亚洲成熟女性毛茸茸| 亚洲美女性视频| 伊人精品影院| 日韩av大片免费看| 国产成人视屏| 蜜桃999成人看片在线观看| 亚洲成人三区| 国产在线观看福利| 国产麻豆成人精品| 在线免费观看麻豆| 亚洲制服丝袜在线| 中国女人一级一次看片| 亚洲成人av片在线观看| av电影在线网| 欧美一区二区三区……| 成人动漫视频在线观看| 欧美在线一二三区| 欧美午夜不卡| 另类小说色综合| av一二三不卡影片| 9999热视频| 欧美无砖专区一中文字| 五月天婷婷激情网| 久久av在线播放| 欧美××××黑人××性爽| 国产福利不卡| 久久久久久美女精品| 国产福利影院在线观看| www.66久久| 黄色一级片中国| 欧美日韩国产经典色站一区二区三区 | 亚洲精品国产精品自产a区红杏吧| 国产传媒在线播放| 国产成人精品久久| 青青一区二区| 免费特级黄色片| 国产精品正在播放| 国产一级淫片久久久片a级| 色拍拍在线精品视频8848| 免费a视频在线观看| 久久99精品久久久久久青青91 | 91精品在线一区二区| av网页在线| 国产精品27p| 亚洲另类春色校园小说| 国产视频九色蝌蚪| www.欧美.com| 久草手机在线观看| 精品sm捆绑视频| 日韩精品亚洲人成在线观看| 亚洲淫片在线视频| 天天操夜夜操国产精品| gai在线观看免费高清| 国产精品人妖ts系列视频| www.久久网| 伊人久久免费视频| а√天堂资源国产精品| 日本在线视频一区| 日韩国产高清影视| 日本污视频网站| 欧美日韩激情一区| 蜜桃av在线免费观看| 91免费国产网站| 欧美视频导航| 极品白嫩的小少妇| 亚洲成人黄色影院| 欧美日韩伦理片| 国产精品第七影院| 清纯唯美日韩| 五月天丁香花婷婷| 亚洲综合精品久久| 日本黄色不卡视频| 欧美有码在线观看| 成人三级视频| 一区二区久久精品| 亚洲一二三四区不卡| 手机看片1024国产| 国产成人一区二区在线| 四虎成人精品永久免费av九九| 中文字幕视频三区| 亚洲精品写真福利| 国产77777| 日本不卡视频在线播放| 欧美成人自拍| 亚洲午夜精品在线观看| 偷拍一区二区三区四区| 免费在线一级视频| 成人免费网站在线观看| 亚洲先锋成人| 久久成人激情视频| 91超碰这里只有精品国产| 福利在线导航136| 秋霞毛片久久久久久久久| 国产真实乱对白精彩久久| 国产精品成人久久| 亚洲天堂一区二区三区| 秋霞一区二区| 成人黄色片视频| 亚洲视频每日更新| 青青草免费在线| 91丝袜美腿美女视频网站| 国产精品普通话对白| 91ts人妖另类精品系列| 精品国产乱码久久久久久久 | 国产一级淫片久久久片a级| 日韩精品中文字幕一区二区三区 | 免费黄色激情视频| 精品国产sm最大网站免费看| 成人全视频在线观看在线播放高清| 欧美日韩dvd| 欧美激情一二三区| 天天干,天天操,天天射| 91午夜理伦私人影院| 美女国产精品| 国产亚洲精品久久久久久无几年桃 | 欧美日韩成人在线|