日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

五、JDBC(复习)

發(fā)布時間:2024/3/13 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 五、JDBC(复习) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

一、JDBC核心組件

二、使用步驟

三、連接步驟

1.導(dǎo)包? ??

2.注冊JDBC驅(qū)動程序:

?3.數(shù)據(jù)庫URL配置,創(chuàng)建連接對象

(1)加載驅(qū)動

(2)獲得鏈接

(3)定義sql,創(chuàng)建狀態(tài)通道

(4)關(guān)閉資源

(5)完整代碼

四、SQl注入和預(yù)狀態(tài)通道PreparedStatement

五、多表操作

1.創(chuàng)建bean下的實體

2.創(chuàng)建接口和實現(xiàn)接口

3.在demo中打印查詢結(jié)果

4.結(jié)果

六、事務(wù)的應(yīng)用

1.自動提交/手動提交切換

2.事務(wù)的提交commit和回滾rollback

3.保存點(diǎn)Savepoints

七、JDBC批處理

?1.Statement批處理

2.PreparedStatement批處理

八、反射處理結(jié)果集

九、封裝工具類

十、屬性文件

十一、連接池

1.DBCP(不可以自動回收空閑連接)

2.C3P0(自動回收空閑連接)

3.Druid德魯伊(阿里開發(fā))


JDBC是一種用于執(zhí)行SQL語句的Java API,可以在各種平臺上使用Java,如Windows,Mac OS和各種版本的UNIX。

一、JDBC核心組件

DriverManager: 此類管理數(shù)據(jù)庫驅(qū)動程序列表。使用通信子協(xié)議將來自java應(yīng)用程序的連接請求 與適當(dāng)?shù)臄?shù)據(jù)庫驅(qū)動程序匹配。
Driver:此接口處理與數(shù)據(jù)庫服務(wù)器的通信,我們很少會直接與Driver對象進(jìn)行交互。而是使用 DriverManager對象來管理這種類型的對象。
Connection:該界面具有用于聯(lián)系數(shù)據(jù)庫的所有方法。連接對象表示通信上下文,即,與數(shù)據(jù)庫 的所有通信僅通過連接對象。
Statement:使用從此接口創(chuàng)建的對象將SQL語句提交到數(shù)據(jù)庫。除了執(zhí)行存儲過程之外,一些派 生接口還接受參數(shù)。
ResultSet:在使用Statement對象執(zhí)行SQL查詢后,這些對象保存從數(shù)據(jù)庫檢索的數(shù)據(jù)。它作為一 個迭代器,允許我們移動其數(shù)據(jù)。
SQLException:此類處理數(shù)據(jù)庫應(yīng)用程序中發(fā)生的任何錯誤

二、使用步驟

構(gòu)建JDBC應(yīng)用程序涉及以下六個步驟:
- 導(dǎo)入包:需要包含包含數(shù)據(jù)庫編程所需的JDBC類的包。大多數(shù)情況下,使用import java.sql.*就足夠 了。
- 注冊JDBC驅(qū)動程序:要求您初始化驅(qū)動程序,以便您可以打開與數(shù)據(jù)庫的通信通道。
- 打開連接:需要使用DriverManager.getConnection()方法創(chuàng)建一個Connection對象,該對象表 示與數(shù)據(jù)庫的物理連接。
- 執(zhí)行查詢:需要使用類型為Statement的對象來構(gòu)建和提交SQL語句到數(shù)據(jù)庫。
- 從結(jié)果集中提取數(shù)據(jù):需要使用相應(yīng)的ResultSet.getXXX()方法從結(jié)果集中檢索數(shù)據(jù)。
- 釋放資源:需要明確地關(guān)閉所有數(shù)據(jù)庫資源,而不依賴于JVM的垃圾收集。

三、連接步驟

1.導(dǎo)包? ??

import java.sql.*

2.注冊JDBC驅(qū)動程序:

? ? ? ? 工程下創(chuàng)建lib文件夾,把mysql-connector壓縮包放入lib下,點(diǎn)擊左上角文件復(fù)選框-項目結(jié)構(gòu),打開此界面,點(diǎn)擊依賴

點(diǎn)擊+,單擊第一個JAR或目錄,找到剛剛的lib文件下壓縮包,點(diǎn)擊確定注入。

?

?3.數(shù)據(jù)庫URL配置,創(chuàng)建連接對象

這是為了創(chuàng)建一個格式正確的地址,指向要連接到的數(shù)據(jù)庫。

(1)加載驅(qū)動

Class.forName("com.mysql.cj.jdbc.Driver");//從本地工程加載驅(qū)動

(2)獲得鏈接

創(chuàng)建數(shù)據(jù)庫連接對象

String userName = "root";//數(shù)據(jù)庫用戶名 String userPassword = "123456";//數(shù)據(jù)庫密碼 String url = "jdbc:mysql://localhost:3306/practice?serverTimezone=UTC";//數(shù)據(jù)庫mysql8 URL配置 Connection connection = DriverManager.getConnection(url,userName, userPassword);

加載驅(qū)動程序后,可以使用DriverManager.getConnection()方法建立連接。
- getConnection(String url)
- getConnection(String url,Properties prop)
- getConnection(String url,String user,String password)

完整的連接地址:
第一種:jdbc:mysql://localhost:3306/yhp2?serverTimezone=UTC
? ? ? ??localhost:數(shù)據(jù)庫地址,本地就是這個?3306:數(shù)據(jù)庫所用的端口?yhp2:要打開的數(shù)據(jù)庫名
第二種:jdbc:mysql://localhost:3306/數(shù)據(jù)庫名?useSSL=false&useUnicode=true&characterEncoding=UTF-8

(3)定義sql,創(chuàng)建狀態(tài)通道

Statement statement = connection.createStatement(); ResultSet resultSet=statement.executeQuery("select * from student;");//執(zhí)行查詢while (resultSet.next()) {System.out.println("編號:"+resultSet.getInt("stuid")+"\t姓名" +resultSet.getString("name")+"\t\t生日"+resultSet.getDate("birthday")); } 執(zhí)行查詢的語句:返回的是一個結(jié)果集(executeQuery) resultSet=statement.executeQuery("select * from student;");

執(zhí)行增刪改的語句,返回數(shù)大于0成功,否則失敗。(executeUpdate)
int i=statement.executeUpdate("update student set birthday='1011-1-1' ");

ResultSet:
用resultset接收結(jié)果集

(4)關(guān)閉資源

resultSet.close(); statement.close(); connection.close();

(5)完整代碼

import java.sql.*;public class Demo1 {public static void main(String[] args) {Connection connection = null;Statement statement = null;ResultSet resultSet = null;try {Class.forName("com.mysql.cj.jdbc.Driver");String userName = "root";String userPassword = "123456";String url = "jdbc:mysql://localhost:3306/practice?serverTimezone=UTC";connection = DriverManager.getConnection(url, userName, userPassword);statement = connection.createStatement();resultSet = statement.executeQuery("select * from student;");while (resultSet.next()) {System.out.println("編號:" + resultSet.getInt("stuid")+ "\t姓名" + resultSet.getString("name")+ "\t\t生日" + resultSet.getDate("birthday"));}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {try {if (resultSet != null) {resultSet.close();}if (statement != null) {statement.close();}if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}} }

四、SQl注入和預(yù)狀態(tài)通道PreparedStatement

? ? ? ? 現(xiàn)在網(wǎng)站比較安全,但還是要考慮到。sql注入就是在執(zhí)行sql語句的時候,比如輸入密碼的時候夾帶別的對數(shù)據(jù)庫安全有威脅的sql語句,如密碼輸入 or 1=1;那樣條件恒等,就可以隨便進(jìn)入

預(yù)狀態(tài)通道,PreparedStatement此種方式將sql語句中的輸入用?代替,確保sql語句的本塊在傳到了數(shù)據(jù)庫執(zhí)行時帶有引號如錯誤密碼變成了?' 123456 or 1=1',因為有了引號就都變成了字符串,or不會再被當(dāng)成條件執(zhí)行,之后按照從1開始1的下標(biāo)順序以此給?賦值

此代碼塊和第三模塊第(3)定義sql,創(chuàng)建狀態(tài)通道相通,經(jīng)過更改后變成下面,換了案例,用用戶名和密碼為例子

String sql = "select * from userVIP where userName=? and userPass=?";//問號占位 PreparedStatement preparedStatement = connection.prepareStatement(sql);//PreparedStatement接收數(shù)據(jù) preparedStatement.setString(1, "張三");//按照從1開始的下標(biāo)順序給sql語句中的問號賦值 preparedStatement.setString(2, "123456"); resultSet = preparedStatement.executeQuery();

解決了sql注入后的完整代碼

import java.sql.*;public class Demo1 {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {Class.forName("com.mysql.cj.jdbc.Driver");String userName = "root";String userPassword = "123456";String url = "jdbc:mysql://localhost:3306/practice?serverTimezone=UTC";;connection = DriverManager.getConnection(url, userName, userPassword);String sql = "select * from userVIP where userName=? and userPass=?";preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, "張三");preparedStatement.setString(2, "123456");resultSet = preparedStatement.executeQuery();while (resultSet.next()) {System.out.println("編號:"+resultSet.getInt("id")+"\t用戶名" +resultSet.getString("userName")+"\t\t密碼"+resultSet.getString("userPass"));}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {try {if (resultSet != null) {resultSet.close();}if (preparedStatement != null) {preparedStatement.close();}if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}} }


五、多表操作

? ? ? ? 一對多,多對一,一對一,多對多

記錄一個多對多

一個學(xué)生可以學(xué)很多課程,一個課程也可以有很多學(xué)生在學(xué),形成多對多關(guān)系。

1.創(chuàng)建bean下的實體

Student

package bean;import java.util.List;public class Student {private int stuid;private String stuname;private int teacherid;private List<Subject> subjects;public int getStuid() {return stuid;}public void setStuid(int stuid) {this.stuid = stuid;}public String getStuname() {return stuname;}public void setStuname(String stuname) {this.stuname = stuname;}public int getTeacherid() {return teacherid;}public void setTeacherid(int teacherid) {this.teacherid = teacherid;}public List<Subject> getSubjects() {return subjects;}public void setSubjects(List<Subject> subjects) {this.subjects = subjects;} }

Subject

package bean;import java.util.List;public class Subject {private int subid;private String subname;private List<Student> students;public int getSubid() {return subid;}public void setSubid(int subid) {this.subid = subid;}public String getSubname() {return subname;}public void setSubname(String subname) {this.subname = subname;}public List<Student> getStudents() {return students;}public void setStudents(List<Student> students) {this.students = students;} }

2.創(chuàng)建接口和實現(xiàn)接口

接口功能是根據(jù)科目id查找誰在學(xué)習(xí)本課程,或者根據(jù)學(xué)生id查找這個學(xué)生學(xué)習(xí)了哪些課程。

interface StudentSubjectDao package impl;import bean.Student; import bean.Subject;public interface StudentSubjectDao {Subject getSubjectId(int subid);Student getStudentId(int stuid); } StudentSubjectDaoImp package dao;import bean.Student; import bean.Subject; import impl.StudentSubjectDao;import java.sql.*; import java.util.ArrayList; import java.util.List;public class StudentSubjectDaoImp implements StudentSubjectDao {@Overridepublic Subject getSubjectId(int subid) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {Class.forName("com.mysql.cj.jdbc.Driver");String userName = "root";String userPass = "123456";String url = "jdbc:mysql://localhost:3306/practice?serverTimezone=UTC";connection = DriverManager.getConnection(url, userName, userPass);String SQL = "select * FROM middle m,student st,subject su where m.stuid=st.stuid and m.subid=su.subid and m.subid=?";preparedStatement = connection.prepareStatement(SQL);preparedStatement.setInt(1, subid);resultSet = preparedStatement.executeQuery();Subject subject = new Subject();List<Student> students = new ArrayList<>();while (resultSet.next()) {subject.setSubid(resultSet.getInt("subid"));subject.setSubname(resultSet.getString("subname"));Student student = new Student();student.setStuname(resultSet.getString("stuname"));student.setStuid(resultSet.getInt("stuid"));students.add(student);}subject.setStudents(students);return subject;} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {try {if (connection != null) {connection.close();}if (preparedStatement != null) {preparedStatement.close();}if (resultSet != null) {resultSet.close();}} catch (SQLException e) {e.printStackTrace();}}return null;}@Overridepublic Student getStudentId(int stuid) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {Class.forName("com.mysql.cj.jdbc.Driver");String user = "root";String pass = "123456";String url = "jdbc:mysql://localhost:3306/practice?serverTimezone=UTC";connection = DriverManager.getConnection(url, user, pass);String sql = "select * from middle m,student st,subject su where su.subid=m.subid and st.stuid=m.stuid and m.stuid=?";preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1, stuid);resultSet = preparedStatement.executeQuery();Student student = new Student();List<Subject> subjects = new ArrayList<>();while (resultSet.next()) {student.setStuid(resultSet.getInt("stuid"));student.setStuname(resultSet.getString("stuname"));Subject subject = new Subject();subject.setSubname(resultSet.getString("subname"));subject.setSubid(resultSet.getInt("subid"));subjects.add(subject);}student.setSubjects(subjects);return student;} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {try {if (resultSet != null) {resultSet.close();}if (preparedStatement != null) {preparedStatement.close();}if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}return null;} }

3.在demo中打印查詢結(jié)果

package com;import bean.Student; import bean.Subject; import dao.StudentSubjectDaoImp; import impl.StudentSubjectDao;import java.util.List;public class Demo2 {public static void main(String[] args) {StudentSubjectDao studentSubjectDao2 = new StudentSubjectDaoImp();Subject subject = studentSubjectDao2.getSubjectId(2);List<Student> students = subject.getStudents();System.out.println(subject.getSubname() + subject.getSubid());for (Student student1 : students) {System.out.println(student1.getStuname() + student1.getStuid());}System.out.println("___________________________");StudentSubjectDao studentSubjectDao = new StudentSubjectDaoImp();Student student = studentSubjectDao.getStudentId(1);List<Subject> subjects = student.getSubjects();System.out.println(student.getStuname());for (Subject subject2 : subjects) {System.out.println(subject2.getSubname());}}}

4.結(jié)果

ui2 張三1 李四2 王五3 趙六4 花花5 瀟瀟6 ___________________________ 張三 java ui h5 c++進(jìn)程已結(jié)束,退出代碼0

六、事務(wù)的應(yīng)用

1.自動提交/手動提交切換

如果JDBC連接處于自動提交模式,默認(rèn)情況下,則每個SQL語句在完成后都會提交到數(shù)據(jù)庫。 事務(wù)使您能夠控制是否和何時更改應(yīng)用于數(shù)據(jù)庫。它將單個SQL語句或一組SQL語句視為一個邏輯單 元,如果任何語句失敗,則整個事務(wù)將失敗。 要啟用手動事務(wù)支持,而不是JDBC驅(qū)動程序默認(rèn)使用的自動提交模式,請使用Connection對象的 setAutoCommit()方法。如果將boolean false傳遞給setAutoCommit(),則關(guān)閉自動提交。我們 可以傳遞一個布爾值true來重新打開它。

connection.setAutoCommit(false);//關(guān)閉事務(wù)自動提交 connection.setAutoCommit(true);

2.事務(wù)的提交commit和回滾rollback

conn.commit( );//提交事務(wù) conn.rollback( );//回滾事務(wù)

可以在事務(wù)寫完之后加上conn.commit( );來提交事務(wù),在catch代碼塊報異常時寫回滾rollback來撤銷此次事務(wù)的操作。

3.保存點(diǎn)Savepoints

新的JDBC 3.0 Savepoint接口為提供了額外的事務(wù)控制。 設(shè)置保存點(diǎn)時,可以在事務(wù)中定義邏輯回滾點(diǎn)。如果通過保存點(diǎn)發(fā)生錯誤,則可以使用回滾方法來撤消 所有更改或僅保存在保存點(diǎn)之后所做的更改。

Connection對象有兩種新的方法來管理保存點(diǎn)
- setSavepoint(String savepointName):定義新的保存點(diǎn)。它還返回一個Savepoint對象。
- releaseSavepoint(Savepoint savepointName):刪除保存點(diǎn)。請注意,它需要一個Savepoint 對象作為參數(shù)。此對象通常是由setSavepoint()方法生成的保存點(diǎn)。

try{ //Assume a valid connection object conn conn.setAutoCommit(false); Statement stmt = conn.createStatement(); String SQL1 = "INSERT INTO Employees VALUES (106, 20, 'Rita', 'Tez')"; stmt.executeUpdate(SQL1); Savepoint savepoint1 = conn.setSavepoint("Savepoint1");//設(shè)置保存點(diǎn) String SQL2 = "INSERTED IN Employees VALUES (107, 22, 'Sita', 'Tez')"; stmt.executeUpdate(SQL2); conn.commit(); }catch(Exception se){ conn.rollback(savepoint1); }

上面一旦發(fā)生任何錯誤那么sql2就會執(zhí)行失敗,但是如果sql1的語句是對的,那么還可以正常執(zhí)行

如過此處沒有添加事務(wù)的概念,那么即使出現(xiàn)了其它的異常,只要sql語句沒問題,數(shù)據(jù)庫還是會改動數(shù)據(jù),這樣有些需要同步執(zhí)行的數(shù)據(jù)操作就會出現(xiàn)錯誤,如轉(zhuǎn)賬,一個加錢另一個卻沒減錢就很不合理。

七、JDBC批處理

?1.Statement批處理

????????- 使用createStatement()方法o創(chuàng)建Statement對象。
????????- 使用setAutoCommit()將auto-commit設(shè)置為false 。 (設(shè)置為手動提交事務(wù))
????????- 使用addBatch()方法在創(chuàng)建的語句對象上添加您喜歡的SQL語句到批處理中。
????????- 在創(chuàng)建的語句對象上使用executeBatch()方法執(zhí)行所有SQL語句。
????????- 最后,使用commit()方法提交所有更改。

Statement stmt = conn.createStatement(); conn.setAutoCommit(false);String SQL = "INSERT INTO Employees (id, first, last, age) VALUES(200,'Zia','Ali', 30)"; stmt.addBatch(SQL);String SQL = "INSERT INTO Employees (id, first, last, age) VALUES(201,'Raj','Kumar', 35)"; stmt.addBatch(SQL);String SQL = "UPDATE Employees SET age = 35 WHERE id = 100"; stmt.addBatch(SQL);int[] count = stmt.executeBatch(); conn.commit();

2.PreparedStatement批處理

String SQL = "INSERT INTO Employees (id, first, last, age) VALUES(?, ?, ?, ?)";PreparedStatement pstmt = conn.prepareStatement(SQL);//處理sql語句 conn.setAutoCommit(false);//切換手動提交事務(wù)pstmt.setInt( 1, 400 );//問號賦值 pstmt.setString( 2, "Pappu" ); pstmt.setString( 3, "Singh" ); pstmt.setInt( 4, 33 );pstmt.addBatch();pstmt.setInt( 1, 401 ); pstmt.setString( 2, "Pawan" ); pstmt.setString( 3, "Singh" ); pstmt.setInt( 4, 31 );pstmt.addBatch();int[] count = stmt.executeBatch();//執(zhí)行所有sql語句conn.commit();

八、反射處理結(jié)果集

????????

interface StudentSubjectDao package impl;import bean.Student;import java.util.List;public interface StudentSubjectDao {List<Student> getAllStudent(Class cla); } StudentSubjectDaoImp implements StudentSubjectDao package dao;import bean.Student; import bean.Subject; import impl.StudentSubjectDao;import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.sql.*; import java.util.ArrayList; import java.util.List;public class StudentSubjectDaoImp implements StudentSubjectDao {@Overridepublic List<Student> getAllStudent(Class cla) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {Class.forName("com.mysql.cj.jdbc.Driver");String user = "root";String pass = "123456";String url = "jdbc:mysql://localhost:3306/practice?serverTimezone=UTC";connection = DriverManager.getConnection(url, user, pass);String sql = "select * from student";preparedStatement = connection.prepareStatement(sql);resultSet = preparedStatement.executeQuery();List students = new ArrayList<>();//1.得到數(shù)據(jù)庫的查詢結(jié)果的列信息ResultSetMetaData metaData = resultSet.getMetaData();int columnCount = metaData.getColumnCount();//得到列名,返回列名數(shù)量String[] columnNames = new String[columnCount];//列名for (int i = 0; i < columnCount; i++) {columnNames[i]=metaData.getColumnName(i+1);//將結(jié)果集中的列名取出來 // System.out.println(columnNames[i]);}//2.得到類中方法Method[] declaredMethods = cla.getDeclaredMethods();//通過傳來的cla得到student方法while (resultSet.next()) {try {Object stu=cla.getDeclaredConstructor().newInstance();//創(chuàng)建對象for (String columnName : columnNames) {//遍歷結(jié)果的列名String methodName = "set"+columnName;//set組合列名for (Method declaredMethod : declaredMethods) {//遍歷方法集if (declaredMethod.getName().equalsIgnoreCase(methodName)){//如果student中某個的方法名和set加結(jié)果集列名組合的方法名一樣declaredMethod.invoke(stu,resultSet.getObject(columnName));//調(diào)用這個set方法將結(jié)果集中的數(shù)據(jù)賦值給這個studen對象break;}}}students.add(stu);} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();}}return students;} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {try {if (resultSet != null) {resultSet.close();}if (preparedStatement != null) {preparedStatement.close();}if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}return null;} }

demo

package com;import bean.Student; import dao.StudentSubjectDaoImp; import impl.StudentSubjectDao;import java.util.List;public class Demo3 {public static void main(String[] args) {StudentSubjectDao studentSubjectDao = new StudentSubjectDaoImp();List<Student> allStudent = studentSubjectDao.getAllStudent(Student.class);for (Student student : allStudent) {System.out.println(student.getStuid()+student.getStuname()+student.getTeacherid());}} }

結(jié)果

1張三3 2李四1 3王五3 4趙六1 5花花1 6瀟瀟2

九、封裝工具類

通過工具類可以極大地簡化代碼

DBUtils package util;import java.sql.*; import java.util.List;public class DBUtils {private Connection connection = null;private PreparedStatement preparedStatement = null;private ResultSet resultSet = null;private int count;//統(tǒng)計增刪改操作受影響的行數(shù)String userName = "root";String userPass = "123456";String url = "jdbc:mysql://localhost:3306/practice?serverTimezone=UTC";//加載驅(qū)動static {try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 獲得連接*/protected Connection getConnection() {try {connection = DriverManager.getConnection(url, userName, userPass);} catch (SQLException e) {e.printStackTrace();}return connection;}/*** 得到預(yù)狀態(tài)通道*/protected PreparedStatement getPreparedStatement(String sql) {try {preparedStatement = getConnection().prepareStatement(sql);} catch (SQLException e) {e.printStackTrace();}return preparedStatement;}/*** 綁定參數(shù)* List保存的是給占位符所賦的值,即?部分的值*/protected void param(List list) {if (list != null && list.size() > 0) {for (int i = 0; i < list.size(); i++) {try {preparedStatement.setObject(i + 1, list.get(i));} catch (SQLException e) {e.printStackTrace();}}}}/*** 更新操作*/protected int upData(String sql, List list) {try {getPreparedStatement(sql);//獲得預(yù)狀態(tài)通道param(list);//補(bǔ)全sql中問號部分count = preparedStatement.executeUpdate();} catch (SQLException e) {e.printStackTrace();}return count;}/*** 查詢操作*/protected ResultSet query(String sql, List list) {try {getPreparedStatement(sql);//獲得預(yù)狀態(tài)通道param(list);//補(bǔ)全sql中問號部分resultSet = preparedStatement.executeQuery();} catch (SQLException e) {e.printStackTrace();}return resultSet;}/*** 關(guān)閉資源*/protected void closeAll() {try {if (connection != null) {connection.close();}if (preparedStatement != null) {preparedStatement.close();}if (resultSet != null) {resultSet.close();}} catch (SQLException e) {e.printStackTrace();}}} StudentSubjectDaoImp extends DBUtils implements StudentSubjectDao(繼承工具類以直接使用工具類DBUtils中的方法) public class StudentSubjectDaoImp extends DBUtils implements StudentSubjectDao { @Overridepublic Student getByStudentId(int stuid) {Student student = new Student();try {String sql="select * from student where stuid=?";List list = new ArrayList();list.add(stuid);ResultSet resultSet = query(sql,list);while (resultSet.next()){student.setStuid(resultSet.getInt("stuid"));student.setStuname(resultSet.getString("stuname"));}} catch (SQLException e) {e.printStackTrace();}return student;} }

demo(通過學(xué)號查找人)

package com;import bean.Student; import dao.StudentSubjectDaoImp; import impl.StudentSubjectDao;public class Demo4 {public static void main(String[] args) {StudentSubjectDao studentSubjectDao = new StudentSubjectDaoImp();Student student = studentSubjectDao.getByStudentId(2);System.out.println(student.getStuid()+student.getStuname());} }

十、屬性文件

用來存儲用戶名密碼url等信息

db.properties userName=root userPass=123456 url=jdbc:mysql://localhost:3306/practice?serverTimezone=UTC driver=com.mysql.cj.jdbc.Driver

?加載驅(qū)動的兩種方法

//方法1 InputStream inputStream = 當(dāng)前類名.class.getClassLoader() .getResourceAsStream("db.properties"); Properties properties = new Properties(); properties.load(inputStream); dirverName = properties.getProperty("driver"); url = properties.getProperty("url"); username = properties.getProperty("user"); password = properties.getProperty("password");//方法2 ResourceBundle bundle = ResourceBundle.getBundle("db"); driver = bundle.getString("driver"); url = bundle.getString("url"); userName = bundle.getString("userName"); userPass = bundle.getString("userPass"); Class.forName(driver);

完整DBUtils

package util;import java.sql.*; import java.util.List; import java.util.ResourceBundle;public class DBUtils {private Connection connection = null;private PreparedStatement preparedStatement = null;private ResultSet resultSet = null;private int count=0;//統(tǒng)計增刪改操作受影響的行數(shù)private static String userName;private static String userPass;private static String url;private static String driver;//加載驅(qū)動static {try {ResourceBundle bundle = ResourceBundle.getBundle("db");driver = bundle.getString("driver");url = bundle.getString("url");userName = bundle.getString("userName");userPass = bundle.getString("userPass");Class.forName(driver);} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 獲得連接*/protected Connection getConnection() {try {connection = DriverManager.getConnection(url, userName, userPass);} catch (SQLException e) {e.printStackTrace();}return connection;}/*** 得到預(yù)狀態(tài)通道*/protected PreparedStatement getPreparedStatement(String sql) {try {preparedStatement = getConnection().prepareStatement(sql);} catch (SQLException e) {e.printStackTrace();}return preparedStatement;}/*** 綁定參數(shù)* List保存的是給占位符所賦的值,即?部分的值*/protected void param(List list) {if (list != null && list.size() > 0) {for (int i = 0; i < list.size(); i++) {try {preparedStatement.setObject(i + 1, list.get(i));} catch (SQLException e) {e.printStackTrace();}}}}/*** 更新操作* 參數(shù)含義(sql語句,?占位符上的值)* @return 返回受影響的行數(shù)*/protected int upData(String sql, List list) {try {getPreparedStatement(sql);//獲得預(yù)狀態(tài)通道param(list);//補(bǔ)全sql中問號部分count = preparedStatement.executeUpdate();} catch (SQLException e) {e.printStackTrace();}return count;}/*** 查詢操作* 參數(shù)含義(sql語句,?占位符上的值)* @return 查詢數(shù)據(jù)庫返回的結(jié)果集*/protected ResultSet query(String sql, List list) {try {getPreparedStatement(sql);//獲得預(yù)狀態(tài)通道param(list);//補(bǔ)全sql中問號部分resultSet = preparedStatement.executeQuery();} catch (SQLException e) {e.printStackTrace();}return resultSet;}/*** 關(guān)閉資源*/protected void closeAll() {try {if (connection != null) {connection.close();}if (preparedStatement != null) {preparedStatement.close();}if (resultSet != null) {resultSet.close();}} catch (SQLException e) {e.printStackTrace();}}}

十一、連接池

*連接池基本的思想是在系統(tǒng)初始化的時候,將數(shù)據(jù)庫連接作為對象存儲在內(nèi)存中,當(dāng)用戶需要訪問數(shù) 據(jù)庫時,并非建立一個新的連接,而是從連接池中取出一個已建立的空閑連接對象。使用完畢后,用戶 也并非將連接關(guān)閉,而是將連接放回連接池中,以供下一個請求訪問使用。而連接的建立、斷開都由連 接池自身來管理。同時,還可以通過設(shè)置連接池的參數(shù)來控制連接池中的初始連接數(shù)、連接的上下限數(shù) 以及每個連接的最大使用次數(shù)、最大空閑時間等等,也可以通過其自身的管理機(jī)制來監(jiān)視數(shù)據(jù)庫連接的數(shù)量、使用情況等。

*連接池用linklist默認(rèn)初始化十個連接,其中有commit,rollback等常規(guī)方法,其中close方法在關(guān)閉資源時并不是真的關(guān)閉了資源,而是使用linklist的addlast方法將這個連接放在了連接池尾部,以待下次調(diào)用。 *最小連接數(shù) : 是數(shù)據(jù)庫一直保持的數(shù)據(jù)庫連接數(shù),所以如果應(yīng)用程序?qū)?shù)據(jù)庫連接的使用量不大,將有大量的數(shù)據(jù)庫資源被浪費(fèi)。 *初始化連接數(shù): 連接池啟動時創(chuàng)建的初始化數(shù)據(jù)庫連接數(shù)量。 *最大連接數(shù) 是連接池能申請的最大連接數(shù),如果數(shù)據(jù)庫連接請求超過此數(shù),后面的數(shù)據(jù)庫連接請求被加入到等待隊列中。 *最大等待時間: 當(dāng)沒有可用連接時,連接池等待連接被歸還的最大時間,超過時間則拋出異常,可設(shè)置參數(shù)為 0 或者負(fù)數(shù) 使得無限等待( 根據(jù)不同連接池配置 ) 。
DBCPC3P0DRUID
最小連接數(shù)minldle(0)minPoolSize(3)mindle(o)
初始化連接數(shù)initialSize(0)initialPoolSize(3)initialSize(0)
最大連接數(shù)maxTotal(8)maxPoolSize(15)maxActive(8)
最大等待時間maxWaitMillis(毫秒)maxldleTime(0秒)maxWait(毫秒)

1.DBCP(不可以自動回收空閑連接)

先在lib文件夾下注入jia包

?將DBUtils部分的加載驅(qū)動和獲得連接部分做修改

private static BasicDataSource basicDataSource = new BasicDataSource(); //加載驅(qū)動static {ResourceBundle bundle = ResourceBundle.getBundle("db");driver = bundle.getString("driver");url = bundle.getString("url");userName = bundle.getString("userName");userPass = bundle.getString("userPass");basicDataSource.setUsername(userName);//獲取用戶名basicDataSource.setPassword(userPass);//獲取密碼basicDataSource.setUrl(url);//獲取urlbasicDataSource.setDriverClassName(driver);//獲取驅(qū)動位置basicDataSource.setInitialSize(10);//設(shè)置初始連接數(shù)}/*** 獲得連接*/protected Connection getConnection() {try {connection = basicDataSource.getConnection();//獲得連接} catch (SQLException e) {e.printStackTrace();}return connection;}

2.C3P0(自動回收空閑連接)

在lib下注入jar包,src目錄下創(chuàng)建c3p0-config.xml文件

C3P0通過配置文件來完成所有操作,因此將原先db.properties中的信息寫入配置文件

<?xml version="1.0" encoding="UTF-8"?> <c3p0-config><default-config><property name="driverClass">com.mysql.cj.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/practice?serverTimezone=UTC</property><property name="user">root</property><property name="password">123456</property><!-- 等待連接的超時時間,默認(rèn)為0,代表無限等待,單位是毫秒 --><property name="checkoutTimeout">30000</property><!-- 檢查空閑連接 默認(rèn)為0 代表不檢查 --><property name="idleConnectionTestPeriod">30</property><!-- 初始化連接 --><property name="initialPoolSize">10</property><!-- 最大空閑時間,超過這個時間的連接將被丟棄,默認(rèn)為0,代表永遠(yuǎn)不關(guān)閉 --><property name="maxIdleTime">30</property><!-- 最大連接數(shù) --><property name="maxPoolSize">100</property><!-- 最小連接數(shù) --><property name="minPoolSize">10</property><!-- preparedStatement的緩存大小 --><property name="maxStatements">200</property><!--當(dāng)連接池中的連接耗盡的時候c3p0一次同時獲取的連接數(shù)。默認(rèn)值: 3 --> <property name="AcquireIncrement">5</property></default-config></c3p0-config>

寫入配置文件后不用再手動加載驅(qū)動?,static加載驅(qū)動部分不用再寫

private static ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();/*** 獲得連接*/protected Connection getConnection() {try {connection = comboPooledDataSource.getConnection();} catch (SQLException e) {e.printStackTrace();}return connection;}

3.Druid德魯伊(阿里開發(fā))

????????它不僅僅是一個數(shù)據(jù)庫連接池,它還包含一個 ProxyDriver(代理驅(qū)動),一系列內(nèi)置的JDBC 組件庫,一個 SQL Parser(sql 解析器 ) 。支持所有 JDBC 兼 容的數(shù)據(jù)庫,包括Oracle MySql 、 Derby 、 Postgresql 、 SQL Server 、 H2 等等。 ????????Druid針對 Oracle MySql 做了特別優(yōu)化,比如 Oracle PS Cache 內(nèi)存占用優(yōu)化, MySql ping 檢測優(yōu)化。 ????????Druid提供了 MySql 、 Oracle 、 Postgresql 、 SQL-92 SQL 的完整支持,這是一個手寫的高性能 SQL Parser,支持 Visitor 模式,使得分析 SQL 的抽象語法樹很方便。 簡單SQL 語句用時 10 微秒以內(nèi),復(fù)雜 SQL 用時 30 微秒。 ????????通過Druid 提供的 SQL Parser 可以在 JDBC 層攔截 SQL 做相應(yīng)處理,比如說分庫分表、審計等。 Druid 防御SQL注入攻擊的WallFilter 就是通過 Druid SQL Parser 分析語義實現(xiàn)的。 ????????Druid 是目前比較流行的高性能的,分布式列存儲的 OLAP 框架 ( 具體來說是 MOLAP) 。它有如下幾個特點(diǎn) . 亞秒級查詢 ????????druid提供了快速的聚合能力以及亞秒級的 OLAP 查詢能力,多租戶的設(shè)計,是面向用戶分析應(yīng)用的理想方式。 . 實時數(shù)據(jù)注入 druid 支持流數(shù)據(jù)的注入,并提供了數(shù)據(jù)的事件驅(qū)動,保證在實時和離線環(huán)境下事件的實效性和統(tǒng)一性 . 可擴(kuò)展的 PB 級存儲 druid 集群可以很方便的擴(kuò)容到 PB 的數(shù)據(jù)量,每秒百 萬級別的數(shù)據(jù)注入。即便在加大數(shù)據(jù)規(guī)模的情況下,也能保證時其效性 . 多環(huán)境部署 druid 既可以運(yùn)行在商業(yè)的硬件上,也可以運(yùn)行在云上。它可以從多種數(shù)據(jù)系統(tǒng)中注入數(shù)據(jù),包括 hadoop spark kafka storm samza . 豐富的社區(qū) 使用方法: 在lib下注入jar包 獲得對象,手動獲取地址,需要注意德魯伊默認(rèn)最大活躍連接數(shù)量是8因此如果要設(shè)置大于8的活躍連接數(shù)應(yīng)該先設(shè)置上限

?

//Druid對象private static DruidDataSource druidDataSource = new DruidDataSource();//加載驅(qū)動static {ResourceBundle bundle = ResourceBundle.getBundle("db");driver = bundle.getString("driver");url = bundle.getString("url");userName = bundle.getString("userName");userPass = bundle.getString("userPass");druidDataSource.setUrl(url);druidDataSource.setUsername(userName);druidDataSource.setPassword(userPass);druidDataSource.setDriverClassName(driver);druidDataSource.setMaxActive(20);//設(shè)置活躍連接上限druidDataSource.setInitialSize(20);//設(shè)置連接數(shù)}/*** 獲得連接*/protected Connection getConnection() {try {connection = druidDataSource.getConnection();} catch (SQLException e) {e.printStackTrace();}return connection;}

總結(jié)

以上是生活随笔為你收集整理的五、JDBC(复习)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

国色天香永久免费 | 日韩一区在线免费观看 | 麻豆91小视频 | 91九色成人| 中文字幕在线影院 | 91在线看| 中文在线免费看视频 | 日韩av高清在线观看 | 亚洲年轻女教师毛茸茸 | 91精品国产乱码在线观看 | 婷婷久久久| 91成熟丰满女人少妇 | 中文字幕免费看 | 日韩a级黄色 | 在线成人欧美 | 亚洲精品在线免费观看视频 | 欧美精品亚洲二区 | 91九色在线视频观看 | 欧美做受69 | 国产精品久久久久久久电影 | 久久视频在线看 | 一级黄色片网站 | 国产在线无 | 久久这里精品视频 | 在线观看成人小视频 | 麻豆免费精品视频 | 91在线看网站 | www.com在线观看 | 日本一区二区三区视频在线播放 | 亚洲成人av在线电影 | 久久高清免费观看 | 精品国产午夜 | 免费观看9x视频网站在线观看 | 婷婷综合在线 | 91人人爱 | 日韩在线视频免费播放 | 国内亚洲精品 | 看毛片网站 | 又大又硬又黄又爽视频在线观看 | 免费欧美 | 99久久精品免费看国产四区 | 国产婷婷一区二区 | 国产99久久久国产精品 | 一区二区三区韩国免费中文网站 | av千婊在线免费观看 | 97人人模人人爽人人少妇 | 久久久久亚洲最大xxxx | 在线国产精品视频 | 日韩av三区 | 日本在线观看中文字幕 | 久久天堂亚洲 | 精品久久免费 | 亚洲电影免费 | 国产九九九视频 | 免费看久久久 | 正在播放国产精品 | 久久在线免费观看视频 | 超级碰碰免费视频 | 天天干,天天射,天天操,天天摸 | 久久人人爽人人人人片 | 香蕉免费在线 | 国产最顶级的黄色片在线免费观看 | 91亚洲精品久久久蜜桃网站 | 亚洲精品午夜久久久久久久久久久 | 一区二区三区免费播放 | 欧美一区二区在线看 | 久久久精品网站 | 中文字幕电影高清在线观看 | 日本中文字幕电影在线免费观看 | 不卡日韩av| 精品亚洲视频在线 | 五月在线 | 日韩欧美在线影院 | 天天草av | 国产清纯在线 | 欧美性色黄 | 91tv国产成人福利 | 正在播放 国产精品 | 激情电影在线观看 | 国产精品不卡在线播放 | 黄色av电影网 | 九九视频免费 | 在线观看国产福利片 | 国产91国语对白在线 | 精品美女久久久久久免费 | 丁香婷婷综合网 | 亚洲毛片视频 | 色先锋av资源中文字幕 | 国产在线视频一区二区 | 亚洲少妇激情 | 天天射天天干天天爽 | 亚洲午夜av电影 | 97在线成人 | 狠狠做深爱婷婷综合一区 | av成人在线播放 | 玖玖在线看 | 成人免费视频在线观看 | av电影免费在线播放 | 不卡的av在线 | 亚洲激情综合 | 最新真实国产在线视频 | 黄色日视频 | 中文字幕在线观看第一区 | 超碰九九 | 日本中文字幕系列 | 天天曰视频| 婷婷六月激情 | 精品国产免费久久 | 麻豆影视在线免费观看 | 国产最新视频在线观看 | 天天射,天天干 | 国产高清av免费在线观看 | 色999在线| 欧美成人精品三级在线观看播放 | 四虎影视精品永久在线观看 | 国产精品自拍av | 免费看日韩 | 国产操在线 | 中文字幕乱在线伦视频中文字幕乱码在线 | 91豆花在线 | 亚洲日本va在线观看 | 日韩久久在线 | 亚洲成人软件 | 亚洲精品久久久蜜臀下载官网 | 国产福利91精品 | 欧美91视频| 国产在线观看h | 中文av网站| 97在线影院 | 亚洲九九九在线观看 | 久久精品区 | 精品福利在线 | 国产美女无遮挡永久免费 | 日本丶国产丶欧美色综合 | 伊人狠狠色丁香婷婷综合 | 国产高清免费 | 精品国产一区二区三区av性色 | 国语对白少妇爽91 | 欧美日韩在线观看一区二区 | 国产成人精品一区二 | 中文字幕亚洲欧美日韩 | 97av超碰| 一本一本久久a久久精品综合 | 精品视频网站 | 亚洲国产网址 | 中文区中文字幕免费看 | 日韩久久久久 | 91麻豆精品久久久久久 | 亚洲精品国产精品国自 | 亚洲最大av在线播放 | 成年人在线观看免费视频 | 免费一级毛毛片 | 丁香久久激情 | 四季av综合网站 | 国产资源免费在线观看 | 亚洲黄色在线免费观看 | www.888.av| 欧美日韩亚洲在线观看 | www黄色com| 成人91av | 欧美日韩99 | 婷婷激情久久 | 中文字幕第一页av | 成人免费xxxxxx视频 | 欧美一级日韩三级 | 天天爽夜夜爽人人爽一区二区 | 欧美欧美| 美女网站色在线观看 | 国产精品淫 | 人人干网 | 人人爱爱 | 97精品国自产拍在线观看 | 丁香婷婷深情五月亚洲 | 亚洲一区二区黄色 | 在线 国产 日韩 | 国产自制av | 久久另类视频 | 国产小视频免费观看 | 天无日天天操天天干 | 亚洲情婷婷 | 国产又粗又猛又黄视频 | 在线观看国产区 | 深夜精品福利 | 精品一区 在线 | 久久久久久久久国产 | 91精品在线免费观看视频 | 国产专区在线 | 午夜黄色影院 | 日韩精品久久久久久久电影99爱 | 免费高清国产 | 欧美91精品久久久久国产性生爱 | 亚洲久草视频 | 伊人丁香 | 国产高清黄 | av免费试看| 91麻豆精品国产自产 | 最近中文字幕在线播放 | 免费看毛片网站 | 精品国产中文字幕 | 天天爽天天爽天天爽 | 三级免费黄色 | 丁香六月国产 | 欧美一区成人 | 国内精品福利视频 | 久久久国产精品电影 | 天天干天天操天天爱 | 一区二区三区高清 | 国产99精品在线观看 | 国产精品一二 | 夜夜夜夜爽 | 久久久久久久网站 | 少妇性色午夜淫片aaaze | 欧美在线91| 黄色a一级片 | 国产粉嫩在线观看 | 国产精品中文字幕av | 99精品成人 | 国产综合精品一区二区三区 | 一级黄色大片 | 又黄又爽又色无遮挡免费 | 成人小视频在线免费观看 | 爱干视频| 亚洲永久国产精品 | 韩国av免费观看 | 免费a级观看 | 日本韩国精品一区二区在线观看 | 久久精品中文字幕少妇 | 亚洲精品成人在线 | 欧美91精品国产自产 | 亚洲日本va午夜在线电影 | 国产玖玖视频 | 久久精品一区 | 色人久久 | 深夜免费福利网站 | 亚洲高清在线观看视频 | 国产真实精品久久二三区 | 久久99视频精品 | 久久久国内精品 | 国产成人精品一区二区三区网站观看 | 亚洲国产中文字幕在线观看 | 亚洲午夜久久久综合37日本 | 国产精品ssss在线亚洲 | 日本性生活一级片 | 色婷婷成人 | 黄色av成人在线观看 | 亚洲高清在线观看视频 | 日韩精品一区二区三区丰满 | 亚洲精品h | 国产婷婷在线观看 | 日韩中文字幕一区 | 亚洲四虎| 久久亚洲精品国产亚洲老地址 | 麻豆国产视频下载 | 色视频成人在线观看免 | 日韩有码在线播放 | 成年人网站免费在线观看 | 日韩免| 国产 色 | 丁香免费视频 | 午夜国产影院 | 天天操天天色综合 | 免费福利片2019潦草影视午夜 | 国产中文字幕91 | 中文字幕在线观看视频网站 | 99麻豆久久久国产精品免费 | 亚洲成人av一区二区 | 99色免费视频 | 国产青青青 | 亚洲视频精品在线 | 狠狠操狠狠干天天操 | 中文字幕日韩无 | 亚洲精品一区二区三区高潮 | 国产成人av在线 | 天天干天天做 | 久久久久久久久久网 | 2019中文最近的2019中文在线 | 国产美女免费观看 | 亚洲丝袜中文 | 午夜精品一区二区三区免费 | 在线观看视频h | 国产精品理论视频 | 2023av| 伊人久久婷婷 | 经典三级一区 | www四虎影院 | 超碰公开在线观看 | 中文字幕在线一区观看 | av资源免费在线观看 | av在线看片 | 亚洲综合视频在线观看 | 国产一区二区精品久久 | 亚洲精品久久久久中文字幕m男 | 夜夜躁日日躁狠狠久久88av | 国产 视频 高清 免费 | 欧美少妇影院 | 精品国产视频在线观看 | 在线导航福利 | 日韩电影中文字幕在线 | 中文字幕av在线播放 | 91网页版在线观看 | 国产成人免费观看 | 五月激情五月激情 | a天堂最新版中文在线地址 久久99久久精品国产 | 波多野结衣视频一区二区三区 | 精品99久久久久久 | 黄色网在线播放 | 日本黄色大片儿 | 亚洲理论在线观看 | 久久精品男人的天堂 | 亚洲va在线va天堂va偷拍 | 婷婷综合五月 | 91精品国自产在线观看欧美 | www在线免费观看 | 久久国产手机看片 | 黄色片免费在线 | 久影院 | 日韩成人免费电影 | av大全在线免费观看 | 99久久99久久 | 亚洲精品大片www | 欧美先锋影音 | 嫩草伊人久久精品少妇av | 91久草视频| 亚洲专区欧美专区 | 精品免费观看视频 | 婷婷激情在线 | 国产.精品.日韩.另类.中文.在线.播放 | 97手机电影网 | 国产视频在线看 | 视频99爱| 久久视频在线免费观看 | 免费视频你懂得 | 免费在线一区二区三区 | 精品国产一区二区三区在线 | www.久久久.com | 久久精品视频免费观看 | av黄色亚洲| 四虎成人精品永久免费av | 99人久久精品视频最新地址 | 国产一区二区三区高清播放 | 免费一级黄色 | 91视频麻豆| 精品美女在线视频 | 视频一区二区免费 | 91视频麻豆视频 | 在线a人片免费观看视频 | 九九99视频 | 草久视频在线 | 九九久久国产精品 | 日本aaaa级毛片在线看 | 国产精品一区一区三区 | 欧美日韩视频一区二区三区 | 亚洲精品理论片 | 精品国产精品一区二区夜夜嗨 | av黄网站| 成年人在线电影 | 91视频国产免费 | 国产伦理一区 | 欧美视频99| 毛片888 | 91影视成人 | 日韩在线国产 | 精品久久免费看 | 国产一区二区播放 | 91cn国产在线 | 精品国产一区二区三区日日嗨 | 久久这里只有精品9 | 国产.精品.日韩.另类.中文.在线.播放 | 欧美在线1| 免费国产黄线在线观看视频 | 亚洲最大av网站 | 黄av资源 | 国产日韩精品一区二区三区 | 国产精美视频 | 黄色成人免费电影 | 六月丁香久久 | 在线国产中文 | 中文字幕视频 | 久久综合影音 | 九九免费在线看完整版 | 国产精品久久久久久久久久久久午夜 | 亚洲日日日 | 国产高清在线观看 | 日韩av福利在线 | 国产不卡一二三区 | 亚洲一区精品人人爽人人躁 | 国产精品视频专区 | 成人影视片 | 51精品国自产在线 | 国产小视频在线免费观看 | 亚洲精品乱码久久久久久久久久 | 在线观看av国产 | 日韩肉感妇bbwbbwbbw | 欧美日韩另类在线观看 | 国产精品免费成人 | 在线观看电影av | 精品视频在线观看 | 国产成人精品国内自产拍免费看 | 麻花豆传媒mv在线观看网站 | 亚洲三级视频 | 一级免费观看 | 91在线播| 天天玩夜夜操 | 日韩免费久久 | 国产福利一区在线观看 | 欧美日韩午夜爽爽 | 久免费| 97久久久免费福利网址 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 娇妻呻吟一区二区三区 | 超碰97成人| 免费在线国产 | 毛片随便看 | 一区二区三区高清在线观看 | 亚洲黄色三级 | 91精品国产高清自在线观看 | 欧美日韩国产精品一区二区三区 | 91av视频在线观看免费 | 久久黄色片子 | 久久视频6 | 成人性生交视频 | 久久国产精品视频观看 | 免费观看第二部31集 | 高清中文字幕 | 日韩欧美在线影院 | 中文字幕亚洲综合久久五月天色无吗'' | 成人超碰97| 国产成人一区二 | 91一区二区三区在线观看 | 日本久久电影网 | 欧美日韩在线观看一区二区三区 | 毛片久久久 | 亚洲区视频在线观看 | 91九色蝌蚪视频 | 中文字幕观看av | 久久激情婷婷 | 青青草久草在线 | 亚洲欧美日韩国产精品一区午夜 | 狠狠综合久久av | 白丝av免费观看 | 中文字幕韩在线第一页 | 伊人亚洲精品 | 日韩免费一区二区 | 欧美伦理一区二区 | 91片在线观看 | 中文字幕日韩无 | 在线观看国产 | 日韩av午夜 | 久久视频国产精品免费视频在线 | 国产一级久久久 | 五月天婷婷在线播放 | 欧美一区二区免费在线观看 | 色在线观看网站 | 天天爱天天射天天干天天 | 欧美日韩一区二区三区在线免费观看 | 亚洲天堂网在线视频观看 | 久久人人精 | 成人在线观看资源 | 欧美激情第一页xxx 午夜性福利 | 97精品国产一二三产区 | 天天草天天摸 | 久久综合婷婷国产二区高清 | 91精品一区国产高清在线gif | 99成人在线视频 | 1区2区视频 | 国产成人精品久久亚洲高清不卡 | 中文字幕一区二区在线观看 | 国产精品免费看久久久8精臀av | 久久久私人影院 | av资源免费在线观看 | 久久视频| 偷拍久久久 | 亚洲免费成人av电影 | 日韩视频图片 | 欧美午夜精品久久久久久浪潮 | 免费看的黄色网 | 日本资源中文字幕在线 | 国产综合婷婷 | 成人午夜电影在线播放 | 9幺看片 | 日韩高清免费无专码区 | 欧美精彩视频在线观看 | 久久网站最新地址 | 久久久久久久亚洲精品 | 久久电影网站中文字幕 | 99久久久久免费精品国产 | 91亚洲精品国偷拍 | 亚洲精品乱码久久久久久高潮 | 久久精品电影院 | 日本爽妇网 | 色妞色视频一区二区三区四区 | 国产精品第2页 | 色多多视频在线观看 | 超碰激情在线 | 日韩av偷拍 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 亚洲片在线观看 | 日韩成人在线免费观看 | 午夜久久 | 91av视频免费在线观看 | 欧美一区二区伦理片 | 三级在线视频播放 | 色综合久久久久久久久五月 | 精品国产乱码久久久久久1区二区 | 色网站在线 | va视频在线观看 | 精品成人在线 | 天天操天天色天天 | 日日成人网 | 国产一级二级在线播放 | 夜夜躁日日躁狠狠久久88av | 国产精品a级 | 日本黄色免费播放 | 96国产精品视频 | 免费在线国产视频 | 日本久久综合网 | www.国产视频 | 五月天伊人网 | 欧美日韩一区二区在线观看 | 少妇搡bbbb搡bbb搡aa | 亚洲精品天天 | 国产成人香蕉 | 国产三级香港三韩国三级 | 玖玖爱在线观看 | 亚洲一二三区精品 | 欧美日韩精品在线播放 | 91精品网站在线观看 | 欧美精品资源 | 国产精品欧美日韩在线观看 | 91丨porny丨九色 | 九九国产视频 | 国产精品对白一区二区三区 | 五月婷婷综 | 久久视频免费 | 国产免费成人 | 粉嫩av一区二区三区四区在线观看 | 免费久草视频 | 一区二区三区在线观看免费视频 | 91精品在线免费观看视频 | 一区二区三区在线不卡 | 久久与婷婷 | 在线免费黄色 | 国产视频日本 | 国内久久视频 | 日韩av黄| 久久狠狠婷婷 | www.综合网.com | 国产在线观 | 欧美大片在线观看一区 | 九九热视频在线免费观看 | 亚洲欧美国内爽妇网 | 九色自拍视频 | 992tv在线观看网站 | 国产久草在线观看 | 国产中文字幕在线免费观看 | 免费看国产a | 97激情影院| www五月| 国产91aaa | 在线看片91 | 一区二区三区日韩视频在线观看 | 五月婷婷丁香激情 | 黄色a在线| 最近日本中文字幕 | 天天爽夜夜操 | 蜜桃av久久久亚洲精品 | 国产精品免费视频观看 | 婷婷丁香六月天 | 欧美激情综合色综合啪啪五月 | 波多野结衣电影一区二区三区 | 国产1区2区3区精品美女 | 在线国产精品视频 | 免费看的黄色 | 亚洲黄色片一级 | 中文字幕久久久精品 | 国产精品久久久久久久久久妇女 | 粉嫩av一区二区三区入口 | 成人午夜网 | 午夜美女福利 | 狠狠躁日日躁夜夜躁av | 日韩一区二区三区高清在线观看 | 天天操比| 成人国产精品一区二区 | 国产在线国偷精品产拍免费yy | www国产在线| 五月婷婷开心 | 在线电影91 | 天天亚洲 | 粉嫩av一区二区三区免费 | 美女一二三区 | 久久高清 | 久久久久久黄色 | 日韩二区在线 | 综合婷婷久久 | 九九热在线视频 | 国产日韩欧美综合在线 | 婷婷久久综合九色综合 | 亚洲国产美女久久久久 | 精品美女在线视频 | 国产精品久久片 | 日本大尺码专区mv | 婷婷射五月| 黄色成年 | 久久tv视频| 久久久久国产视频 | 国产精品自产拍在线观看蜜 | 狠狠操夜夜操 | 日韩精品一二三 | 久久久久免费看 | 精品一二三区视频 | 亚洲视频免费在线观看 | 国产精品专区在线观看 | 成人福利av | 91在线中字| zzijzzij亚洲成熟少妇 | 夜夜夜草 | 中文字幕在线观看av | 久久久久久草 | 欧美精品在线一区二区 | 欧美另类色图 | 久久精品国产免费看久久精品 | 国产高清免费观看 | 91视频免费看网站 | 亚洲成人免费观看 | 亚州国产视频 | 国产高清专区 | 国产乱对白刺激视频不卡 | 日韩精品无 | 免费成人在线观看 | 97av在线视频免费播放 | 国产精品久久久久久久免费大片 | 97超碰色| 天天爽天天做 | 中国成人一区 | 亚洲欧美日韩精品久久奇米一区 | 性日韩欧美在线视频 | 国产成人精品一区二区 | 日韩网站在线免费观看 | 国产专区视频在线 | 丁香花中文在线免费观看 | 久久在线视频精品 | 中文字幕精品www乱入免费视频 | 五月婷亚洲 | 91污视频在线观看 | 欧美日韩视频在线播放 | 久久精品99久久久久久2456 | 91久久国产综合精品女同国语 | 天天色天天上天天操 | 黄色大片视频网站 | 国产美女视频免费 | 又粗又长又大又爽又黄少妇毛片 | 午夜精品成人一区二区三区 | 日韩理论片中文字幕 | 国产精品1区2区在线观看 | 久久久久观看 | 欧美片网站yy | 国产成人精品一区二区三区在线 | 国产亚洲精品福利 | 亚洲观看黄色网 | 天天操夜夜曰 | 欧美成人xxxx| 日韩有色 | 国产91学生粉嫩喷水 | 精品久久久久久亚洲 | 国产色在线 | 在线色资源 | 日韩欧美网址 | 特级毛片aaa | 日日操夜夜操狠狠操 | 欧美一级日韩免费不卡 | 国产精品久久久久久久久蜜臀 | 国产精品免费看久久久8精臀av | 亚洲日本va午夜在线电影 | 国产精品自在欧美一区 | 国产精品麻豆视频 | 日韩一级成人av | 日韩二区三区在线观看 | 婷婷开心久久网 | 一区二区三区在线免费 | 久草视频免费在线观看 | 国产品久精国精产拍 | 成人av在线电影 | 成人av免费 | 午夜av大片 | 五月天综合婷婷 | 欧美久久久久久久久中文字幕 | 四虎精品成人免费网站 | 这里只有精品视频在线观看 | 久热久草| 在线观看亚洲精品 | 国产精品一区二区av影院萌芽 | 在线观看亚洲精品视频 | 最新色站 | 天天久久夜夜 | 午夜在线免费视频 | 成人中文字幕在线 | 91成年视频 | 日韩免费一区二区 | a在线一区 | 精品久久久久久久久久岛国gif | 久久这里只有精品23 | 成年人看片 | 亚洲91精品在线观看 | 成人黄色片免费 | 青青草国产精品视频 | 婷婷五情天综123 | www黄色com| 黄色精品久久 | 国产精品一区二区美女视频免费看 | 日本丰满少妇免费一区 | 日韩在线电影 | 欧美一区二区视频97 | 国产精品一区二区你懂的 | 亚洲精品视频在线观看视频 | av7777777| 国产五月色婷婷六月丁香视频 | 在线直播av | 午夜久久视频 | 国产一二区视频 | 久久超 | 日韩av线观看 | 91大神精品视频在线观看 | 精品黄色片 | 人人澡人| 在线观看国产www | 亚洲精品字幕 | 婷婷丁香六月天 | 国产高清无线码2021 | 久草网站 | 91九色国产视频 | 国产一线二线三线性视频 | 91精品久久久久久综合乱菊 | 91综合久久一区二区 | 国产欧美精品一区二区三区四区 | 毛片视频电影 | 欧美日韩二区三区 | 日韩精品中文字幕在线不卡尤物 | 日韩在线视频观看免费 | 国产精品久久久久久妇 | 国产一级免费电影 | 天天操天天操一操 | 色综合久久天天 | 免费观看性生交 | 人人爱人人射 | 在线视频观看国产 | 精品国产亚洲在线 | 91高清不卡 | 婷婷色网视频在线播放 | 黄污在线看 | 免费亚洲一区二区 | 免费黄色av电影 | 国内精品久久久久影院优 | 丁香av在线 | 丝袜制服综合网 | 亚洲欧美日韩精品久久久 | 中文在线最新版天堂 | 最新av网站在线观看 | 国产精品伦一区二区三区视频 | 久久国产日韩 | 欧美最新大片在线看 | 中文不卡视频 | 五月婷婷天堂 | 在线免费观看麻豆 | 最近中文字幕视频完整版 | 国产中文字幕免费 | 天天伊人狠狠 | 麻豆国产精品一区二区三区 | 久久久久免费精品国产 | 久久夜夜爽 | 视频在线亚洲 | 四虎永久精品在线 | 一区二区在线不卡 | 久久婷婷一区二区三区 | 国产一区二区三区在线免费观看 | 九九热只有精品 | 亚洲精品视频网站在线观看 | 国内久久精品视频 | 特级毛片网 | 免费在线观看91 | 国产1区2| 在线免费国产视频 | 欧美亚洲久久 | 亚洲综合丁香 | 在线观看韩日电影免费 | 久久久精品国产一区二区电影四季 | 日本乱视频| 国产人成精品一区二区三 | 国产精品人成电影在线观看 | 99久久精品免费看国产 | 成人精品视频久久久久 | 不卡av在线播放 | 99在线精品免费视频九九视 | 日韩色爱 | 亚洲综合在线视频 | 日韩区欠美精品av视频 | 国产最顶级的黄色片在线免费观看 | 色在线免费观看 | 五月在线视频 | 国产精品一区二区三区99 | 在线观看视频免费播放 | 国产精品女同一区二区三区久久夜 | 青青河边草免费 | 欧美 日韩 国产 成人 在线 | 国产又粗又猛又爽又黄的视频先 | 日韩久久久久久 | 国产精品99久久久久久武松影视 | 九九九热精品免费视频观看网站 | 免费观看的黄色 | av电影不卡在线 | 日韩av片免费在线观看 | 日韩精品无码一区二区三区 | 国产福利av在线 | 一区二区三区四区在线 | 国产精品99视频 | 国精产品满18岁在线 | 久久成人在线 | www四虎影院 | 探花视频在线观看免费版 | 亚洲午夜精 | 日本三级久久 | 久久麻豆视频 | 久久久久久免费网 | 国产精品99久久久久久武松影视 | 久久久五月天 | 国产亚洲精品日韩在线tv黄 | 久久色视频| aaa日本高清在线播放免费观看 | 91九色蝌蚪视频在线 | 狠狠的操 | 欧美性色xo影院 | 97人人模人人爽人人少妇 | 996久久国产精品线观看 | 成人av影视观看 | 久久久精品亚洲 | 国产视频精选在线 | 国产精品资源在线观看 | 国内精品久久久久久久久 | 天天天天天天天天操 | 久久免费黄色 | 天天干夜夜爽 | 又湿又紧又大又爽a视频国产 | 国产高清在线看 | 国产精品毛片网 | 亚洲日本一区二区在线 | 国产高清免费av | 日一日操一操 | 久久亚洲欧美日韩精品专区 | 成av人电影 | 国产成人精品亚洲精品 | 久久免费视频这里只有精品 | 日本黄色大片免费看 | 国产精品视频免费看 | 国产四虎在线 | 公与妇乱理三级xxx 在线观看视频在线观看 | 欧美日韩在线精品 | 天堂资源在线观看视频 | 天天色天天色天天色 | 在线视频手机国产 | 欧美亚洲成人免费 | 欧美日韩aa | 91麻豆精品国产午夜天堂 | 在线观看电影av | 久草视频99 | 五月婷婷欧美 | 国产一区二区三精品久久久无广告 | 亚洲色图 校园春色 | 美女视频免费一区二区 | 天天干天天干天天干天天干天天干天天干 | 国产精品美女久久久久久2018 | 中文字幕在线免费看线人 | 久久婷婷激情 | 五月天,com | 免费a v网站 | 久久久久五月天 | 中文在线字幕免 | 成年人免费看av | 狠狠天天| 欧美三级高清 | 亚洲国产成人精品在线观看 | 日本爱爱免费 | 欧美永久视频 | 中文字幕欧美三区 | 国产精品大片在线观看 | 日韩精品中文字幕久久臀 | 天天射,天天干 | 亚洲网久久 | 好看av在线 | 狂野欧美激情性xxxx欧美 | 久久视频精品 | 91麻豆精品国产91久久久久久久久 | 久久精品99国产精品酒店日本 | 国产精品色婷婷视频 | 中文字幕一区二区三区久久 | 国产精品18p | 韩日精品视频 | 开心丁香婷婷深爱五月 | 欧美性黄网官网 | 国产高清在线a视频大全 | 久久久亚洲精华液 | 欧美日韩国产亚洲乱码字幕 | 国内丰满少妇猛烈精品播放 | 在线视频18在线视频4k | 国产成人精品一区一区一区 | www.久久精品视频 | 欧美 日韩 国产 成人 在线 | 精品国产免费一区二区三区五区 | 黄网站大全| 国产在线一卡 | 97视频人人| 91精品国产综合久久久久久久 | 一区二区久久 | 这里只有精彩视频 | 2023av在线| 亚洲资源一区 | 99精品免费在线 | 91亚洲国产成人久久精品网站 | 啪啪免费视频网站 | 欧美日韩中文在线观看 | 欧美激情精品久久久 | 亚洲国产精品人久久电影 | 国产精品美女在线观看 | 黄色www| 91视频免费 | 色av男人的天堂免费在线 | 欧美日韩天堂 | 香蕉视频在线免费 | 亚洲免费色 | 中文字幕在线日本 | 丰满少妇在线观看资源站 | 国产九九热 | 黄色在线免费观看网址 | 波多野结衣精品在线 | 久久久久国产精品一区二区 | 欧美另类美少妇69xxxx | 在线观看av国产 | 成人污视频在线观看 | 精品一区二区三区电影 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 久久亚洲电影 | 五月天激情婷婷 | 在线高清一区 | 精品中文字幕在线播放 | 久精品视频免费观看2 | 日本午夜在线亚洲.国产 | 97碰碰精品嫩模在线播放 | 日韩,中文字幕 | 成人中文字幕av | 欧美一区二区三区在线看 | 精品国产1区| 97超碰在线资源 | 精品天堂av | av电影免费 | 99电影| 精品一区 在线 | 9在线观看免费高清完整版 玖玖爱免费视频 | 狠狠躁18三区二区一区ai明星 | 亚洲精品国产电影 | 免费在线国产 | 日韩系列在线观看 | 91超国产| www.久久色| 少妇bbb搡bbbb搡bbbb | 成人高清在线观看 | 在线观看视频在线观看 | 欧美日韩在线精品 | 99婷婷狠狠成为人免费视频 | 久草新在线 | 欧美日韩久久久 | 婷婷丁香av | 精品亚洲va在线va天堂资源站 | 天天色天天上天天操 | 日本韩国精品一区二区在线观看 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | www99精品 | 国产精品v a免费视频 | 综合色伊人| 国产在线精品区 | 欧美色精品天天在线观看视频 | 中文字幕国产 | 日韩网 | av在线网站免费观看 | 婷婷激情五月 | 91探花系列在线播放 | 久久九精品 | 国产精品一区二区三区免费看 | 亚洲黄色免费 | 国产裸体永久免费视频网站 | 99精彩视频在线观看免费 | 国内精品视频一区二区三区八戒 | 五月婷婷色丁香 | 久久精品91视频 | 国产成年免费视频 | 欧洲精品亚洲精品 | 国产精品久久久久永久免费 | 色综合狠狠干 | 欧美日韩免费一区 | 亚洲精品播放 | 欧美老人xxxx18 |