亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

java JDBC 詳解

系統 1817 0
什么是JDBC?
Java語言訪問數據庫的一種規范,是一套API
JDBC (Java Database Connectivity) API,即Java數據庫編程接口,是一組標準的Java語言中的接口和類,使用這些接口和類,Java客戶端程序可以訪問各種不同類型的數據庫。比如建立數據庫連接、執行SQL語句進行數據的存取操作。

?? JDBC規范采用接口和實現分離的思想設計了Java數據庫編程的框架。接口包含在java.sql及javax.sql包中,其中java.sql屬于JavaSE,javax.sql屬于JavaEE。這些接口的實現類叫做數據庫驅動程序,由數據庫的廠商或其它的廠商或個人提供。

?? 為了使客戶端程序獨立于特定的數據庫驅動程序,JDBC規范建議開發者使用基于接口的編程方式,即盡量使應用僅依賴java.sql及javax.sql中的接口和類。
java JDBC 詳解

JDBC驅動程序:
什么是JDBC驅動程序?
這些是各個數據庫廠家根據JDBC的規范制作的JDBC實現類
JDBC驅動程序的四種類型:
1.?????? 第一種類型的驅動程序的實現是通過將JDBC的調用全部委托給其它編程接口來實現的,比如ODBC。這種類型的驅動程序需要安裝本地代碼庫,即依賴于本地的程序,所以便攜性較差。比如JDBC-ODBC橋驅動程序
2.?????? 第二種類型的驅動程序的實現是部分基于Java語言的。即該驅動程序一部分是用Java語言編寫,其它部分委托本地的數據庫的客戶端代碼來實現。同類型1的驅動一樣,該類型的驅動程序也依賴本地的程序,所以便攜性較差
3.?????? 第三種類型的驅動程序的實現是全部基于JAVA語言的。該類型的驅動程序通常由某個中間件服務器提供,這樣客戶端程序可以使用數據庫無關的協議和中間件服務器進行通信,中間件服務器再將客戶端的JDBC調用轉發給數據庫進行處理
4.?????? 第四種類型的驅動程序的實現是全部基于JAVA語言的。該類型的驅動程序中包含了特定數據庫的訪問協議,使得客戶端可以直接和數據庫進行通信

JDBC類結構:
?????????????????????????? DriverManager

Driver?????????????????????????????? Driver

Connection???????????????????????? Connection

Statement????????????????????????????????? Statement

Resultset??????????????????????????????????? Resultset

DriverManager:這個是一個實現類,它是一個工廠類,用來生產Driver對象的
這個類的結構設計模式為工廠方法
Driver:這是驅動程序對象的接口,它指向一個實實在在的數據庫驅動程序對象,那么這個數據庫驅動程序對象是從哪里來的呢?
DriverManager工廠中有個方法:getDriver(String URL),通過這個方法可以得到驅動程序對象,這個方法是在各個數據庫廠商按JDBC規范設計的數據庫驅動程序包里的類中靜態實現的,也就是在靜態塊中
Connection:這個接口可以制向一個數據庫連接對象,那么如何得到這個連接對象呢?
是通過DriverManager工廠中的getConnection(String URL)方法得到的
Statement:用于執行靜態的SQL語句的接口,通過Connection中的createStatement方法得到的
Resultset:用于指向結果集對象的接口,結果集對象是通過Statement中的execute等方法得到的

JAVA使用JDBC訪問數據庫的步驟:
1.???? 得到數據庫驅動程序
2.???? 創建數據庫連接
3.???? 執行SQL語句
4.???? 得到結果集
5.???? 對結果集做相應的處理(增,刪,改,查)
6.???? 關閉資源:這里釋放的是DB中的資源
[img]
http://dl.iteye.com/upload/picture/pic/71580/d718366c-42df-33d8-87a6-62146643de3a.jpg[/img]
?
設置classpath:
1.???? 在java文件中起的包名一定要是工程基目錄下的子目錄,classpath:基目錄
2.???? .jar包,需要將這個.jar包的路徑包括這個文件的全名添加到classpath中來
Oracle連接字符串的書寫格式:
“oracle:jdbc:thin:@ip:1521: 數據庫名”,”數據庫用戶名”,”數據庫密碼”

簡單的例子:
package moudule1.first;

import java.sql.*;

public class FirstJdbc
{
????? public static void main(String[] args)
????? {
???????????????? String sql="select * from yuchen_user";
???????????????? Connection con=null;
???????????????? Statement st=null;
???????????????? ResultSet rs=null;
???????????????
?????? try
?????? {
???????????????? Class.forName("oracle.jdbc.driver.OracleDriver");
???????????????? con=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:name", "scott","tiger");
???????????????? st=con.createStatement();
???????????????? rs=st.executeQuery(sql);
???????????????? while(rs.next())
???????????????? {
??????????????????????????? System.out.println(rs.getInt("id"));
??????????????????????????? System.out.println(rs.getString("name"));
???????????????? }
?????? }catch(Exception e)
?????? {
???????????????? e.printStackTrace();
?????? }finally
?????? {
???????????????? try
???????????????? {
????????????????????? con.close();
???????????????? }catch(Exception e)
???????????????? {}
???????????????
???????????????? try
???????????????? {
????????????????????? st.close();
???????????????? }catch(Exception e)
???????????????? {
???????????????? }
???????????????
???????????????? try
???????????????? {
????????????????????? rs.close();
???????????????? }catch(Exception e)
???????????????? {
???????????????? }
????????????????????
?????? }

???????????????
????? }
????
}


常用數據庫的驅動程序及JDBC URL:
Oracle數據庫:
驅動程序包名:ojdbc14.jar
驅動類的名字:oracle.jdbc.driver.OracleDriver
JDBC URL:jdbc:oracle:thin:@dbip:port:databasename
說明:驅動程序包名有可能會變
?????? JDBC URL中黑色字體部分必須原封不動的保留,為該驅動識別的URL格式。紅色字體部分需要根據數據庫的安裝情況填寫。其中各個部分含義如下:
??????? dbip –為數據庫服務器的IP地址,如果是本地可寫:localhost或127.0.0.1。
??????? port –為數據庫的監聽端口,需要看安裝時的配置,缺省為1521。
??????? databasename –為數據庫的SID,通常為全局數據庫的名字。
??????? 舉例如果要訪問本地的數據庫allandb,端口1521,那么URL寫法如下:
?????? jdbc:oracle:thin:@localhost:1521:allandb 下載地址如下:
http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html

SQL Server數據庫
?? 驅動程序包名:msbase.jar mssqlserver.jar msutil.jar
?? 驅動類的名字:com.microsoft.jdbc.sqlserver.SQLServerDriver
?? JDBC URL:jdbc:microsoft:sqlserver://dbip:port;DatabaseName=databasename
?? 說明:驅動程序包名有可能會變
??????? JDBC URL中黑色字體部分必須原封不動的保留,為該驅動識別的URL格式。紅色字體部需要根據數據庫的安裝情況填寫。其中各個部分含義如下:
?????? dbip –為數據庫服務器的IP地址,如果是本地可寫:localhost或127.0.0.1。
??????? port –為數據庫的監聽端口,需要看安裝時的配置,缺省為1433。
?????? databasename –數據庫的名字。
?????? 舉例如果要訪問本地的數據庫allandb,端口1433,那么URL寫法如下:
?????? jdbc: microsoft: sqlserver:@localhost:1433; DatabaseName =allandb
?????? 下載地址:http://www.microsoft.com/downloads/details.aspx

MySQL數據庫
?? 驅動程序包名:mysql-connector-java-3.1.11-bin.jar
?? 驅動類的名字:com.mysql.jdbc.Driver
?? JDBC URL:jdbc:mysql://dbip:port/databasename
?? 說明:驅動程序包名有可能會變
??????? JDBC URL中黑色字體部分必須原封不動的保留,為該驅動識別的URL格式。紅色字體部需要根據數據庫的安裝情況填寫。其中各個部分含義如下:
??????? dbip –為數據庫服務器的IP地址,如果是本地可寫:localhost或127.0.0.1。
??????? port –為數據庫的監聽端口,需要看安裝時的配置,缺省為3306。
??????? databasename –數據庫的名字。
??????? 舉例如果要訪問本地的數據庫allandb,端口1433,那么URL寫法如下:
?????? jdbc:mysql://localhost:3306/allandb
?? 下載地址:http://dev.mysql.com/downloads/connector/j/

Access數據庫
?? 驅動程序包名:該驅動程序包含在JavaSE中,不需要額外安裝。
?? 驅動類的名字:sun.jdbc.odbc.JdbcOdbcDriver
?? JDBC URL:jdbc:odbc:datasourcename
?? 說明:該驅動只能工作在Windows系統中,首先需要在操作系統中建立一個可以訪問Access數據庫的本地數據源(ODBC),如果名字為allandb,那么URL寫法如下:
??????? jdbc:odbc:allandb

PreparedStatement接口:
預編譯的sql語句對象
作用: 解決了書寫sql語句時一些特殊的字符與sql保留字符沖突的問題,非常方便
/**
*知識點:
*PreparedStatement接口及方法的使用
*程序目標:
*java文件:
*PreparedInsert.java:連接數據庫,插入一條數據
*JdbcUtil.java:實現一個工具類,功能:1.連接數據庫 2.關閉資源
*/

package moudule1.preparedstatement;

import java.sql.*;
import moudule1.com.*;

public class PreparedInsert
{
????? public static void main(String[] args)
????? {
?????????? String sql="insert into yuchen_user (id,name) values (?,?)";
?????????? System.out.println(sql);
?????????
?????????? Connection con=null;
?????????? PreparedStatement ps=null;
?????????
?????????? try{
???????????????? con=JdbcUtil.getConnection();
???????????????? ps=con.prepareStatement(sql);
???????????????
???????????????? ps.setInt(1,2);
???????????????? ps.setString(2,"zhangsan");
???????????????? ps.executeUpdate();
???????????????
???????????????? ps.setInt(1,3);
???????????????? ps.setString(2,"lisi");
???????????????? ps.executeUpdate();
???????????????
?????????? }catch(Exception e){
???????????????? e.printStackTrace();
?????????? }finally{
???????????????? JdbcUtil.close(con,ps);
???????????????? }
?????????? }
????? }

package moudule1.com;

import java.sql.*;

public class JdbcUtil{
????
????? public static Connection getConnection() throws Exception{
?????????? Class.forName("oracle.jdbc.driver.OracleDriver");
?????? return DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:name", "scott","tiger");
?????????? }
?????????
????? public static void close(Connection con,Statement st){
?????????
?????????? close(con);
?????????? close(st);
?????????
?????????? }
?????????
????? public static void close(Connection con,Statement st,ResultSet rs){
?????????
?????????
?????????? close(con,st);
?????????? close(rs);
?????????
?????????? }
?????????
????? public static void close(Connection con){
?????????? try{
???????????????
???????????????? con.close();
???????????????
?????????? }catch(Exception e){
???????????????
???????????????
???????????????? }
?????????
?????????? }
?????????
????? public static void close(Statement st){
?????????
?????????? try{
???????????????
???????????????? st.close();
???????????????
?????????? }catch(Exception e){
???????????????
???????????????? }
?????????? }
?????????
????? public static void close(ResultSet rs){
?????????
?????????? try{
???????????????
???????????????? rs.close();
???????????????
?????????? }catch(Exception e){
???????????????
???????????????? }
?????????
?????????? }
????
????? }
????
數據庫的增刪改查的例子:
/**
*知識點:
*JDBC+SQL+ORACLE
*程序目標:
*UserDao.java:實現了數據庫的增刪改查
*JdbcUtil.java:工具類,有連庫和關閉資源的方法
*/

package moudule1.idus;

import java.sql.*;
import moudule1.com.*;

public class UserDao{
????
????? private String sql;
????? private Connection con;
????? private Statement st;
????? private ResultSet rs;
????
????? public UserDao(){
?????????? sql=null;
?????????? con=null;
?????????? st=null;
?????????? rs=null;
?????????? }
????
????? public void insert(){
?????????
?????????? sql="insert into yuchen_user (id,name) values(";
?????????? sql+="4,'zhouwu')";
?????????? System.out.println(sql);
?????????
?????????? try{
???????????????
?????????? con=JdbcUtil.getConnection();
?????????? st=con.createStatement();
?????????? st.executeUpdate(sql);
?????????
?????????? }catch(Exception e){
???????????????
???????????????? e.printStackTrace();
???????????????
?????????? }finally{
???????????????
???????????????? JdbcUtil.close(con,st);
???????????????
???????????????? }
?????????
?????????? }
?????????
?????????
????? public void delete(){
?????????
?????????? sql="delete from yuchen_user where id=2";
?????????? System.out.println(sql);
?????????
?????????? try{
???????????????
???????????????? con=JdbcUtil.getConnection();
??????????? st=con.createStatement();
??????????? st.executeUpdate(sql);
???????????????
?????????? }catch(Exception e){
???????????????
???????????????? e.printStackTrace();
???????????????
?????????? }finally{
???????????????
???????????????? JdbcUtil.close(con,st);
???????????????
???????????????? }
?????????? }
?????????
?????????
????? public void update(){
?????????
?????????? sql="update yuchen_user set name='liumang' where id=1";
?????????? System.out.println(sql);
?????????
?????????? try{
???????????????
???????????????? con=JdbcUtil.getConnection();
??????????? st=con.createStatement();
??????????? st.executeUpdate(sql);
???????????????
?????????? }catch(Exception e){
???????????????
???????????????? e.printStackTrace();
???????????????
?????????? }finally{
???????????????
???????????????? JdbcUtil.close(con,st);
???????????????
???????????????? }
?????????? }
?????????
?????????
????? public void select(){
?????????
?????????? sql="select * from yuchen_user";
?????????? System.out.println(sql);
?????????
?????????? try{
???????????????
???????????????? con=JdbcUtil.getConnection();
??????????? st=con.createStatement();
???????????? rs=st.executeQuery(sql);
???????????
??????????? while(rs.next()){
?????????????
?????????????? System.out.println(rs.getInt(1));
?????????????? System.out.println(rs.getString(2));
?????????????
?????????????? }
???????????????
?????????? }catch(Exception e){
???????????????
???????????????? e.printStackTrace();
???????????????
?????????? }finally{
???????????????
???????????????? JdbcUtil.close(con,st,rs);
???????????????
???????????????? }
?????????
?????????? }
?????????
?????????
????? public static void main(String[] args){
?????????
?????????? UserDao ud=new UserDao();
?????????? ud.select();
?????????? ud.insert();
?????????? ud.select();
?????????? ud.update();
?????????? ud.select();
?????????? ud.delete();
?????????? ud.select();
?????????? }
????? }

一些常用的方法:
/**
*知識點:
*execute方法,getResultSet(),getUpdateCount()
*程序目標:
*JdbcUtil.java:工具類,連接數據庫,關閉資源
*sqlExecutor.java:命令行參數輸入sql語句,并執行該語句
*/
package moudule1.fangfa;

import java.sql.*;
import moudule1.com.*;

public class sqlExecutor{
????
????? public static void main(String[] args){
?????????
?????????? Connection con=null;
?????????? Statement st=null;
?????????
?????????? try{
???????????????
???????????????? con=JdbcUtil.getConnection();
???????????????? st=con.createStatement();
???????????????? boolean str=st.execute(args[0]);
???????????????
???????????????? if(str){

????????????????????? ResultSet rs=st.getResultSet();
????????????????????
????????????????????? while(rs.next()){
??????????????????????????? System.out.println(rs.getInt("id")+":"+rs.getString("name"));
??????????????????????????? }
??????????????????????????
??????????????????????????? rs.close();
????????????????????
???????????????? }else{
????????????????????? int row=st.getUpdateCount();
????????????????????? System.out.println(row);
????????????????????? }
???????????????
?????????? }catch(Exception e){
???????????????
???????????????? e.printStackTrace();
???????????????
?????????? }finally{
???????????????
???????????????? JdbcUtil.close(con,st);
???????????????
???????????????? }
?????????? }
????? }
2. 補充
? JDBC連接MySQL

加載及注冊JDBC驅動程序
Class.forName("com.mysql.jdbc.Driver");
Class.forName("com.mysql.jdbc.Driver").newInstance();
JDBC URL 定義驅動程序與數據源之間的連接
標準語法:
<protocol(主要通訊協議)>:<subprotocol(次要通訊協議,即驅動程序名稱)>:<data source identifier(數據源)>
MySQL的JDBC URL格式:
jdbc:mysql//[hostname][:port]/[dbname][?param1=value1][&param2=value2]….

示例:jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password

常見參數:
user?????????????????????? 用戶名
password????????????????? 密碼
autoReconnect????????????????? 聯機失敗,是否重新聯機(true/false)
maxReconnect????????????? 嘗試重新聯機次數
initialTimeout?????????????? 嘗試重新聯機間隔
maxRows?????????????????? 傳回最大行數
useUnicode???????????????? 是否使用Unicode字體編碼(true/false)
characterEncoding????????? 何種編碼(GB2312/UTF-8/…)
relaxAutocommit??????????? 是否自動提交(true/false)
capitalizeTypeNames??????? 數據定義的名稱以大寫表示
建立連接對象
String url="jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password";
Connection con = DriverManager.getConnection(url);
建立SQL陳述式對象(Statement Object)
Statement stmt = con.createStatement();
執行SQL語句
executeQuery()
String query = "select * from test";
ResultSet rs=stmt.executeQuery(query);
結果集ResultSet
while(rs.next())
{rs.getString(1);rs.getInt(2);}
executeUpdate()
String upd="insert into test (id,name) values(1001,xuzhaori)";
int con=stmt.executeUpdate(upd);
execute()
示例:
try{
}
catch(SQLException sqle)
{
}
finally
{
}

Java類型和SQL類型 技術手冊P421
PreparedStatement(預編語句)
PreparedStatement stmt = conn.prepareStatement("insert into test(id,name)values(?,?)");
stmt.setInt(1,id);
stmt.setString(2,name);
注:一旦設定語句的參數值后,就可以多次執行改語句,直到調用clearParameters()方法將他清除為止
CallableStatement(預儲程序)技術手冊P430
JDBC2.0使用
ResultSet對象中的光標上下自由移動
Statement stmt = con.createStatement (ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs=stmt.executeQuery("select * from test");

public Statement createStatement(int resultSetType,int resultSetConcuttency) throws SQLException

resultSetType
TYPE_FORWARD_ONLY??????????? 只能使用next()方法。
TYPE_SCROLL_SENSITIVE??????? 可以上下移動,可以取得改變后的值。
TYPE_SCROLL_INSENSITIVE????? 可以上下移動。
resultSetConcuttency
CONCUR_READ_ONLY??????? 只讀
CONCUR_UPDATABLE??????? ResultSet對象可以執行數據庫的新增、修改、和移除

直接使用ResultSet對象執行更新數據
新增數據
Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE);
ResultSet uprs=stmt.executeQuery("select * from test");
uprs.moveToInsertRow();
uprs.updateInt(1,1001);
uprs.updateString(2,"許召日");
uprs.insertRow;
更新數據
Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE);
ResultSet uprs=stmt.executeQuery("select * from test");
uprs.last();
uprs.updateString("name","xuzhaori");
uprs.updateRow;
刪除數據
Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE);
ResultSet uprs=stmt.executeQuery("select * from test");
uprs.absolute(4);
uprs.deleteRow();

批處理
con.setAutoCommit(false);? 關閉自動認可模式
Statement stmt=con.createStatement();
int[] rows;
stmt.addBatch("insert into test values(1001,xuzhaori)");
stmt.addBatch("insert into test values(1002,xuyalin)");
rows=stmt.executeBatch();
con.commit();? 沒有任何錯誤,執行批處理stmt.executeBatch();

JNDI-數據源(Data Source)與連接池(Connection Pool)
Tomcat的JDBC數據源設置? 技術手冊P439
連接池工具-Proxool Var 0.8.3 技術手冊P446
設置web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--<?xml version="1.0" encoding="GB2312"?>-->

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
….
<servlet>
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>

<init-param>
<param-name>propertyFile</param-name>
<param-value>WEB-INF/classes/Proxool.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
后端統計端口添加下列
<servlet>
<servlet-name>Admin</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>Admin</servlet-name>
<url-pattern>/Admin</url-pattern>
</servlet-mapping>

….

</web-app>

配置Proxool.properties
jdbc-0.proxool.alias=JSPBook
jdbc-0.proxool.driver-class=com.mysql.jdbc.Driver
jdbc-0.proxool.driver-url=jdbc:mysql://localhost:3306/sample_db?user=root&password=browser&useUnicode=true&characterEncoding=UTF-8
jdbc-0.proxool.maximum-connection-count=10
jdbc-0.proxool.prototype-count=4
jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE
jdbc-0.proxool.verbose=true
jdbc-0.proxool.statistics=10s,1m,1d??? 后端統計接口添加此行
jdbc-0.proxool.statistics-log-level=DEBUG
使用Proxool連接池
Connection con = DriverManager.getConnection("proxool.JSPBook");
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
String query = "SELECT * FROM employee";
ResultSet rs = stmt.executeQuery(query);

java JDBC 詳解


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久机热这里只有精品无需 | 欧美另类亚洲一区二区 | 性欧美网站 | 奇米第七色 | 九九免费观看全部免费视频 | 日本中文字幕高清 | 欧美日韩不卡码一区二区三区 | 99国产精品免费视频观看 | 91在线网址 | 韩国女主播一区二区三区视频 | 奇米影视亚洲狠狠色 | 一级毛片日本特黄97人人 | 亚洲福利视频一区二区三区 | 牛牛本精品99久久精品 | 99久久精品免费视频 | 久久五月婷| 午夜色网站 | 亚洲区一 | www久久爱com| 久久美女精品国产精品亚洲 | 伊人在线视频 | 久久91这里精品国产2020 | 最新永久地址 | 高清影院|精品秒播3 | 久久国产免费一区二区三区 | 浮力影院欧美三级日本三级 | 亚洲精品久久99久久一区 | a毛片免费在线观看 | 中文字幕一区二区三区精彩视频 | 精品久久国产视频 | 日本在线不卡免费视频一区 | 青青青青手机在线视频观看国产 | 欧美大陆日韩一区二区三区 | 成人在线观看网站 | 四虎永久地址4hu2019 | 老太太毛片 | 免费观看一级毛片 | 久久www免费人成_看片美女图 | 毛片a级放荡的护士hd | 欧美久久xxxxxx影院 | 日韩欧美一区在线观看 |