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

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

Spring-基于Spring使用自定義注解及Aspect實現數據庫切換操作

瀏覽:184日期:2023-08-13 11:44:07

實現思路

重寫Spring的AbstractRoutingDataSource抽象類的determineCurrentLookupKey方法。

我們來看下Spring-AbstractRoutingDataSource的源碼

Spring-基于Spring使用自定義注解及Aspect實現數據庫切換操作

AbstractRoutingDataSource獲取數據源之前會先調用determineCurrentLookupKey方法查找當前的lookupKey。

Object lookupKey = determineCurrentLookupKey();DataSource dataSource = this.resolvedDataSources.get(lookupKey);.......return dataSource;

lookupKey為數據源標識,因此通過重寫這個查找數據源標識的方法就可以讓spring切換到指定的數據源.

從變量定義中可以知道resolvedDataSources為Map類型的對象。

private Map<Object, DataSource> resolvedDataSources;

示例

Spring-基于Spring使用自定義注解及Aspect實現數據庫切換操作

步驟一 新建Maven工程

依賴如下: pom.xml

<project xmlns='http://maven.apache.org/POM/4.0.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd'><modelVersion>4.0.0</modelVersion><groupId>com.artisan</groupId><artifactId>dynamicDataSource</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>dynamicDataSource</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><file.encoding>UTF-8</file.encoding><spring.version>4.3.9.RELEASE</spring.version><servlet.version>3.1.0</servlet.version><aspectj.version>1.8.1</aspectj.version><commons-dbcp.version>1.4</commons-dbcp.version><jetty.version>8.1.8.v20121106</jetty.version><log4j.version>1.2.17</log4j.version><log4j2.version>2.8.2</log4j2.version><testng.version>6.8.7</testng.version><oracle.version>11.2.0.4.0</oracle.version><jstl.version>1.2</jstl.version></properties><dependencies><!-- spring 依賴 --><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>${commons-dbcp.version}</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>${aspectj.version}</version></dependency><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>${testng.version}</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version><scope>test</scope></dependency><!-- oracle jdbc driver --><dependency><groupId>com.oracle</groupId><artifactId>ojdbc6</artifactId><version>${oracle.version}</version></dependency><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>${testng.version}</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version><scope>test</scope></dependency><!-- <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency> --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>${log4j2.version}</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>${log4j2.version}</version></dependency></dependencies><build><!-- 使用JDK1.7編譯 --><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.7</source><target>1.7</target></configuration></plugin></plugins></build></project>

步驟二 繼承AbstractRoutingDataSource并重寫determineCurrentLookupKey方法獲取特定數據源

package com.artisan.dynamicDB;import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;/** * * * @ClassName: DynamicDataSource * * @Description: * AbstractRoutingDataSource中的抽象方法determineCurrentLookupKey是實現數據源的route的核心 * .需要重寫該方法 * * @author: Mr.Yang * * @date: 2017年7月24日 下午8:28:46 */public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return DynamicDataSourceHolder.getDataSource();}}

步驟三 創建DynamicDataSourceHolder用于持有當前線程中使用的數據源標識

package com.artisan.dynamicDB;/** * * * @ClassName: DynamicDataSourceHolder * * @Description:創建DynamicDataSourceHolder用于持有當前線程中使用的數據源標識 * * @author: Mr.Yang * * @date: 2017年7月24日 下午8:23:50 */public class DynamicDataSourceHolder { /** * 數據源標識保存在線程變量中,避免多線程操作數據源時互相干擾 */ private static final ThreadLocal<String> dataSourceHolder = new ThreadLocal<String>(); /** * * * @Title: setDataSource * * @Description: 設置數據源 * * @param dataSource * * @return: void */ public static void setDataSource(String dataSource) { dataSourceHolder.set(dataSource); } /** * * * @Title: getDataSource * * @Description: 獲取數據源 * * @return * * @return: String */ public static String getDataSource() { return dataSourceHolder.get(); } /** * * * @Title: clearDataSource * * @Description: 清除數據源 * * * @return: void */ public static void clearDataSource() { dataSourceHolder.remove(); }}

步驟四 配置多個數據源和DynamicDataSource的bean

<?xml version='1.0' encoding='UTF-8' ?><beans xmlns='http://www.springframework.org/schema/beans' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:p='http://www.springframework.org/schema/p' xmlns:context='http://www.springframework.org/schema/context' xmlns:aop='http://www.springframework.org/schema/aop' xmlns:tx='http://www.springframework.org/schema/tx' xmlns:util='http://www.springframework.org/schema/util' xsi:schemaLocation='http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd'> <!-- 基類包,將標注Spring注解的類自動轉化Bean,同時完成Bean的注入 --> <context:component-scan base-package='com.artisan'/> <!-- 使用context命名空間,在xml文件中配置數據庫的properties文件 --> <context:property-placeholder location='classpath:jdbc.properties' /> <!-- 配置數據源--> <!-- 主站點的數據源 --> <bean destroy-method='close' p:driverClassName='${jdbc.driverClassNamePR}' p:url='${jdbc.urlPR}' p:username='${jdbc.usernamePR}' p:password='${jdbc.passwordPR}' /> <!-- 備用站點的數據源 --> <bean destroy-method='close' p:driverClassName='${jdbc.driverClassNameDR}' p:url='${jdbc.urlDR}' p:username='${jdbc.usernameDR}' p:password='${jdbc.passwordDR}' /> <!-- 主站點cc實例數據源 --> <bean destroy-method='close' p:driverClassName='${jdbc.driverClassNameCC}' p:url='${jdbc.urlCC}' p:username='${jdbc.usernameCC}' p:password='${jdbc.passwordCC}' /> <bean class='com.artisan.dynamicDB.DynamicDataSource'> <property name='targetDataSources' ref='dynamicDatasourceMap' /> <!-- 默認數據源 --> <property name='defaultTargetDataSource' ref='dataSourcePR' /> </bean> <!-- 指定lookupKey和與之對應的數據源 --> <util:map key-type='java.lang.String'> <entry key='dataSourcePR' value-ref='dataSourcePR' /> <entry key='dataSourceDR' value-ref='dataSourceDR' /> <entry key='dataSourceCC' value-ref='dataSourceCC' /> </util:map> <!-- 配置Jdbc模板 JdbcTemplate使用動態數據源的配置 --> <bean p:dataSource-ref='dynamicDataSource' /> <!-- 配置數據源注解的攔截規則,比如攔截service層或者dao層的所有方法,這里攔截了com.artisan下的全部方法 --> <bean /> <aop:config> <aop:aspect ref='dataSourceAspect'> <!-- 攔截所有XXX方法 --> <aop:pointcut expression='execution(* com.artisan..*(..))'/> <aop:before pointcut-ref='dataSourcePointcut' method='intercept' /> </aop:aspect> </aop:config> <!-- 配置事務管理器 --> <bean p:dataSource-ref='dynamicDataSource' /> <!-- 通過AOP配置提供事務增強,讓com.artisan包下所有Bean的所有方法擁有事務 --> <aop:config proxy-target-class='true'> <aop:pointcut expression='(execution(* com.artisan..*(..))) and (@annotation(org.springframework.transaction.annotation.Transactional))' /> <aop:advisor pointcut-ref='serviceMethod' advice-ref='txAdvice' /> </aop:config> <tx:advice transaction-manager='transactionManager'> <tx:attributes> <tx:method name='*' /> </tx:attributes> </tx:advice></beans>

配置到這里,我們就可以使用多個數據源了,只需要在操作數據庫之前只要DynamicDataSourceHolder.setDataSource(“dataSourcePR”)即可切換到數據源dataSourcePR并對數據庫dataSourcePR進行操作了。

問題:每次使用都需要調用DynamicDataSourceHolder#setDataSource,十分繁瑣,并且難以維護。

我們可以通過Spring的AOP和注解, 直接通過注解的方式指定需要訪問的數據源。 繼續改進下吧

步驟五 定義名為@DataSource的注解

package com.artisan.dynamicDB;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * * * @ClassName: DataSource * * * @Description: 注解@DataSource既可以加在方法上,也可以加在接口或者接口的實現類上,優先級別:方法>實現類>接口。 * 如果接口、接口實現類以及方法上分別加了@DataSource注解來指定數據源,則優先以方法上指定的為準。 * * @author: Mr.Yang * * @date: 2017年7月24日 下午9:59:29 */@Target({ ElementType.METHOD, ElementType.TYPE })@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface DataSource { // 和配置文件中 dynamicDatasourceMap中的key保持一致 public static String PR_RB = 'dataSourcePR'; public static String DR_RB = 'dataSourceDR'; public static String PR_CC = 'dataSourceCC'; /** * * * @Title: name * * @Description: 如果僅標注@DataSource 默認為PR_RB數據庫實例 * * @return * * @return: String */ String name() default DataSource.PR_RB;}

步驟六 定義AOP切面以便攔截所有帶有注解@DataSource的方法,取出注解的值作為數據源標識放到DynamicDataSourceHolder的線程變量中

package com.artisan.dynamicDB;import java.lang.reflect.Method;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.reflect.MethodSignature;/** * * * @ClassName: DataSourceAspect * * @Description: * 定義AOP切面以便攔截所有帶有注解@DataSource的方法,取出注解的值作為數據源標識放到DBContextHolder的線程變量中 * * @author: Mr.Yang * * @date: 2017年7月25日 上午10:51:41 */public class DataSourceAspect { /** * * * @Title: intercept * * @Description: 攔截目標方法,獲取由@DataSource指定的數據源標識,設置到線程存儲中以便切換數據源 * * @param point * @throws Exception * * @return: void */ public void intercept(JoinPoint point) throws Exception { Class<?> target = point.getTarget().getClass(); MethodSignature signature = (MethodSignature) point.getSignature(); // 默認使用目標類型的注解,如果沒有則使用其實現接口的注解 for (Class<?> clazz : target.getInterfaces()) { resolveDataSource(clazz, signature.getMethod()); } resolveDataSource(target, signature.getMethod()); } /** * * * @Title: resolveDataSource * * @Description: 提取目標對象方法注解和類型注解中的數據源標識 * * @param clazz * @param method * * @return: void */ private void resolveDataSource(Class<?> clazz, Method method) { try { Class<?>[] types = method.getParameterTypes(); // 默認使用類型注解 if (clazz.isAnnotationPresent(DataSource.class)) { DataSource source = clazz.getAnnotation(DataSource.class); DynamicDataSourceHolder.setDataSource(source.name()); } // 方法注解可以覆蓋類型注解 Method m = clazz.getMethod(method.getName(), types); if (m != null && m.isAnnotationPresent(DataSource.class)) { DataSource source = m.getAnnotation(DataSource.class); DynamicDataSourceHolder.setDataSource(source.name()); } } catch (Exception e) { System.out.println(clazz + ':' + e.getMessage()); } }}

步驟七 在spring配置文件中配置攔截規則

<!-- 配置數據源注解的攔截規則,比如攔截service層或者dao層的所有方法,這里攔截了com.artisan下的全部方法 --> <bean /> <aop:config> <aop:aspect ref='dataSourceAspect'> <!-- 攔截所有XXX方法 --> <aop:pointcut expression='execution(* com.artisan..*(..))'/> <aop:before pointcut-ref='dataSourcePointcut' method='intercept' /> </aop:aspect> </aop:config>

步驟八 使用注解切換多數據源

ExtractDataService.javapackage com.artisan.extractService;import java.sql.ResultSet;import java.sql.SQLException;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowCallbackHandler;import org.springframework.stereotype.Service;import com.artisan.dynamicDB.DataSource;/** * * * @ClassName: ExtractDataService * * @Description: 業務類,這里暫時作為測試多數據源切換用 * * @author: Mr.Yang * * @date: 2017年7月24日 下午9:07:38 */@Servicepublic class ExtractDataService { private static final Logger logger = LogManager .getLogger(ExtractDataService.class.getName()); private JdbcTemplate jdbcTemplate; @Autowired public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } /** * * * @Title: selectDataFromPR * * @Description: * * * @return: void */ @DataSource(name = DataSource.PR_RB) public void selectDataFromPR_RB() { String sql = 'select subs_id from owe_event_charge where event_inst_id = 10229001 '; jdbcTemplate.query(sql, new RowCallbackHandler() { @Override public void processRow(ResultSet rs) throws SQLException { logger.info(rs.getInt('subs_id')); } }); } @DataSource(name = DataSource.DR_RB) public void selectDataFromDR_RB() { // 改為通過注解指定DB // DynamicDataSourceHolder.setDataSource(DBContextHolder.DATA_SOURCE_DR); String sql = ' select a.task_comments from nm_task_type a where a.task_name = ’ALARM_LOG_LEVEL’ '; jdbcTemplate.query(sql, new RowCallbackHandler() { @Override public void processRow(ResultSet rs) throws SQLException { logger.info(rs.getString('task_comments')); } }); } @DataSource(name = DataSource.PR_CC) public void selectDataFromPR_CC() { // DBContextHolder.setDataSource(DBContextHolder.DATA_SOURCE_CC); String sql = 'select acc_nbr from acc_nbr where acc_nbr_id = 82233858 '; jdbcTemplate.query(sql, new RowCallbackHandler() { @Override public void processRow(ResultSet rs) throws SQLException { logger.info(rs.getString('acc_nbr')); } }); }}

步驟九 測試

package com.artisan;import java.io.IOException;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.core.LoggerContext;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.core.io.Resource;import org.springframework.core.io.ResourceLoader;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import com.artisan.extractService.ExtractDataService;/** * * * @ClassName: App * * @Description: 入口類 * * @author: Mr.Yang * * @date: 2017年7月24日 下午8:50:25 */public class App { public static void main(String[] args) { try { // 加載日志框架 log4j2 LoggerContext context = (LoggerContext) LogManager .getContext(false); ResourceLoader loader = new PathMatchingResourcePatternResolver(); Resource resource = loader.getResource('classpath:log4j2.xml'); context.setConfigLocation(resource.getFile().toURI()); // 加載spring配置信息 ApplicationContext ctx = new ClassPathXmlApplicationContext( 'classpath:spring-context.xml'); // 從容器中獲取Bean ExtractDataService service = ctx.getBean('extractDataService', ExtractDataService.class); // 從PR的RB實例中獲取數據 service.selectDataFromPR_RB(); // 從DR的RB實例中獲取數據 service.selectDataFromDR_RB(); // 從PR的CC實例中獲取數據 service.selectDataFromPR_CC(); } catch (IOException e) { e.printStackTrace(); } }}

其他代碼

log4j2.xml

<?xml version='1.0' encoding='UTF-8'?><!-- log4j2使用說明:使用方式如下:private static final Logger logger = LogManager.getLogger(實際類名.class.getName());--><!--日志級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --><!--Configuration后面的status,這個用于設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,你會看到log4j2內部各種詳細輸出--><!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設置間隔秒數--><configuration status='info' monitorInterval='180'> <!-- 文件路徑和文件名稱,方便后面引用 --> <Properties> <Property name='backupFilePatch'>D:/workspace/workspace-sts/backupOracle/log/</Property> <Property name='fileName'>backupOracle.log</Property> </Properties> <!--先定義所有的appender--> <appenders> <!--這個輸出控制臺的配置--> <Console name='Console' target='SYSTEM_OUT'> <!--控制臺只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)--> <ThresholdFilter level='trace' onMatch='ACCEPT' onMismatch='DENY' /> <!-- 輸出日志的格式--> <PatternLayout pattern='%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n' /> </Console> <!--這個會打印出所有的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面并進行壓縮,作為存檔--> <RollingFile name='RollingFile' fileName='${backupFilePatch}${fileName}' filePattern='${backupFilePatch}$${date:yyyy-MM}/app-%d{yyyyMMddHHmmssSSS}.log.gz'> <PatternLayout pattern='%d{yyyy.MM.dd ’at’ HH:mm:ss.SSS z} %-5level %class{36} %L %M - %msg%xEx%n' /> <!-- 日志文件大小 --> <SizeBasedTriggeringPolicy size='20MB' /> <!-- 最多保留文件數 DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件,這里設置了20 --> <DefaultRolloverStrategy max='20'/> </RollingFile> </appenders> <!--然后定義logger,只有定義了logger并引入的appender,appender才會生效--> <loggers> <!--過濾掉spring和mybatis的一些無用的DEBUG信息--> <logger name='org.springframework' level='INFO'></logger> <logger name='org.mybatis' level='INFO'></logger> <root level='trace'> <appender-ref ref='RollingFile'/> <appender-ref ref='Console'/> </root> </loggers></configuration>

jdbc.properties

################################ dbcp datasource pool ,basic configuration first.## the other parameters keep default for now , you can change them if you want ###############################Database in Lapazjdbc.driverClassNamePR=oracle.jdbc.driver.OracleDriverjdbc.urlPR=jdbc:oracle:thin:@172.25.243.4:1521:xxjdbc.usernamePR=xxxjdbc.passwordPR=xxxxxxxx#Database in Scluzjdbc.driverClassNameDR=oracle.jdbc.driver.OracleDriverjdbc.urlDR=jdbc:oracle:thin:@172.25.246.1:1521:xxjdbc.usernameDR=xxxjdbc.passwordDR=xxxxxxx#Database in Lapazjdbc.driverClassNameCC=oracle.jdbc.driver.OracleDriverjdbc.urlCC=jdbc:oracle:thin:@172.25.243.3:1521:xxjdbc.usernameCC=xxxjdbc.passwordCC=xxxxxx

運行結果:

Spring-基于Spring使用自定義注解及Aspect實現數據庫切換操作

代碼

https://github.com/yangshangwei/DynamicDataSource

以上這篇Spring-基于Spring使用自定義注解及Aspect實現數據庫切換操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 日韩av在线不卡 | 一区二区久久 | 一区二区在线视频免费观看 | 国产精品91久久久久 | 成人免费淫片aa视频免费 | 日韩成人免费视频 | 在线日韩视频 | 综合天天| 久免费视频 | 国产精品一区二区三区在线免费观看 | 日韩www | 成人国产一区 | 国产精品69毛片高清亚洲 | 国偷自产一区二区免费视频 | 国产午夜精品一区二区三区免费 | 日韩电影三级 | 日韩色在线 | 国产精品高清在线 | 色爽女人免费 | 欧美激情一区二区三级高清视频 | 91亚洲免费 | 午夜精品久久久久久久星辰影院 | 欧美日韩成人一区 | 日韩精品一二三 | 欧美五月| 欧美视频三区 | 久久精品91 | 久久精品久 | 精品久久久久久久久久久久 | 国产一级黄色大片 | 中文字幕av亚洲精品一部二部 | 中文字幕一区在线观看视频 | 99福利视频 | 越南性xxxx精品hd | 天堂精品 | 一区二区三区中文字幕 | 亚洲视频观看 | 亚洲国产精品99久久久久久久久 | 波多野结衣在线网址 | 欧美啪啪一区二区 | 久草在线在线精品观看 | 亚洲免费在线观看 | 久久伊人免费视频 | 一区二区在线 | 国产精一区二区 | 成人av片在线观看 | 国产精品一区一区三区 | 日本高清视频在线播放 | 欧美日韩亚洲成人 | 国产精品国产三级国产aⅴ 羞羞的视频在线 | 自拍在线| 国产麻豆乱码精品一区二区三区 | 久久成人国产精品 | 性色av一区二区三区 | 久久91 | 国产三级毛片 | 日韩视频在线免费 | 亚洲国产精品成人综合色在线婷婷 | 日韩欧美精品一区二区三区 | 欧美日韩一区二区三区在线观看 | 日韩av成人 | 国产乱码精品一区二区三区中文 | 欧美综合在线观看 | 久久精品店 | 成人午夜激情 | 99视频精品 | 国产精品久久久久久吹潮 | 欧美天天 | 久热久热| 日韩精品在线一区 | 久久不射电影网 | 另类国产ts人妖高潮系列视频 | 日韩精品视频免费看 | 免费成人在线网站 | 国产亚州av | 久久精品欧美电影 | 中文在线播放 | 久久二区三区 | 日韩www | 日韩精品一区二区在线观看 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 亚洲成人基地 | 欧美午夜精品久久久久久蜜 | 精品欧美一区二区在线观看视频 | 风间由美一区二区三区在线观看 | 欧美日韩在线电影 | 日韩国产欧美一区 | 欧美激情国产日韩精品一区18 | 亚洲一区二区三区四区五区中文 | 中文字幕国产在线视频 | 国产精品69毛片高清亚洲 | 欧美一a一片一级一片 | 欧美日韩精品区 | 91久久久精品视频 | 日韩www | 国产精品女同一区二区久久夜 | 国产天天操 | 国产精品免费观看 | 精品久久影院 | 久久中文字幕视频 | 夜夜爽99久久国产综合精品女不卡 | 综合色婷婷一区二区亚洲欧美国产 | 亚洲成av人乱码色午夜 | 免费欧美一级 | 91精品国产高清一区二区三区 | 国产精品无码永久免费888 | 99精品欧美一区二区三区综合在线 | 色噜噜一区二区 | xxxx午夜| 中国一级毛片免费 | 国产精品成人3p一区二区三区 | 国产精品视频免费观看 | 国产成人在线网站 | 日韩一级视频 | 成人免费在线视频 | 欧美日韩在线一区二区 | 日韩欧美精品一区二区三区 | 黄色国产大片 | 天天操狠狠操 | 成人免费视频网站在线看 | 欧美色v| 亚洲高清视频在线 | 久久一二区 | 午夜男人网 | 亚洲狠狠爱一区二区三区 | 国产精品久久久久久久午夜片 | 99热在线看 | 欧洲毛片| 亚洲成人网一区 | 国产亚洲精品久久久优势 | 午夜精品久久久久久 | 国产福利一区二区 | 日韩一区二区在线电影 | 国产精品25p | 91大神xh98hx在线播放 | 一级色网站 | 在线欧美成人 | 人人插| 婷婷伊人 | av网站观看| 成人一级视频在线观看 | 欧美日韩亚洲一区二区 | 超碰人人射 | 欧美一区二区免费 | 色综合一区 | 日韩欧美不卡 | 成人一级视频在线观看 | 日韩午夜影院 | 国产一区不卡 | 日韩亚洲一区二区 | 国产精品香蕉在线观看 | 久久精品一区二区三区四区 | 91精品久久久久久久 | 自拍偷拍一区二区三区 | 国产精品美女久久久久aⅴ国产馆 | 日韩av一区二区三区四区 | 精品欧美乱码久久久久久 | 最新超碰| 国产91在线播放精品 | 刺激网 | 国产精品无码专区在线观看 | 日本一区二区三区免费观看 | av毛片免费看 | 欧美一级在线免费观看 | 欧美国产一区二区 | 国内久久精品 | 精品毛片 | 香蕉视频91 | 国产精品久久7777 | 欧美全黄 | 三级在线观看 | 国产成人精品一区二区在线 | 国产一区二区精品在线观看 | 亚洲精品一区二区三区蜜桃久 | 久久久高清 | 99国内精品久久久久久久 | 97超碰站| yiren22成人网| 午夜视频网站 | www.欧美亚洲| 免费看片一区二区三区 | 日本女人高潮视频 | 亚洲视频三区 | 日日操av| 999国产在线视频 | а天堂中文最新一区二区三区 | 日本视频黄| av国产精品 | 精品久久久久久久 | 99久久精品国产一区二区三区 | 日本高清视频在线播放 | 日韩毛片免费看 | 亚洲精品在线免费观看视频 | 国产精品视频久久 | 国产欧美一区二区三区在线看 | 日本亚洲精品成人欧美一区 | 一区二区免费 | 色婷婷一区二区三区四区 | 91高清视频在线观看 | 日韩在线精品 | 欧美视频在线免费 | 亚洲天堂一区二区 | 国产精品久久久一区二区 | 黄视频网站免费看 | 91 在线观看 | 天天天天天天天天干 | 99re热精品视频国产免费 | 在线播放国产精品 | 婷婷丁香综合 | 一级日韩片 | 国产精品毛片久久久久久久 | 日本成人高清视频 | 国产美女www爽爽爽免费视频 | 国产成人99久久亚洲综合精品 | 久久国产精品一区二区三区 | 国产综合亚洲精品一区二 | 精品一区二区久久久久久久网站 | aaa在线免费观看 | 国产在线一区二区三区 | 在线播放91| 成人黄色在线观看 | 国产成人久久 | 91精品久久久久 | 欧美成年黄网站色视频 | 欧美午夜精品久久久久久人妖 | 老司机深夜福利视频 | 日干夜操 | 国产一区二区影院 | 亚洲美女一区二区三区 | 国产视频久久 | 亚洲香蕉视频 | 国产成人综合网 | 高清国产一区二区三区 | 国产黄色大片免费观看 | 欧美a视频| xvideos视频 | 精品久久中文字幕 | 国产最好的av国产大片 | 99精品久久精品一区二区爱城 | 一区二区手机在线 | 久久国产精品免费一区二区三区 | 亚洲欧美日韩另类精品一区二区三区 | 嫩草网站入口 | 国产九九九 | 伊人手机在线视频 | www久久精品| 久久人体 | 亚洲精品久久久久久久久久久 | www久久精品 | 国产小视频在线看 | 欧美福利网址 | 91操操 | 国产精品久久久久久久浪潮网站 | 免费 视频 1级 | 在线国产一区二区 | 欧美精品成人一区二区三区四区 | 精品亚洲一区二区三区 | 久久久99精品免费观看 | 亚洲精品自在在线观看 | 久久的爱| 伊人久久综合 | 91国内精品 | 欧美日韩视频 | 看a网址| 欧美一级久久久 | 日韩视频精品在线观看 | 最近韩国日本免费观看mv免费版 | 免费观看一级淫片 | 亚洲人成在线播放 | 国产精品香蕉 | 欧美日韩国产一区二区三区不卡 | 国产高清视频在线 | 电影91久久久 | 成人黄色片网站 | 国产精品九九九 | 亚洲成人另类 | 午夜免费福利影院 | 国产精品高潮呻吟av久久4虎 | 国产成人一区二区三区 | 国内精品视频 | а天堂中文最新一区二区三区 | 久久久久久久91 | 一区二区三区国产在线观看 | 美女久久久久久久久久久 | 日韩视频在线免费观看 | 在线播放三级 | 久久亚洲一区二区三 | 久久1区 | 日韩三级电影免费观看 | 成人日韩 | 国产精品免费一区二区三区四区 | 欧美日韩国产在线播放 | 超碰高清 | www.久久99| 午夜精品一区二区三区在线观看 | www.久久久.com| 日本人做爰大片免费观看一老师 | 天堂久久久久久 | 男女国产视频 | 亚洲精品乱码久久久久久不卡 | a级在线观看 | 日韩一区二区三区在线看 | 欧美日韩视频 | 久国产精品视频 | 欧美一区永久视频免费观看 | 日本中文一区二区 | 亚洲黄色高清视频 | 天天影视网色香欲综合网无拦截 | 国产精品欧美日韩在线观看 | 日韩精品视频在线观看一区二区 | 手机在线观看av | 国产视频第一页 | 国产1区2区 | 在线观看中文 | 欧美精品亚洲精品日韩精品 | 精品国产乱码久久久久久闺蜜 | 久久亚洲黄色 | 无码日韩精品一区二区免费 | 成人午夜免费视频 | 成人免费在线观看视频 | 中文字幕乱码亚洲精品一区 | 成人亚洲视频 | 一区免费 | 在线免费观看黄 | 亚洲不卡网站 | 日韩中文在线 | 久久精美视频 | 91欧美在线| 81精品国产乱码久久久久久 | 欧美精品久久久久久久久 | 国产精品片aa在线观看 | 欧美亚洲一区二区三区 | 99精品免费在线 | 亚洲精品一区二三区不卡 | 国产精品高清在线 | 一区二区免费在线视频 | 久久porn| 99精品视频在线观看 | 91视频国产一区 | 欧美精品国产精品 | av在线免费观看一区二区 | 国产一区二区成人 | 久草在线在线精品观看 | 亚洲高清一区二区三区 | 中文字幕永久第一页 | 国产精品1区2区在线观看 | 日本激情在线 | 免费成人毛片 | 亚洲精品乱码久久久久久蜜桃图片 | 亚洲福利片| 国产精品一区二区久久久久 | 欧美激情在线观看 | 国产成人av在线播放 | 二区三区在线 | 亚洲精品一区二区三区蜜桃久 | 精品日韩欧美一区二区三区在线播放 | 婷婷丁香六月天 | www.9191| 久草视频免费在线播放 | 一区三区视频 | 色综合免费视频 | 精品日韩在线 | 日日日操 | av看片 | 最新中文字幕 | 国产综合亚洲精品一区二 | 中文字幕在线观看 | 国产三级视频 | 成人看片网| 日韩一区免费观看 | 国产精品久久久久久久电影 | 亚洲精品乱码久久久久久按摩观 | 亚洲欧美激情另类 | 欧美日韩国产中文 | 免费一区二区三区 | 高清国产一区二区三区四区五区 | 久久精品美女 | 在线观看免费黄色 | 91精品国产综合久久久久久丝袜 | 久久久一| 久久一区二区视频 | av免费观看在线 | 综合色成人| 色av综合在线 | 爱爱视频在线观看 | 欧美日韩精品免费观看视频 | 久久精品国产免费 | 欧美日韩中文字幕 | 国产日产精品一区二区三区四区 | 久久午夜影院 | 国产精品一区二 | 日韩城人网站 | 91亚洲日本aⅴ精品一区二区 | 国产一区中文字幕 | 国产精品视频一区二区三区 | 99视频 | 成人在线视频网站 | 日韩在线观看视频免费 | 国产欧美在线一区二区 | 国产超碰在线观看 | 综合久久综合久久 | 国产精品中文字幕在线播放 | 国产精品2 | 碰在线视频 | 国产福利一区二区 | 青青草av电影 | 亚洲欧洲精品视频在线观看 | 国产激情性色视频在线观看 | 日韩国产一区二区三区 | 亚洲一区二区三区在线免费观看 | 日韩在线视频第一页 | 亚洲毛片网站 | 91精品国产自产91精品 | 日韩视频一区二区三区 | 亚洲第一网站 | 亚洲精品久久久久久久久久久 | 国产丝袜一区 | 国产一区二区三区免费 | 久久一区二区视频 | 午夜精品久久久久久久久久久久 | 色婷综合网| 国产噜噜噜噜噜久久久久久久久 | 亚洲国产精品成人久久久 | 久久99精品视频 | 天天干狠狠操 | 亚洲精品视频免费看 | 日韩综合色 | 超级乱淫片国语对白免费视频 | 在线观看亚洲精品 | 在线观看一级片 | 国产精品久久久久一区二区三区 | 国产精品美女在线观看 | 国产在线不卡 | 日本不卡精品 | 亚洲国产免费 | 精品久久中文字幕 | 欧美精品一 | 亚洲精选国产 | 天堂欧美城网站网址 | 婷婷国产成人精品视频 | 亚洲精品国产一区 | 成人在线视频一区二区 | 蜜桃视频在线播放 | 国产精品1| 亚洲品质自拍视频网站 | 久久久91 | 欧美午夜精品久久久 | 久久精品小视频 | 久久人人爽人人爽人人片av软件 | 国产在线一级视频 | www.亚洲| 亚洲人成人一区二区在线观看 | 91精品国产91久久久久久蜜臀 | 一区在线观看 | 久久九九精品久久 | 亚洲一区中文字幕 | www.视频在线观看 | 国产精品久久国产精品 | 一区二区日韩精品 | 亚洲自拍在线观看 | 中文字国产精久久无 | 国产精品久久久av | 久久国产欧美日韩精品 | 欧美日韩亚洲一区二区 | 亚洲免费视频网站 | 中文字幕在线观看第一页 | 日韩欧美一区二区三区久久婷婷 | 午夜影院男女 | 午夜精品久久久久久久久久久久 | 久久久99精品免费观看 | 久久久久久久久一区 | 天天综合网7799精品 | 黄色毛片观看 | 国产日韩欧美在线 | 天天插天天操 | 国产亚洲欧美在线 | 欧美在线观看免费观看视频 | 欧美视频免费在线 | 一区二区三区亚洲 | 永久91嫩草亚洲精品人人 | 国产欧美精品一区二区三区 | 亚洲欧美日韩国产综合精品二区 | 欧美一区二区在线视频 | www国产亚洲精品久久网站 | 国产精品一区亚洲二区日本三区 | 亚洲天堂中文字幕 | 亚洲精品免费在线观看 | 久久激情网站 | 日本精品久久久一区二区三区 | 综合 欧美 亚洲日本 | 日韩综合一区二区 | 一级在线观看 | 99亚洲| 亚洲情综合五月天 | 天堂网av2020| 日韩精品av一区二区三区 | 大象一区| www日批| www四虎com | 国内福利视频 | 亚洲成人久久久 | 日韩一区二区三区在线观看 | 久久九九国产精品 | 密室大逃脱第六季大神版在线观看 | 午夜亚洲| www.日韩精品.com | 久久99视频精品 | 精品亚洲一区二区三区四区五区 | av黄在线观看 | 久久国产精品无码网站 | 国产h片在线观看 | 日韩特黄一级欧美毛片特黄 | 中文字幕一页二页 | 91综合在线观看 | 日韩精品一区二区三区视频播放 | 国产精品久久久久久久久久妞妞 | 精品一区二区久久 | 精品在线一区 | 国产精自产拍久久久久久 | 国产精品99久久久久久动医院 | 日日干天天操 | 99久久免费视频在线观看 | 在线涩涩| 欧美在线三级 | 日本久久精品一区二区 | 91九色在线观看 | 亚洲国产成人av好男人在线观看 | 国产在线中文字幕 | 国产精品久久久久久久7电影 | 91免费在线 | 成人在线观看免费视频 | 亚洲精品视频在线观看网站 | 国精产品一区二区三区有限公司 | 日本中文字幕一区二区 | 午夜噜噜噜 | www久| 高清国产一区二区三区四区五区 | 久久精品国产视频 | 日韩午夜在线 | 中文字幕在线免费 | 激情网站免费观看 | 天天操天天干天天插 | 一区二区中文字幕 | 国产精品一区二区不卡 | 国产精品久久久久久妇女6080 | 久久久久久九九九九九九 | 97碰碰碰| 欧美国产一区二区 | 国产日产精品一区二区三区四区 | 亚洲三级在线播放 | 综合久久99 | 99久久婷婷国产精品综合 | 在线视频国产一区 | 欧美不卡| 九九只有精品 | 91在线免费观看 | 亚洲精品中文字幕中文字幕 | 九九天堂 | 日韩福利影院 | 久久精品国产精品 | 亚洲成av | 亚洲久草 | 日韩视频免费 | 国产在线一区二区三区 | 午夜午夜精品一区二区三区文 | 国产成人啪精品午夜在线观看 | 午夜精品久久久久 | 亚洲男人的天堂网站 | 亚洲日韩aⅴ在线视频 | 日本狠狠操 | 91色在线观看 | 夜夜爽99久久国产综合精品女不卡 | 日干夜操 | 97伦理网| 欧美一区二区三区视频在线观看 | 久久精品欧美一区二区三区不卡 | 亚洲人黄色片 | 看免费毛片 | 国产高清在线精品一区二区三区 | 亚洲综合二 | 亚洲一二三区在线观看 | 韩国精品 | 亚洲精品成人网 | 午夜av影视 | 欧美性猛交xxxx黑人猛交 | 中文字幕亚洲综合久久久软件 | 亚洲毛片网站 | 女男羞羞视频网站免费 | 欧美猛交ⅹxxx乱大交视频 | 亚洲精品资源在线观看 | 国产一区二区影院 | 久久久一区二区三区 | 蜜臀av在线播放一区二区三区 | 白浆在线播放 | 色一色视频 | 91国内视频在线观看 | 亚洲精品一二三 | 欧美亚洲一区二区三区 | 久久精品国产一区二区三区不卡 | 久久久久久毛片免费观看 | 天天干狠狠干 | 国产日韩欧美一区二区在线观看 | 免费成人在线网站 | 国产精品一区二 | 国产高清一级片 | 男人天堂视频网 | 久久99视频精品 | 日韩中字在线观看 | 国产欧美久久久久久 | 可以免费看黄视频的网站 | 国产欧美精品一区二区三区四区 | 欧美自拍网 | 欧美午夜寂寞影院 | 欧洲另类在线1 | 日韩视频不卡 |