日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 數(shù)據(jù)庫 > DB2 > 正文

將XML應(yīng)用程序從DB2 8.x遷移到Viper

2024-09-06 23:58:11
字體:
供稿:網(wǎng)友

簡介

db2 universal database (udb) version 8.x 中的 xml 支持基于 db2 的關(guān)系基礎(chǔ)設(shè)施。在 db2 viper 版本之前,xml 數(shù)據(jù)要么原樣存儲為字符大對象 (clob),要么被分解到關(guān)系表中。

相反,db2 udb version 9.1 具有對 xml 數(shù)據(jù)的真正本機(jī)支持。xml 現(xiàn)在被當(dāng)作新的數(shù)據(jù)類型,xml 數(shù)據(jù)存儲在經(jīng)過解析的帶注釋的樹中,獨(dú)立于關(guān)系數(shù)據(jù)存儲。基于 xml 模式的 xml 索引已經(jīng)引入,同時(shí)還引入了對用于查詢和發(fā)布 xml 數(shù)據(jù)的語言 xquery 和 sql/xml 的支持。為了理解這些新的 xml 特性對遷移的重大意義,需要將 db2 8.x 中用于存儲和查詢 xml 數(shù)據(jù)的不同技術(shù)與 db2 udb version 9 中可用的類似的或新的 xml 功能相比較。

本文是關(guān)于將 xml 應(yīng)用程序從 db2 8.x 遷移到 db2 viper 的三篇系列文章中的第一篇。該系列從描述一個(gè)基于 java 的存儲過程開始,您可以使用該存儲過程來對 xml 數(shù)據(jù)執(zhí)行子文檔更新。您可以下載更新后的存儲過程的源代碼和 jar 文件,并根據(jù)說明安裝它。

第二篇文章比較 db2 version 8.x 中和 db2 viper 中的 xml 特性。然后簡要討論 db2 viper 中引入的新 xml 特性,并詳細(xì)介紹新 xml 支持對于遷移現(xiàn)有基于 xml 的應(yīng)用程序的重大意義。這篇文章還包括基于 java 的實(shí)用工具的源代碼,該工具用于幫助生成遷移數(shù)據(jù)庫對象時(shí)所需的腳本。

本系列的最后一篇文章介紹分步示例遷移場景。它包括示例場景的源代碼。

更新存儲過程

對于本機(jī)存儲在 db2 中的 xml 文檔,不存在用于執(zhí)行子文檔更新的開箱即用的功能。缺少該功能的原因是,目前還沒有定義 xquery 中更新的標(biāo)準(zhǔn)。

該問題的一種解決方案是,將文檔交給客戶機(jī),修改它,然后再將其保存到數(shù)據(jù)庫中。該方法受到客戶機(jī)環(huán)境的 xml 功能的限制,并且還要求專家級的人員編寫基于文檔對象模型 (dom) 的客戶機(jī)。

通過創(chuàng)建更新存儲過程,可以更新數(shù)據(jù)庫中的 xml 文檔而無需將其交給客戶機(jī)。該存儲過程支持對本機(jī)存儲在數(shù)據(jù)庫中的 xml 文檔進(jìn)行部分更新。

存儲過程允許:

更改目標(biāo) xml 文檔中任何文本或?qū)傩怨?jié)點(diǎn)的值

使用另一個(gè) xml 元素替換 xml 文檔中的元素節(jié)點(diǎn)(及其所有子節(jié)點(diǎn))

刪除 xml 文檔中的節(jié)點(diǎn)

插入新元素

多次更新源文檔

更新多個(gè)源文檔

使用修改的 xml 文檔替換另一個(gè) xml 文檔

將修改的文檔插入新記錄

更新信息可以:

靜態(tài)地嵌入更新調(diào)用中

使用 sql 在運(yùn)行時(shí)動態(tài)地創(chuàng)建

使用算術(shù)表達(dá)式基于初始文本或?qū)傩灾颠M(jìn)行計(jì)算

注意:在后臺,更新存儲過程仍然執(zhí)行完整的文檔更新。

 

 

xmlupdate 命令

db2xmlfunctions.xmlupdate (commandxml、querysql、updatesql、errorcode、errormsg)

commandxml —— 該參數(shù)是一個(gè)用于封裝更新命令的 xml 字符串。這些命令將應(yīng)用到由 querysql 所選擇的 xml 文檔。

該命令的結(jié)構(gòu)是:

<updates namespaces=""> <update using="" col="" action="" path="">update value</update> </updates>

—— 這是用于包裝所有更新命令元素的根元素。

@namespace —— 該屬性的值應(yīng)該是由分號分隔的 “前綴:名稱空間” 字符串。前綴然后用于在 xml 文檔中導(dǎo)航時(shí)使用的任何路徑表達(dá)式中。

essential —— 否(僅當(dāng)在任何路徑中使用名稱空間時(shí)才需要它)。

即使是默認(rèn)名稱空間也必須用一個(gè)前綴進(jìn)行限定。

—— 該元素定義需要在目標(biāo) xml 文檔上執(zhí)行的每個(gè)修改。

occurrence —— 可以定義這些元素中的一個(gè)或多個(gè)。

每次出現(xiàn)處理文檔的一個(gè)修改。

@col —— 該屬性的值應(yīng)該是對應(yīng)于要在 querysql 中修改的列位置的編號。

essential —— 是。

valid value —— 列位置從 1 開始。

@path —— 該屬性的值是目標(biāo) xml 文檔中節(jié)點(diǎn)的 xpath 位置。如果路徑無效,則存儲過程將中止。

essential —— 是。

valid value —— xpath 表達(dá)式。

如果要在 xpath 中使用名稱空間,請確保設(shè)置名稱空間屬性。

不能將通配符用于名稱空間。

@using —— 該屬性的惟一有效值是 sql。如果該屬性存在并設(shè)置為 sql,那么 update value( 元素的子節(jié)點(diǎn))被視為一個(gè) sql 查詢。查詢結(jié)果的第一行中的第一列將用作新的 update value。如果查詢失敗,那么存儲過程將中止。

essential —— 否。

valid value —— sql。

對于 xquery,可以使用關(guān)鍵字 xquery,也可以使用 sql/xml 函數(shù)將 xquery 嵌入 sql。

@action —— 該屬性定義將在 xml 文檔中的目標(biāo)節(jié)點(diǎn)(使用 @path 屬性中定義的 xpath 來定位)上進(jìn)行的操作。如果操作失敗,那么存儲過程將中止。

essential —— 否。如果未設(shè)置操作,則假定是一個(gè)替換操作。

valid value —— 替換、追加、刪除和計(jì)算:

replace —— 使用 update value 替換目標(biāo)節(jié)點(diǎn)。

append —— 將 update value 作為子節(jié)點(diǎn)追加到目標(biāo)節(jié)點(diǎn)。

delete —— 刪除目標(biāo)節(jié)點(diǎn)。

compute —— 將 update value 當(dāng)作參數(shù)化的表達(dá)式。表達(dá)式中的問號 (?) 將由目標(biāo)節(jié)點(diǎn)的現(xiàn)有文本值替換。然后,計(jì)算表達(dá)式,得到的值將替換目標(biāo)節(jié)點(diǎn)中的現(xiàn)有值。計(jì)算出的值的 xpath 只能是葉節(jié)點(diǎn)。

update value —— 這為每個(gè)更新命令 (//update/*) 的子節(jié)點(diǎn)。它可以是文本節(jié)點(diǎn),也可以是元素。

essential —— 否。對于 action=delete,不需要它。

valid value —— 當(dāng) @using 屬性被設(shè)置為 sql 時(shí),子節(jié)點(diǎn)應(yīng)該是文本值。它被當(dāng)作 sql 表達(dá)式。當(dāng) @action 屬性被設(shè)置為 compute 時(shí),子節(jié)點(diǎn)應(yīng)該是文本值。它被當(dāng)作參數(shù)化表達(dá)式。在所有其他情況下,子節(jié)點(diǎn)都視為要替換的值。

querysql —— 任何用于檢索需要更新的 xml 文檔的有效 sql 選擇語句。

essential —— 是。

valid value —— 只能選擇 xml 文檔。如果選擇了其他列,存儲過程就會中止。

updatesql —— 它表示參數(shù)化的更新 sql。修改的 xml 文檔作為運(yùn)行時(shí)參數(shù)被綁定到更新 sql。它允許將修改的 xml 文檔保存到數(shù)據(jù)庫中的其他 xml 列中。

essential —— 否。如果該參數(shù)為 null,則使用可更新的游標(biāo)來修改所選的列。

重要事項(xiàng):從命令行處理器 (clp) 執(zhí)行更新存儲過程時(shí),始終需要設(shè)置 updatesql 參數(shù)的值。如果將這個(gè)值設(shè)置為 null 或空字符串,clp 會拋出 jcc 異常:column not updatable。當(dāng)您從應(yīng)用程序代碼 (java) 內(nèi)部調(diào)用更新存儲過程時(shí),將發(fā)生此情況(即 updatesql 設(shè)置為 null)。

errorcode —— 值為 -1 指示存儲過程因發(fā)生某種錯(cuò)誤而中止。如果更新成功,則返回指示已更新的記錄數(shù)的正值。

errormsg —— 錯(cuò)誤消息,包括 xml 解析器和 jcc 驅(qū)動程序拋出的任何異常。

注意:如果得到 java.lang.outofmemoryerror,應(yīng)該增加 java 堆大小:

db2 update dbm cfg using java_heap_sz 1024

 

設(shè)置存儲過程

首先需要將更新存儲過程 jar 安裝到 db2 中。這個(gè)過程僅需執(zhí)行一次。下一步,對于每個(gè)數(shù)據(jù)庫,需要分別注冊存儲過程。

重要事項(xiàng):如果希望在存儲過程中執(zhí)行 xqueries,那么需要為 db2 設(shè)置 jcc 驅(qū)動程序。確保 db2 在運(yùn)行,然后從 db2 命令窗口執(zhí)行以下命令:

db2set db2_use_db2jcct2_jroutine=on

設(shè)置更新存儲過程的步驟

通過執(zhí)行以下步驟編譯 java 代碼并創(chuàng)建 db2xmlfunctions.jar 文件。

注意:db2xmlfunctions.jar 還可以從 下載 部分下載。如果您選擇下載該文件,則跳過 第 2 步。

創(chuàng)建目錄 /temp/samples。

將 xmlupdate_code.zip(可以在 下載 部分找到)復(fù)制到 temp 目錄。

將 xmlupdate.java 和 xmlparse.java 文件解壓到 /temp/samples 目錄。

編譯 java 文件并為 udf 創(chuàng)建 jar 文件。

在 microsoft windows 上,打開 db2 命令窗口:

set classpath= .;%db2path%/java/db2java.zip; %db2path%/java/db2jcc.jar; %db2path%/java/db2jcc_license_cisuz.jar; "%db2path%/java/jdk/bin/javac.exe" -d . *.java "%db2path%/java/jdk/bin/jar" cvf db2xmlfunctions.jar com/ibm/db2/xml/functions/*.class

在 aix 上,將 db2path 設(shè)置為 db2 sqllib 目錄:

classpath=$db2path/java/sqlj.zip:$db2path/java/db2java.zip $db2path/java/jdk/bin/javac.exe" -d . *.java $db2path/java/jdk/bin/jar" cvf db2xmlfunctions.jar com/ibm/db2/xml/functions/*.class

注意:上述命令假定使用 sh 或 bash shell。根據(jù)需要更改為 csh、tsh 等。

在 db2 中安裝存儲過程:

db2 -t connect to your_dbname&yuml; call sqlj.install_jar('file:/temp/samples/db2xmlfunctions.jar' , db2xmlfunctions,0);

在數(shù)據(jù)庫中注冊存儲過程:

create procedure db2xmlfunctions.xmlupdate( in commandsql varchar(32000), in querysql varchar(32000), in updatesql varchar(32000), out errorcode integer, out errormsg varchar(32000)) dynamic result sets 0 language java parameter style java no dbinfo fenced null call modifies sql data program type sub external name 'db2xmlfunctions:com.ibm.db2.xml.functions.xmlupdate.update' ; terminate;

刪除存儲過程

如果更改了存儲過程,那么在注冊新版本之前應(yīng)該首先從 db2 卸載它:

drop procedure db2xmlfunctions.xmlupdate(varchar(32000), varchar(32000),varchar(32000),integer, varchar(32000)); call sqlj.remove_jar(db2xmlfunctions);

 

 

xmlupdate 示例

對于 xmlupdate 示例,請執(zhí)行以下步驟:

創(chuàng)建測試表:

create table xmlcustomer(cid integer not null primary key, info xml );

將示例 xml 文檔插入表中:

insert into xmlcustomer (cid, info ) values (1006 , xmlparse ( document ' <customerinfo xmlns=" http://posample.org " cid="1006"> <name>hardeep singh</name> <addr country="united states"> <street>555 bailey ave</street> <city/> <prov-state>ca</prov-state> <pcode-zip> 95141</pcode-zip> </addr> <phone type="">543-4610</phone> </customerinfo>' preserve whitespace ) );

注意:由于更新調(diào)用修改了初始的 xml 文檔,所以您需要為某些查詢而刪除插入的文檔,并重新插入它。

示例查詢

下面是示例查詢:

替換節(jié)點(diǎn):action=replace。

通過使用復(fù)雜名稱元素替換簡單名稱元素來更新測試文檔:

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update action="replace" col="1" path="/x:customerinfo/x:name"> <name><fname>hardeep</fname><lname>singh</lname></name> </update> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

使用 sql 查詢獲取新值以進(jìn)行更新:

using=sql。 call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update using="sql" action="replace" col="1" path="http://x:customerinfo[@cid=1006]/x:addr/x:pcode-zip/text()"> select cid from xmlcustomer where cid=1006 </update> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

使用給定表達(dá)式來計(jì)算值:

action=compute。 call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update action="compute" col="1" path="/x:customerinfo/x:addr/x:pcode-zip/text()"> (20+?)*32-? </update> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? &yuml;here cid=1006',?,?);

對目標(biāo) xml 文檔執(zhí)行多個(gè)操作:

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update using="sql" action="replace" col="1" path="/x:customerinfo/x:addr/x:pcode-zip/text()"> select cid from xmlcustomer where cid=1006 </update> <update action="compute" col="1" path="/x:customerinfo/x:addr/x:pcode-zip/text()"> (2+?)*10-? </update> <update action="delete" col="1" path="/x:customerinfo/x:name"/> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

更新文檔時(shí)對其進(jìn)行驗(yàn)證。

為此,您需要?jiǎng)?chuàng)建模式并在 xsr 中注冊。

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update using="sql" action="replace" col="1" path="/x:customerinfo/x:addr/x:pcode-zip/text()"> select cid from xmlcustomer where cid=1006 </update> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=xmlvalidate( ? according to xmlschema id test.schema2) where cid=1006',?,?)

使用 xmlupdate 替換屬性值。

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update action="replace" col="1" path="/x:customerinfo/x:phone/@type"> tie line </update> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

使用 xmlupdate 替換文本值。

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update action="replace" col="1" path="/x:customerinfo/x:addr/x:city/text()"> san jose </update> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

 

 

重要事項(xiàng):必須在路徑的末尾指定 text()。這一步確保即使是空元素(即不具有現(xiàn)有文本節(jié)點(diǎn)的元素)也進(jìn)行更新。如果省略了 text() 且不存在要替換的現(xiàn)有文本值,更新命令就會失敗。

使用 xmlupdate 追加子節(jié)點(diǎn)。

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update action="append" col="1" path="/x:customerinfo/x:addr"> <county>santa clara</county> </update> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

注意:新節(jié)點(diǎn) 不在任何名稱空間中。

使用 xmlupdate 將更新的 xml 插入新行。

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update action="replace" col="1" path="/x:customerinfo/x:name"> <name>marja soininen</name> </update> <update action="replace" col="1" path="/x:customerinfo/@cid">1008</update> </updates>', 'select info from xmlcustomer where cid=1006', 'insert into xmlcustomer (cid, info ) values (1008, cast( ? as xml))',?,?);

使用 xmlupdate 刪除節(jié)點(diǎn)。

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update action="delete" col="1" path="/x:customerinfo/x:name"/> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

當(dāng)更新元素中沒有設(shè)置 @action 時(shí),就默認(rèn)執(zhí)行替換操作。

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update col="1" path="http://x:customerinfo[@cid=1006]/x:phone"> <phone><areacode>910</areacode></phone> </update> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

以下示例展示帶有無效名稱空間或帶有沒有前綴的名稱空間的 xmlupdate:

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://my.org"> <update col="1" path="http://x:customerinfo[@cid=1006]/x:phone"> <phone><areacode>910</areacode></phone> </update> </updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

該查詢返回設(shè)置為 1 的錯(cuò)誤,以及如下錯(cuò)誤消息:

<error type='abort' action='replace' msg='cannot find path //x:customerinfo[@cid=1006]/x:phone) in the xmldocument'>

以下示例展示的 xmlupdate 在更新元素中有一個(gè)遺漏的路徑:

call db2xmlfunctions.xmlupdate ( '<updates > <update col="1"> (20+?)*32-? </update></updates>', 'select info from xmlcustomer where cid=1006', 'update xmlcustomer set info=? where cid=1006',?,?);

該查詢返回設(shè)置為 1 的錯(cuò)誤,以及如下錯(cuò)誤消息:

<error type='abort' action='null' msg='path not defined'></error>

使用相同名稱空間中的新節(jié)點(diǎn)替換某個(gè)節(jié)點(diǎn)。

call db2xmlfunctions.xmlupdate ( '<updates namespaces="x:http://posample.org"> <update action="replace" col="1" path="/x:customerinfo/x:name"> <name xmlns="http://posample.org"> <fname>marja</fname><lname>soininen</lname> </name> </update> </updates>', 'select info from xmlcustomer where cid=1008', 'insert into xmlcustomer (cid, info ) values (1007, cast( ? as xml))',?,?);

結(jié)束語

本文描述的更新存儲過程允許對本機(jī)存儲在數(shù)據(jù)庫中的 xml 文檔進(jìn)行部分更新。下一篇文章將深度挖掘和具體研究新的 xml 支持對遷移現(xiàn)有基于 xml 的應(yīng)用程序的重大意義。

致謝

感謝 matthias nicola、bert van der linden、irina kogan、annie wang、ying chen 和 xiaoli du 在撰寫這篇文章時(shí)給予的幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
视频一区二区不卡| 欧美日韩国产999| 热久久精品国产| 日韩国产一区| av一区在线| 久久婷婷国产| 亚洲欧美日本国产专区一区| 999精品视频在线观看播放| 91精品国产亚洲| 欧美在线日韩在线| 免费在线观看国产黄| 在线观看91精品国产入口| 中文字幕精品视频| 婷婷久久综合九色国产成人| 欧美日韩高清一区二区| 欧洲精品在线视频| 成人a在线视频免费观看| 国产91大片| 日韩欧美久久| 欧美日韩国产综合久久| 一区二区在线观看不卡| 国产 欧美 在线| aaa欧美日韩| 国产最新在线| 国产一级一片免费播放| 亚洲 欧美 日韩系列| 77777_亚洲午夜久久多人 | 99在线国产| 亚洲深夜福利| 韩日中文字幕第一页| 91精品无人成人www| 国产成人精品综合久久久| 一本大道一区二区三区| 欧美午夜影院在线视频| 麻豆一区二区99久久久久| 久久99蜜桃精品久久久久小说| 欧美日韩国产91| 日韩精品在线私人| 一级片在线免费看| 欧美日韩综合在线| 久久蜜桃一区二区| 欧美日韩精品三区| 久久人人精品| 激情国产在线| 又黄又www的网站| 欧美一级二级三级区| 欧美日韩中文在线| 日韩wumaV| 在线日韩欧美| 欧美日韩一级视频| 91精品国产乱码久久蜜臀| 国产日韩1区| 精品不卡一区二区| 日韩视频国产视频| 亚洲免费福利视频| 视频一区日韩| 国产区日韩欧美| 最新日韩中文字幕| 日韩你懂的电影在线观看| 欧美日韩高清一区二区不卡| 91精品久久久久久久久久| 91久久精品国产| 天天在线视频色| 欧美亚洲天堂网| 欧美中文字幕视频| 亚洲一区在线观看视频| 999精品网| 日韩欧美资源站| 国产福利一区在线观看| 91精品国产综合久久精品app| 国产v日产∨综合v精品视频| 欧美日韩亚洲综合| 在线视频三区| 精品国产欧美日韩不卡在线观看| 91精品国产自产在线| 日韩精品丝袜在线| 91精品视频观看| 日韩欧美国产免费播放| 亚洲 欧美 精品| 九九在线精品| 亚洲第一中文字幕在线观看| 老司机久久99久久精品播放免费| 中文字幕在线高清| 不卡视频一区二区三区| 91欧美日韩在线| 久99久视频| 国产在线www| 色综合婷婷久久| 91日韩中文字幕| 国产在线观看91| 福利在线国产| 中文字幕日韩欧美| 欧美中文字幕在线观看视频| a天堂在线资源| 一级特黄大欧美久久久| 一区二区三区精品99久久| 久久精品黄色片| 亚洲福利一区二区三区| 国产免费永久在线观看| 日韩欧美国产成人一区二区| 日韩欧美国产免费| 国产一级在线| 日韩在线视频一区二区三区| 国产高清精品在线| 欧美日韩国产中字| 国产亚洲视频中文字幕视频| 免费视频国产一区| 日韩激情一区| av中文网站| 国产伦精品免费视频| 亚洲乱码中文字幕综合| 欧美国产日韩综合| 中文字幕日韩高清| 亚洲成年人影院在线| а√天堂中文在线资源8| 精品人妻一区二区三区视频| 欧美 日韩 综合| 国产一二三精品| 国产高清在线视频| 亚洲黄页一区| 免费在线播放av| 国产拍揄自揄精品视频麻豆| 国产天堂素人系列在线视频| 欧美日本精品在线| 日韩影院二区| 久久精品不卡| 亚洲免费看av| 交视频在线观看国产| 伊人亚洲视频| 日韩一级二级三级| 日韩.欧美.亚洲| 日韩欧美在线精品| 免费国产h视频在线观看86| 你懂的亚洲视频| 欧美久久综合性欧美| 国产在线看一区| 久久婷婷综合国产| 黄色国产网站在线观看| 一区二区三区免费看视频 | 韩国v欧美v日本v亚洲| 久久精品www| 91麻豆精品国产91久久久使用方法| 日韩欧美中文字幕精品| 日韩欧美不卡| 国产在线拍偷自揄拍精品| 日韩亚洲一区在线| 国产成人精品999在线观看| 1区不卡电影| 日韩精品中文字幕第1页| av免费观看国产| 日韩国产成人精品| 亚洲经典中文字幕| 欧美日韩尤物久久| 一区二区中文视频| 一区二区不卡在线| 日韩国产欧美在线视频| 日韩精品视频中文在线观看| 一区二区三区精品久久久| 国产 欧美 日韩 在线| 精品一二三区视频| 国产99对白在线播放| 国自产拍在线网站网址视频| 一区二区在线高清视频| 国产欧美在线观看| 欧美 亚洲 精品 三区| 欧美日韩国产综合视频在线观看 | av免费在线网站| 国产欧美久久久精品影院| 欧美久久久久久蜜桃| 久久夜色精品国产噜噜亚洲av| 黄色国产网站在线播放| 久久精品久久久久| 日本精品在线| 欧美日韩国产综合网| 免费精品国产自产拍观看| 精品亚洲永久免费| 日韩久久在线| 欧美日韩国产第一页| 午夜av一区二区| 精品福利二区三区| 欧美日韩亚洲不卡| 日韩欧美在线视频日韩欧美在线视频| 一区二区视频免费看| 国产1卡2卡三卡四卡网站| 国产三级免费观看| 91久久精品午夜一区二区| 欧美久久一二三四区| 亚洲二区自拍| 69av亚洲| 亚洲.国产.中文慕字在线| 91精品国产91久久久久久不卡| 精品999在线| 深夜日韩欧美| 国产偷久久久精品专区| 日韩欧美看国产| 日韩在线视频中文字幕| 久久91精品视频| 麻豆一区二区99久久久久| 国产999在线观看| 在线资源av| 日韩中文字幕视频在线观看| 欧美特黄一区| 中文字幕2020第一页| 蜜桃精品视频| 深夜福利一区二区| 99精品电影| 91极品视频在线观看| 亚洲女人天堂色在线7777| aaa免费看大片| 91精品国产91久久久久| 精品日韩av一区二区| 亚洲九九精品| 亚洲羞羞网站| 91精品国产乱码久久蜜臀| 亚洲一级二级| 成人a在线观看| 国产一区成人| av免费看在线| 国产传媒久久久| 日韩国产一区三区| 免费在线观看国产黄| 日韩中文在线中文网三级| 亚洲九九精品| 日韩在线精品| 国产高清大尺度一区二区不卡| 五月综合激情日本mⅴ| 在线精品观看| 国产区在线看| 国产69精品久久app免费版| 日韩中文字幕视频在线观看| 欧美日韩在线看| 91精品国产综合久久久蜜臀粉嫩| 日韩精品在线观看网站| 精品对白一区国产伦| 婷婷综合福利| 日本精品在线播放| 欧美日本精品| 亚洲人线精品午夜| 日韩精品在线免费观看| 日韩免费视频一区| 欧美国产三级| 中文字幕欧美国内| 中文字幕欧美日韩va免费视频| 91亚洲国产高清| 国产一区日韩欧美| 国产婷婷一区二区| 91精品国产综合久久久久久漫画 | 欧美日韩在线观看一区| 一区二区在线观| 日韩在线不卡一区| 久久久精品网| 欧美亚洲专区| 91精品国产入口| 一级免费a一片| 91精品啪在线观看国产60岁 | 999视频精品| 一区二区三区精品在线| 欧美人妻一区二区三区| 日韩精品视频网站| www日韩欧美| 亚洲午夜91| 国产日韩精品电影| 日韩中文字幕91| 欧美性极品xxxx做受| 在线视频一区二区三区在线播放| 欧美亚洲综合视频| 91精品视频免费在线观看| 91久久中文| 91精品国产综合久久精品app| 亚洲国产综合久久| 欧美日韩国产在线看| 国产导航在线| 欧美日韩激情一区| 日韩欧美中文字幕一区| 中文字幕在线导航| 国产欧美日韩在线视频| 在线国产三级| 91精品国产日韩91久久久久久| 久艹在线视频| 在线视频日韩欧美| 欧美日韩国产不卡| 国产 欧美在线| 日韩高清在线不卡| 亚州福利视频| 97国产视频| eeuss一区| 国产在线一在线二| 亚洲狠狠婷婷综合久久久久图片| 中文字幕在线精品| 日韩精品在线观看视频| 丰满少妇一区| 精品视频www| 精品网站999www| 免费一级欧美在线观看视频| 亚洲羞羞网站| 日韩欧美一卡二卡| 一区二区三区在线播放欧美| 中文字幕欧美日韩精品| 国产在线看一区| 久久99精品国产| 亚洲美女视频一区| 日韩中文在线中文网三级| 91精品国产综合久久精品| 91精品国产入口| 久久夜色精品国产噜噜亚洲av| 国产福利在线导航| www.尤物.com| 日韩欧美国产高清| 一区二区三区在线播放欧美| 精品婷婷伊人一区三区三| 中文网丁香综合网| 最近免费中文字幕在线第一页| 国内精品99| 日韩精品欧美在线| 亚洲男女av一区二区| 亚洲一区精品在线| 中文字幕 亚洲视频| 精品久久91| 欧美亚洲国产免费| 91精品在线观看国产| 欧美日韩精品欧美日韩精品一| 国产一区高清视频| 蜜桃久久av| 国产高潮久久久| 欧美久久久网站| 国产欧美日韩高清| 欧美日韩亚州综合| 精品全国在线一区二区| 久久电影国产免费久久电影| 一级片免费网站| 精品播放一区二区| 阿v免费在线观看| 日韩亚洲欧美中文三级| 一区二区日韩免费看| 国产视频中文字幕在线观看| 欧美日韩亚洲视频| 国产日韩专区| av一区在线观看| 欧洲精品久久久| 日韩欧中文字幕| 国产日韩综合| 国产自产视频| 国产亚洲二区| 在线精品日韩| 欧美日韩精品免费| 亚洲视频资源在线| 亚洲第一视频网站| 国产一卡2卡3卡四卡网站| 日韩国产高清一区| 日韩视频在线观看视频| 亚洲免费观看在线观看| 日韩欧美在线视频| 日韩精品在线第一页| 日韩视频一区| 日韩视频一区二区在线观看| 日韩精品第一区| 国产91一区| 中文字幕欧美亚洲| 日韩高清不卡一区二区| 日韩欧美在线中字| 你懂的亚洲视频| 中文字幕日韩在线观看| 欧美日韩精品免费| 日韩中文在线中文网三级| 91精品久久久久| 日韩亚洲欧美中文在线| 亚洲 欧美 中文字幕| 97国产视频| 精品久久九九| 日本亚洲视频在线| 亚洲乱码中文字幕综合| 欧美三级日韩在线| 国产黄色在线观看| 欧美国产三级| 精品国产欧美日韩不卡在线观看 | 精品日韩av| 亚洲乱码中文字幕| 一区二区在线观| 久久网站免费观看| 欧美一级日韩一级| 粉嫩粉嫩芽的虎白女18在线视频| 中文字幕在线官网| 精品在线网站观看| 欧美日韩乱国产| 日韩av中文字幕一区| 国产一区二中文字幕在线看| 日韩一级网站| 日韩视频 中文字幕| 亚洲视频电影在线| 丰满少妇一区二区| 一区二区不卡在线播放| 影音先锋中文字幕在线观看| 成人精品视频一区| 国产导航在线| 一区二区中文字幕在线| 亚洲第一视频| 欧美亚洲天堂网| 中文字幕亚洲欧美| 国产91久久久久蜜臀青青天草二| 欧美日韩中文字幕在线|