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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

jdbc连接数据scanip_java数据库连接_jdbc

發布時間:2024/10/8 数据库 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jdbc连接数据scanip_java数据库连接_jdbc 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. jdbc 概述

問題:實際開發中,不可能用工具或者命令行操作數據庫,數據庫表中的數據最終要使用Java程序來操作,那么Java中如何操作數據庫中的數據呢?

答 : 在Java語言中,有一個專門連接數據庫的規范(JDBC),專門負責連接數據庫進行數據操作的規范

JDBC只是SUN編寫的一堆接口(規范的體現),SUN公司自己并沒有實現

問題 : 為什么SUN只定義一個JDBC規范,而不實現呢?

答 : 因為市面上的數據庫很多,每個數據庫內部接口不會向外暴露,而且即便是暴露讓SUN去實現,市面上很多數據庫全部要SUN來實現的話就不現實

實際中哪個數據庫需要支持JAVA語言,就需要自己實現Java的JDBC規范,因為實現了JDBC很多接口,那么就會有很多實現類,而很多實現類在java中會使用一個專門的包封裝起來,叫做jar包(在JDBC中叫做驅動包),各大數據庫產商實現JDBC規范以后都會把他們jar包放在官網上以供開發者下載使用

1.1 JDBC

JDBC(Java DataBase Connectivity): 是一種用于執行SQL語句的Java API,可以為多種關系數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基于JDBC規范對應的API包

2. 入門案例

2.1 連接數據庫

案例使用JDBC操作MySQL數據庫

2.2 創建普通java項目

2.3 在項目下面新建一個lib目錄

2.4 將MySQL驅動包拷貝到項目中并添加依賴

2.5 獲取數據庫連接對象

準備:

1.拷貝MySQL的驅動包到項目中去:mysql-connector-java-5.1.x-bin.jar

2.build path,告速項目去哪里去找字節碼文件.

--------------------------------------------------------------------------------

操作JDBC的第一步,獲取JDBC的連接對象.:Connection.

步驟:

1.加載注冊驅動.

就是把驅動中的Driver字節碼加載到JVM中.

Class.forName("com.mysql.jdbc.Driver");

為什么這句話就可以加載注冊驅動?

第一步:把com.mysql.jdbc.Driver.class這份字節碼加載到JVM中.

第二步:當一份字節碼被加載進JVM,馬上就會執行該字節碼中的靜態代碼塊.

第三步:該靜態代碼中,就在完成,先創建驅動對象,再注冊.

2.通過DriverManager獲取連接對象.

public static Connection getConnection(String url,String user,String password)

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbName","root","admin");

jdbc:mysql://localhost:3306/dbName

jdbc:mysql:// :連接MySQL數據庫的協議,不同數據庫協議不一樣

localhost:3306 :數據庫軟件的主機和端口

dbName : 具體要連接數據庫

若數據庫安裝在本機,并且端口是默認的3306,則可以簡寫:

Connection conn= DriverManager.getConnection("jdbc:mysql:///dbName","root","admin");

驗證已經獲取連接:可以在MySQL控制臺,使用命令:show processlist; 查看MySQL運行進程。

public class GetConnectionDemo {public static void main(String[] args) throws Exception {//1.加載注冊驅動 : 把當前類對應的字節碼加載到JVM中Class.forName("com.mysql.jdbc.Driver");//2.獲取數據庫連接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");System.out.println(conn);} }

3. 創建表-DDL操作

在其他操作之間先要把數據庫表要創建出來

/*創建一張t_student表: id: name: age: *//** * 創建表操作* SQL : create table t_student (id int primary key auto_increment,name varchar(50),age int)*/ public static void main(String[] args) throws Exception {String sql = "create table t_student (id int primary key auto_increment,name varchar(50),age int)";//賈璉欲執事//1,加載注冊驅動Class.forName("com.mysql.jdbc.Driver");//2,獲取數據庫連接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");//3,創建語句對象(用于執行SQL語句的對象)Statement st = conn.createStatement();//4, 執行SQL語句//int rows = st.executeUpdate(String sql);執行DDL和DML語句,返回的是受影響的行數//ResultSet res = st.executeQuery(String sql);執行DQL查詢語句,返回的結果集對象st.executeUpdate(sql);//5,釋放資源(先開后關)st.close();conn.close();}

4. DML操作-表數據的增刪改

//DML : 對表數據的增刪改操作 public class DMLDemo {/** 向 t_student表中插入一條數據 * sql : insert into t_student(name,age) values ('喬峰',30)*/@Testpublic void testInsert() throws Exception {String sql = "insert into t_student(name,age) values ('喬峰',30)";// 1.加載注冊驅動Class.forName("com.mysql.jdbc.Driver");// 2.獲取數據庫連接對象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");// 3.創建語句對象Statement st = conn.createStatement();// 4.執行SQL語句// int rows = st.executeUpdate(String sql);執行DDL和DML語句,放回的是受影響的行數// ResultSet res = st.executeQuery(String sql);執行DQL查詢語句,返回的結果集對象int rows = st.executeUpdate(sql);System.out.println(rows);//5.釋放資源(先開后關)st.close();conn.close();}/** 刪除操作: 刪除t_student表中的某一條數據* SQL :delete from t_student where id = 2*/@Testpublic void testDelete() throws Exception {String sql = "delete from t_student where id = 2";// 1.加載注冊驅動Class.forName("com.mysql.jdbc.Driver");// 2.獲取數據庫連接對象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");// 3.創建語句對象Statement st = conn.createStatement();// 4.執行SQL語句// int rows = st.executeUpdate(String sql);執行DDL和DML語句,放回的是受影響的行數// ResultSet res = st.executeQuery(String sql);執行DQL查詢語句,返回的結果集對象int rows = st.executeUpdate(sql);System.out.println(rows);//5.釋放資源(先開后關)st.close();conn.close();}/** 修改操作 : 修改t_student表中的某一條數據* SQL : update t_student set name = '虛竹',age = 50 where id = 3*/@Testpublic void testUpdate() throws Exception {String sql = "update t_student set name = '虛竹',age = 50 where id = 3";// 1.加載注冊驅動Class.forName("com.mysql.jdbc.Driver");// 2.獲取數據庫連接對象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");// 3.創建語句對象Statement st = conn.createStatement();// 4.執行SQL語句// int rows = st.executeUpdate(String sql);執行DDL和DML語句,放回的是受影響的行數// ResultSet res = st.executeQuery(String sql);執行DQL查詢語句,返回的結果集對象int rows = st.executeUpdate(sql);System.out.println(rows);//5.釋放資源(先開后關)st.close();conn.close();} }

5. DQL操作-查詢操作

5.1 查詢操作的分析

5.2 查詢具體操作

結果集的列的位置

1. 使用 rs.next() 偏移光標,循環指定具體的某一行

獲取數據的具體方法

import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; import java.util.List;import org.junit.Test;//DQL :查詢操作 public class D_DQLDemo {/** 多行查詢 :查詢t_student表中的所有數據* SQL : select * from t_student*/@Testpublic void testList() throws Exception {String sql = "select * from t_student";// 1.加載注冊驅動Class.forName("com.mysql.jdbc.Driver");// 2.獲取數據庫連接對象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");// 3.創建語句對象Statement st = conn.createStatement();// 4.執行SQL語句// int rows = st.executeUpdate(String sql);執行DDL和DML語句,放回的是受影響的行數// ResultSet res = st.executeQuery(String sql);執行DQL查詢語句,返回的結果集對象ResultSet rs = st.executeQuery(sql);//創建list集合用于封裝Student對象List<Student> stus = new ArrayList<>();while(rs.next()) {//1.通過結果集的位置獲取對應的數/*Object id = rs.getObject(1);Object name = rs.getObject(2);Object age = rs.getObject(3);*///2.通過結果集的 列名獲取對應的數據/*Object id = rs.getObject("id");Object name = rs.getObject("name");Object age = rs.getObject("age");*///3.通過數據庫數據和Java對應的數據類型獲取對應的只int id = rs.getInt("id");String name = rs.getString("name");int age = rs.getInt("age");//System.out.println(id+","+name+","+age);//將獲取的數據封裝成對應的Student對象Student stu = new Student(id, name, age);//將一個個Student對象添加到list集合中stus.add(stu);}for (Student student : stus) {System.out.println(student);}//5.釋放資源(先開后關)rs.close();st.close();conn.close();}/** 單行查詢: 查詢出t_student 指定id的信息* SQL : select * from t_student where id = 1;*/@Testpublic void testGetOne() throws Exception {String sql = "select * from t_student where id = 2";// 1.加載注冊驅動Class.forName("com.mysql.jdbc.Driver");// 2.獲取數據庫連接對象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");// 3.創建語句對象Statement st = conn.createStatement();// 4.執行SQL語句// int rows = st.executeUpdate(String sql);執行DDL和DML語句,放回的是受影響的行數// ResultSet res = st.executeQuery(String sql);執行DQL查詢語句,返回的結果集對象ResultSet rs = st.executeQuery(sql);if(rs.next()) {//1.通過結果集的位置獲取對應的數/*Object id = rs.getObject(1);Object name = rs.getObject(2);Object age = rs.getObject(3);*///2.通過結果集的 列名獲取對應的數據/*Object id = rs.getObject("id");Object name = rs.getObject("name");Object age = rs.getObject("age");*///3.通過數據庫數據和Java對應的數據類型獲取對應的只int id = rs.getInt("id");String name = rs.getString("name");int age = rs.getInt("age");//System.out.println(id+","+name+","+age);//將獲取的數據封裝成對應的Student對象Student stu = new Student(id, name, age);System.out.println(stu);}//5.釋放資源(先開后關)rs.close();st.close();conn.close(); } }

6. 預編譯語句對象PreparedStatment

問題 : 我們有了Statment對象可以執行SQL,為什么還要使用PreparedStatment?

優勢

1. SQL語句結構清晰,參數的設置和SQL語句分離

2. 性能更高

3. 防止SQL注入

Statement: 表示靜態SQL語句對象.

PreparedStatement:Statement的子接口,表示預編譯SQL語句對象. 通過占位符(?)來拼SQL.

6.1 創建PreparedStatement

創建語句對象 Statment

6.2 執行SQL語句的方法

6.2.1 Statement

在執行SQL語句的時候會帶上SQL語句

6.2.2 PreparedStatemeny

在執行SQL語句的方法中不需要設置SQL語句

6.3 設置站位參數的值

void setXxx(int parameterIndex,Xxx value):用于設置占位符參數,

parameterIndex:第幾個問號. 注意:從1開始.

value:設置的真實值.

Xxx:表示數據類型.String/int/long/Double/Date

6.4 代碼

import static org.junit.Assert.*;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement;import org.junit.Test;//DML : 對表數據的增刪改操作,使用預編譯語句對象 public class E_DMLByPreparedStatmentDemo {/** 向 t_student表中插入一條數據 * sql : insert into t_student(name,age) values ('喬峰',30)*/@Testpublic void testInsert() throws Exception {String sql = "insert into t_student(name,age) values (?,?)";// 1.加載注冊驅動Class.forName("com.mysql.jdbc.Driver");// 2.獲取數據庫連接對象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");// 3.創建預編譯語句對象PreparedStatement ps = conn.prepareStatement(sql);//3.1設置占位符參數ps.setString(1, "東方姑娘");ps.setInt(2, 18);// 4.執行SQL語句:注意不要帶SQL參數ps.executeUpdate();//5.釋放資源(先開后關)ps.close();conn.close();}/** 刪除操作: 刪除t_student表中的某一條數據* SQL :delete from t_student where id = 2*/@Testpublic void testDelete() throws Exception {String sql = "delete from t_student where id = ?";// 1.加載注冊驅動Class.forName("com.mysql.jdbc.Driver");// 2.獲取數據庫連接對象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");// 3.創建預編譯語句對象PreparedStatement ps = conn.prepareStatement(sql);//3.1設置占位符對應的參數值ps.setInt(1, 1);// 4.執行SQL語句int rows = ps.executeUpdate();System.out.println(rows);//5.釋放資源(先開后關)ps.close();conn.close();}/** 修改操作 : 修改t_student表中的某一條數據* SQL : update t_student set name = '虛竹',age = 50 where id = 3*/@Testpublic void testUpdate() throws Exception {String sql = "update t_student set name = ?,age = ? where id = ?";// 1.加載注冊驅動Class.forName("com.mysql.jdbc.Driver");// 2.獲取數據庫連接對象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");// 3.創建預編譯語句對象PreparedStatement ps = conn.prepareStatement(sql);//3.1設置占位符參數對應的值ps.setString(1, "西方失敗");ps.setInt(2, 40);ps.setInt(3, 4);// 4.執行SQL語句int rows = ps.executeUpdate();System.out.println(rows);//5.釋放資源(先開后關)ps.close();conn.close();} }

7. JavaWeb開發的分層設計-三層架構

實際開發中,JavaWeb開發代碼一般分為三層,分層結構是JavaWeb開發中的一種設計思想,這樣會讓我們開發層次分明,每一層只要完成對應的功能即可,使得項目便于開發和維護

1 . Web層/表現層 : 主要接受前臺瀏覽器用戶的參數,給瀏覽器響應數據等等

2. Service層/業務成/服務層:主要處理業務功能,日志,權限,事物,等等

3. DAO層/持久層 :專門負責和數據庫交互,數據處理相關代碼

DAO : Data Access Object 數據訪問對象

實際開發中 : 用戶請求到-Web層--->Service層-->DAO層

7.2 DAO思想

7.3 使用DAO以后代碼的以及包的設計結構

開發中如果使用的分層,編寫的包和類名接口名等等都是有固定規則,不能隨便瞎寫

7.3.1 DAO層接口包命名

公司域名倒寫+項目名稱/模塊名稱+dao

如 : cn.sxt.crm.dao

7.3.2 DAO層實現類包命名

公司域名倒寫+項目名稱/模塊名稱+dao+impl

如 : cn.sxt.crm.dao.impl

7.3.3 DAO層操作對應表的接口命名

對應表的名稱 + Dao/DAO

如 : StudentDao/DAO , TeacherDao/DAO

7.3.4 DAO層操作對應表的實現類命名

對應表的名稱 + Dao/DAOImpl

如 : StudentDaoImpl/DAOImpl , TeacherDaoImpl/DAOImpl

7.3.5 數據表對應的Java類domain/pojo包命名

POJO(Plain Ordinary Java Object)簡單的Java對象
domian : 域對象

公司域名倒寫+項目名稱/模塊名稱+domain/pojo

如 : cn.sxt.crm.domain

7.3.6 對應的測試包命名

公司域名倒寫+項目名稱/模塊名稱+test

如 : cn.sxt.crm.test

7.3.7 項目的工具類包命名

公司域名倒寫+項目名稱/模塊名稱+util/utils

如 : cn.sxt.crm.util/utils

7.3.8 DAO代碼設計結構

7.3.9 Dao的實現類代碼

import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;import cn.sxt.jdbc.dao.StudentDao; import cn.sxt.jdbc.domain.Student;public class StudentDaoImpl implements StudentDao {@Overridepublic int saveStudent(Student stu) {String sql = "insert into t_student(name,age) values (?,?)";Connection conn = null;PreparedStatement ps = null;try {// 1.加載注冊驅動Class.forName("com.mysql.jdbc.Driver");// 2.獲取數據庫連接對象conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");// 3.創建預編譯語句對象ps = conn.prepareStatement(sql);//3.1設置占位符參數ps.setString(1, stu.getName());ps.setInt(2, stu.getAge());// 4.執行SQL語句:注意不要帶SQL參數return ps.executeUpdate();} catch (Exception e) {e.printStackTrace();}finally {//5.釋放資源(先開后關)try {if(ps !=null) {ps.close();}} catch (SQLException e) {e.printStackTrace();}finally {try {if(conn !=null) {conn.close();}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}return 0;}@Overridepublic int deleteById(int id) {String sql = "delete from t_student where id = ?";Connection conn = null;PreparedStatement ps = null;try {// 1.加載注冊驅動Class.forName("com.mysql.jdbc.Driver");// 2.獲取數據庫連接對象conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");// 3.創建預編譯語句對象ps = conn.prepareStatement(sql);//3.1設置占位符參數ps.setInt(1, id);// 4.執行SQL語句:注意不要帶SQL參數return ps.executeUpdate();} catch (Exception e) {e.printStackTrace();}finally {//5.釋放資源(先開后關)try {if(ps !=null) {ps.close();}} catch (SQLException e) {e.printStackTrace();}finally {try {if(conn !=null) {conn.close();}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}return 0;}@Overridepublic int updateStudentById(Student stu) {String sql = "update t_student set name = ?,age = ? where id = ?";Connection conn = null;PreparedStatement ps = null;try {// 1.加載注冊驅動Class.forName("com.mysql.jdbc.Driver");// 2.獲取數據庫連接對象conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");// 3.創建預編譯語句對象ps = conn.prepareStatement(sql);//3.1設置占位符參數ps.setString(1, stu.getName());ps.setInt(2, stu.getAge());ps.setInt(3, stu.getId());// 4.執行SQL語句:注意不要帶SQL參數return ps.executeUpdate();} catch (Exception e) {e.printStackTrace();}finally {//5.釋放資源(先開后關)try {if(ps !=null) {ps.close();}} catch (SQLException e) {e.printStackTrace();}finally {try {if(conn !=null) {conn.close();}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}return 0;}@Overridepublic Student selectById(int id) {String sql = "select * from t_student where id = ?";Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {// 1.加載注冊驅動Class.forName("com.mysql.jdbc.Driver");// 2.獲取數據庫連接對象conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");// 3.創建語句對象ps = conn.prepareStatement(sql);//3.1設置占位符參數對應的值ps.setInt(1, id);// 4.執行SQL語句rs = ps.executeQuery();if(rs.next()) {//通過數據庫數據和Java對應的數據類型獲取對應的只String name = rs.getString("name");int age = rs.getInt("age");//System.out.println(id+","+name+","+age);//將獲取的數據封裝成對應的Student對象Student stu = new Student(id, name, age);return stu;}} catch (Exception e) {// TODO: handle exception}finally {try {if(rs !=null) {rs.close();}} catch (SQLException e) {e.printStackTrace();}finally {try {if(ps !=null) {ps.close();}} catch (SQLException e) {e.printStackTrace();}finally {try {if(conn !=null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}}}return null;}@Overridepublic List<Student> selectList() {String sql = "select * from t_student";//創建list集合用于封裝Student對象List<Student> stus = new ArrayList<>();Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {// 1.加載注冊驅動Class.forName("com.mysql.jdbc.Driver");// 2.獲取數據庫連接對象conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root");// 3.創建語句對象ps = conn.prepareStatement(sql);// 4.執行SQL語句rs = ps.executeQuery();while(rs.next()) {//通過數據庫數據和Java對應的數據類型獲取對應的只int id = rs.getInt("id");String name = rs.getString("name");int age = rs.getInt("age");//System.out.println(id+","+name+","+age);//將獲取的數據封裝成對應的Student對象Student stu = new Student(id, name, age);//將一個個Student對象添加到list集合中stus.add(stu);}} catch (Exception e) {// TODO: handle exception}finally {try {if(rs !=null) {rs.close();}} catch (SQLException e) {e.printStackTrace();}finally {try {if(ps !=null) {ps.close();}} catch (SQLException e) {e.printStackTrace();}finally {try {if(conn !=null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}}}return stus;}}

7.3.10 快速生成單元測試類

一個dao層或者service編寫代碼以后,需要為每一個功能都進行單元測試,一個dao中的方法很多。我們快速為這個dao層的類生成單元測試類,(dao的每一個方法都自動生成一個測試方法)

7.4 代碼初步重構

上述的DAO方法中的代碼,存在的問題:

問題1:每個DAO方法中都會寫:驅動名稱/url/賬號/密碼,不利于維護.

解決方案: 聲明為成員變量即可.(在被類中任何地方都可以訪問)

問題2:問題1的解決方案有問題.

每個DAO實現類里都有一模一樣的4行代碼,不利于維護(考慮有100個DAO實現類,就得重復99次).

解決方案: 把驅動名稱/url/賬號/密碼這四行代碼,專門抽取到一個JDBC的工具類中.---->JdbcUtil.

問題3:其實DAO方法,每次操作都只想需要Connection對象即可,而不關心是如何創建的.

解決方案:把創建Connection的代碼,抽取到JdbcUtil中,并提供方法getConn用于向調用者返回Connection對象即可.

問題4:每次調用者調用getConn方法的時候,都會創建一個Connection對象.

但是,每次都會加載注冊驅動一次.--->沒必要的.

解決方案:把加載注冊驅動的代碼放在靜態代碼塊中--->只會在所在類被加載進JVM的時候,執行一次.

問題5:每個DAO方法都要關閉資源.(雞肋代碼).

解決方案:把關閉資源的代碼,抽取到JdbcUtil中.

public static void close(Connection conn, Statement st, ResultSet rs) {}

調用者:

DML: JdbcUtil.close(conn,st,null);

DQL: JdbcUtil.close(conn,st,rs);

問題6 :連接數據庫的賬號密碼寫死在JdbcUtil工具類中了,不利于維護

抽取 db.properties 配置文件,將數據庫對應的賬號密碼寫到配置文件中,然后使用程序讀取配置文件內容即可

7.4.1 jdbcUtil 工具類

import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties;public class JdbcUtil {// alt+shif+a 多行修改,修改以后還原 alt+shif+a/*private static String driverClassName = "com.mysql.jdbc.Driver";private static String url = "jdbc:mysql://localhost:3306/jdbcdemo";private static String username = "root";private static String password = "root";*/private static Properties p = new Properties();static {try {//1.獲取類加載器ClassLoader classLoader = Thread.currentThread().getContextClassLoader();//2,使用類加載器獲取項目 類路徑下面的文件InputStream inputStream = classLoader.getResourceAsStream("db.properties");//3.使用Priperties加載配置文件對應的輸入流p.load(inputStream);Class.forName(p.getProperty("driverClassName"));} catch (Exception e) {e.printStackTrace();}}public static Connection getConnection() {try {return DriverManager.getConnection(p.getProperty("url"), p.getProperty("username"), p.getProperty("password"));} catch (Exception e) {e.printStackTrace();throw new RuntimeException("親,連接數據庫失敗", e);}}public static void close(Connection conn,PreparedStatement ps,ResultSet rs) {try {if(rs !=null) {rs.close();}} catch (SQLException e) {e.printStackTrace();}finally {try {if(ps !=null) {ps.close();}} catch (SQLException e) {e.printStackTrace();}finally {try {if(conn !=null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}}} }

7.4.2 使用工具類以后的DAO實現類效果

import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;import cn.sxt.jdbc.dao.StudentDao; import cn.sxt.jdbc.domain.Student; import cn.sxt.jdbc.util.JdbcUtil;public class StudentDaoImpl implements StudentDao {@Overridepublic int saveStudent(Student stu) {String sql = "insert into t_student(name,age) values (?,?)";Connection conn = null;PreparedStatement ps = null;try {conn = JdbcUtil.getConnection();// 3.創建預編譯語句對象ps = conn.prepareStatement(sql);//3.1設置占位符參數ps.setString(1, stu.getName());ps.setInt(2, stu.getAge());// 4.執行SQL語句:注意不要帶SQL參數return ps.executeUpdate();} catch (Exception e) {e.printStackTrace();}finally {JdbcUtil.close(conn, ps, null);}return 0;}@Overridepublic int deleteById(int id) {String sql = "delete from t_student where id = ?";Connection conn = null;PreparedStatement ps = null;try {conn = JdbcUtil.getConnection();// 3.創建預編譯語句對象ps = conn.prepareStatement(sql);//3.1設置占位符參數ps.setInt(1, id);// 4.執行SQL語句:注意不要帶SQL參數return ps.executeUpdate();} catch (Exception e) {e.printStackTrace();}finally {JdbcUtil.close(conn, ps, null);}return 0;}@Overridepublic int updateStudentById(Student stu) {String sql = "update t_student set name = ?,age = ? where id = ?";Connection conn = null;PreparedStatement ps = null;try {conn = JdbcUtil.getConnection();// 3.創建預編譯語句對象ps = conn.prepareStatement(sql);//3.1設置占位符參數ps.setString(1, stu.getName());ps.setInt(2, stu.getAge());ps.setInt(3, stu.getId());// 4.執行SQL語句:注意不要帶SQL參數return ps.executeUpdate();} catch (Exception e) {e.printStackTrace();}finally {JdbcUtil.close(conn, ps, null);}return 0;}@Overridepublic Student selectById(int id) {String sql = "select * from t_student where id = ?";Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {conn = JdbcUtil.getConnection();// 3.創建語句對象ps = conn.prepareStatement(sql);//3.1設置占位符參數對應的值ps.setInt(1, id);// 4.執行SQL語句rs = ps.executeQuery();if(rs.next()) {//通過數據庫數據和Java對應的數據類型獲取對應的只String name = rs.getString("name");int age = rs.getInt("age");//System.out.println(id+","+name+","+age);//將獲取的數據封裝成對應的Student對象Student stu = new Student(id, name, age);return stu;}} catch (Exception e) {// TODO: handle exception}finally {try {if(rs !=null) {rs.close();}} catch (SQLException e) {e.printStackTrace();}finally {JdbcUtil.close(conn, ps, rs);}}return null;}@Overridepublic List<Student> selectList() {String sql = "select * from t_student";//創建list集合用于封裝Student對象List<Student> stus = new ArrayList<>();Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {conn = JdbcUtil.getConnection();// 3.創建語句對象ps = conn.prepareStatement(sql);// 4.執行SQL語句rs = ps.executeQuery();while(rs.next()) {//通過數據庫數據和Java對應的數據類型獲取對應的只int id = rs.getInt("id");String name = rs.getString("name");int age = rs.getInt("age");//System.out.println(id+","+name+","+age);//將獲取的數據封裝成對應的Student對象Student stu = new Student(id, name, age);//將一個個Student對象添加到list集合中stus.add(stu);}} catch (Exception e) {// TODO: handle exception}finally {JdbcUtil.close(conn, ps, rs);}return stus;}}

7.5 知識點補充,類加載器

在項目的 類路徑(src)下面創建一個 db.properties配置文件,專門配置連接數據庫的賬號密碼

如何使用類加載器加載配置文件

7.5.1 配置文件

7.5.1.1 配置文件創建的位置

配置文件一般都放在項目的src 源目錄下面

7.5.2 加載代碼

import static org.junit.Assert.*; import java.io.InputStream; import java.util.Properties; import org.junit.Test;public class PropertiesTest {@Testpublic void testName() throws Exception {/** ClassLoader 類加載器* ClassLoader :可以從項目的類路徑下面讀取對應的配置文件返回一個輸入流* ClassLoader 在程序運行的時候JVM已經為每一個項目都創建了一個,我們開發者只需要獲取即可* 獲取類加載器方式* 1、使用當前線程* ClassLoader classLoader = Thread.currentThread().getContextClassLoader();* 2、通過某一類的字節碼實例也可以獲取* ClassLoader classLoader = PropertiesTest.class.getClassLoader();*/ClassLoader classLoader = Thread.currentThread().getContextClassLoader();//使用類加載器獲取項目 類路徑下面的文件InputStream inputStream = classLoader.getResourceAsStream("db.properties");/** Properties 是Map集合下面的一個 專門用于讀取配置文件的對象* 可以讀取當前類路徑下面的 xxx.properites類型的配置文件* * xxx.properites的內容必須是key=value 鍵值對的數據*///1.創建Properties對象Properties p = new Properties();//2.加載配置文件p.load(inputStream);System.out.println(p);//獲取具體某一個key對應的值String driverClassName = p.getProperty("driverClassName");System.out.println(driverClassName);} }

7.5.3 效果

8. 連接池

8.1 遇到的問題-引出連接池

8.2 連接池思想

8.3 連接池的概述

在Java中,連接池使用javax.sql.DataSource接口來表示連接池.

注意:DataSource僅僅只是一個接口,由各大服務器廠商來實現(Tomcat.JBoss,阿里巴巴).

常用的DataSource的實現:

DBCP: Spring推薦的

C3P0: Hibernate推薦的

Druid : (德魯伊)阿里巴巴開源的,性能最好,速度最快

DataSource(數據源)和連接池(Connection Pool)是同一個。

8.4 使用連接池和不使用連接池的區別在哪里

從代碼上:

不使用連接池: Conenction對象由DriverManager獲取.

Connection conn = DriverManager.getConnection(url,username,password);

使用連接池:

如何創建DataSource對象,如何在DataSource中設置url,賬號,密碼.

Connection conn = DataSource對象.getConnection();

--------------------------------------------------------------------

使用連接池的時候:

釋放資源: Connection對象.close():

是把Connection放回給連接池,而不是和數據庫斷開.

8.5 Druid連接池的使用

8.5.1 準備druid 連接池jar包到項目

import static org.junit.Assert.*;import java.io.InputStream; import java.io.Reader; import java.sql.Connection; import java.util.Properties;import javax.sql.DataSource;import org.junit.Test;import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.DruidDataSourceFactory; import com.alibaba.druid.pool.DruidPooledConnection;public class DataSourceTest {// 直接創建連接池對象@Testpublic void testName() throws Exception {// 1.創建連接池對象DruidDataSource ds = new DruidDataSource();// 2.設置連接數據庫的賬號密碼ds.setDriverClassName("com.mysql.jdbc.Driver");ds.setUrl("jdbc:mysql://localhost:3306/jdbcdemo");ds.setUsername("root");ds.setPassword("root");ds.setMaxActive(10);// 最大連接數// 3.獲取連接對象Connection conn = ds.getConnection();System.out.println(conn);}// 使用工廠對象創建連接池對象,工廠對象的好處,不需要直接設置賬號密碼等等,只需要將// 連接數據庫的賬號密碼等等以指定的 key的名稱配置到 xxx.properties文件中即可,工廠對象底層自動讀取@Testpublic void testDataSourceByFactory() throws Exception {// 1.獲取類加載器用于加載clsspath下面的 配置文件ClassLoader classLoader = Thread.currentThread().getContextClassLoader();// 2.讀取druid.properties配置文件InputStream inputStream = classLoader.getResourceAsStream("druid.properties");// 3.創建Properties對象,并讀取配置文件對應的輸入流Properties p = new Properties();p.load(inputStream);// 4.創建連接池對象DataSource ds = DruidDataSourceFactory.createDataSource(p);// 5.獲取連接對象Connection conn = ds.getConnection();System.out.println(conn);} }

8.5.2 db.propperties

8.5.3 使用Druid抽取的工具類

9. 事務

案例:銀行轉賬:從張無忌賬戶上給趙敏轉1000塊.

準備:account(賬戶表):

---------------------------------------------------------------

id name(賬號,唯一) balance(余額)

1 張無忌 20000

2 趙敏 0

---------------------------------------------------------------

轉賬的思路:

1.檢查張無忌的賬號余額是否大于等于1000.

SQL: SELECT balance FROM account WHERE name = '張無忌' AND balance >=1000

余額>=1000:GOTO 2:

余額 <1000:提示:親,你的余額不足.

2.在張無忌的賬號余額上減少1000.

SQL: UPDATE account SET balance = balance-1000 WHERE name = '張無忌'

3.在趙敏的賬戶余額尚增加1000.

SQL: UPDATE account SET balance = balance+1000 WHERE name = '趙敏'

-------------------------------------------------------------------------------------------

注意:在第二步和第三步之間,停電了.

使用異常模擬停電:System.out.println(1/0);

9.1 事務概述

事務(Transaction,簡寫為tx):

在數據庫中,所謂事務是指一組邏輯操作單元,使數據從一種狀態變換到另一種狀態。

為確保數據庫中數據的一致性,數據的操縱應當是離散的成組的邏輯單元:

當每個邏輯操作單元全部完成時,數據的一致性可以保持,

而當這個單元中的一部分操作失敗,整個事務應全部視為錯誤,所有從起始點以后的操作應全部回退到開始狀態。

事務的操作:先定義開始一個事務,然后對數據作修改操作,這時如果提交(commit),這些修改就永久地保存下來,如果回退(rollback),數據庫管理系統將放棄您所作的所有修改而回到開始事務時的狀態。

--------------------------------------------------

事務的ACID屬性:

1. 原子性(Atomicity)
原子性是指事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。

2. 一致性(Consistency)
事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態。(數據不被破壞)

3. 隔離性(Isolation)

事務的隔離性是指一個事務的執行不能被其他事務干擾,即一個事務內部的操作及使用的數據對并發的其他事務是隔離的,并發執行的各個事務之間不能互相干擾。

4. 持久性(Durability)
持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來的其他操作和數據庫故障不應該對其有任何影響

--------------------------------------------------

事務:指構成單個邏輯工作單元的操作集合

事務處理:保證所有事務都作為一個工作單元來執行,即使出現了故障,都不能改變這種執行方式。當在一個事務中執行多個操作時,要么所有的事務都被提交(commit),要么整個事務回滾(rollback)到最初狀態

處理事務的兩個動作:

提交:commit: 當整個事務中,所有的邏輯單元都正常執行成功. ---->提交事務.---數據已經提交,不能更改.

回滾:rollback: 當整個事務中,有一個邏輯單元執行失敗, ---->回滾事務.

撤銷該事務中的所有操作--->恢復到最初的狀態.

---------------------------------------------------------------------------------------------------

如何在代碼中去處理事務:

1.在JDBC中,事務是默認自動提交的. 必須先設置事務為手動提交.

connection對象.setAutoCommit(false);//設置事務為手動提交.

2.手動的提交事務.

connection對象.commit();

3.若出現異常必須回滾事務:

不回滾事務,總余額依然是正確的. 若不回滾事務,不會釋放數據庫資源.

connection對象.rollback();

-----------------------------------------------------------------------------------

1.在JDBC在事務是默認提交的,那是在什么時候提交的.

在執行一個DML/DDL操作的時候,就已經提交事務了.

2.針對于CRUD操作. 只有DML操作才有事務,查詢操作沒有事務.

但是,我們一般會把查詢也放在事務里面.

4. 以后,凡是發現自己編寫的代碼是正確的,測試也通過,但是就是數據庫表中的數據不變----->事務沒提交的問題.

4.MySQL中,InnoDB支持外鍵.支持事務,MyISAM不支持外鍵,不支持事務.

InnoDB存儲引擎: 支持事務,支持外鍵,但是查詢效率略低,(金融,理財,p2p)

MyISAM存儲引擎:不支持事務和外鍵,但是查詢效率較高(新聞網站)

Oracle 不存在存儲引擎,都有事務

9.2 事務處理代碼

public class TransactionTest {@Testpublic void testName() throws Exception {Connection conn = null;Statement st = null;ResultSet rs = null;try {conn = DruidUtil.getConnection();//將事務設置為手動提交conn.setAutoCommit(false);st = conn.createStatement();// 1.檢查張無忌的賬號余額是否大于等于1000.rs = st.executeQuery("SELECT balance FROM account WHERE name = '張無忌' AND balance >=1000");if(!rs.next()) {throw new RuntimeException("親,您的賬戶余額不夠");}// 余額>=1000:GOTO 2:// 余額 <1000:提示:親,你的余額不足.// 2.在張無忌的賬號余額上減少1000.st.executeUpdate("UPDATE account SET balance = balance-1000 WHERE name = '張無忌'");System.out.println(1/0);// 3.在趙敏的賬戶余額尚增加1000.st.executeUpdate("UPDATE account SET balance = balance+1000 WHERE name = '趙敏'");//提交事務conn.commit();} catch (Exception e) {e.printStackTrace();//回滾事務conn.rollback();}finally {DruidUtil.close(conn, st, rs);}} }

總結

以上是生活随笔為你收集整理的jdbc连接数据scanip_java数据库连接_jdbc的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

色婷婷国产在线 | 91九色自拍| 99久久电影 | 久久福利 | 日本最新一区二区三区 | 人人澡人人模 | 国产一区二区三精品久久久无广告 | 日韩欧美在线一区 | 国产一区二区三区在线免费观看 | 免费看片成人 | 91在线看黄 | 中文字幕色播 | 亚洲三级网| 久久国产精品成人免费浪潮 | 91秒拍国产福利一区 | 在线观看国产www | 天堂久色 | 亚洲成人黄色网址 | 97人人网 | 午夜三级理论 | 日韩精品一区二区免费视频 | 国产精品美女999 | 人人玩人人添人人 | 国产在线专区 | 精品女同一区二区三区在线观看 | 久久九九影视 | 蜜桃视频在线视频 | 玖玖国产精品视频 | 高清av在线免费观看 | 狠狠狠狠干 | 日韩大片在线播放 | 日韩区欠美精品av视频 | 在线 你懂 | 亚州免费视频 | 欧美日韩伦理在线 | 久久91网 | 成人97视频一区二区 | 精品一二 | 最新高清无码专区 | 国产精品免费在线播放 | 亚洲电影成人 | 成人黄色大片 | 久久国产精品免费一区二区三区 | 亚洲天堂网站视频 | 99热精品国产一区二区在线观看 | 特级西西人体444是什么意思 | 婷婷视频导航 | 亚洲国产精品电影在线观看 | 亚洲黄色成人网 | 日韩视频a | 久久久久久久久久久久久久免费看 | 毛片激情永久免费 | 亚洲国产精品传媒在线观看 | 超碰在线cao | 午夜精品久久久久久久99水蜜桃 | 国产精品成人一区二区三区吃奶 | 伊人影院av | 色小说av| 96精品在线| 欧美日韩高清 | 亚洲欧美日韩不卡 | 亚洲天堂网视频在线观看 | 日日干网址 | 福利av影院| 国产成人精品区 | 国产又粗又猛又黄又爽的视频 | 国产黄在线播放 | 久久久久久久久久网 | 天天色天天操天天爽 | 男女视频91| 午夜精品一二三区 | 国产综合精品一区二区三区 | 日韩av午夜 | 久久超级碰视频 | 久久国产亚洲精品 | 91精品国产99久久久久久红楼 | 久久成人综合 | 国产成人免费在线 | 九九久久免费视频 | 亚洲欧美国产日韩在线观看 | 亚洲精品1区2区3区 超碰成人网 | 18久久久久久 | 日韩精品视频免费 | 草久久影院 | 免费观看国产精品视频 | 天天色 天天 | 欧美在线观看小视频 | 在线免费观看黄色av | 亚洲精选在线 | 国产精品你懂的在线观看 | 在线免费黄色av | 成年人网站免费在线观看 | 91九色视频在线播放 | 91在线成人 | 国产精品自在线拍国产 | 亚洲精品久久久久中文字幕m男 | 国产精品免费久久 | av中文字幕日韩 | 国产精品igao视频网入口 | 日韩电影黄色 | 91九色视频网站 | 久久综合五月天婷婷伊人 | a视频在线观看免费 | 亚洲区精品视频 | 亚洲国产经典视频 | 亚洲欧美国产精品久久久久 | 蜜臀久久99静品久久久久久 | 精品国产一区二区三区四区vr | 波多野结衣网址 | 免费日韩 精品中文字幕视频在线 | 天天综合入口 | 夜夜高潮夜夜爽国产伦精品 | 国产成人a亚洲精品 | 天堂成人在线 | 91电影福利 | 综合成人在线 | 99热最新| 亚洲精品理论 | 午夜电影久久久 | 国产精品免费大片视频 | 欧美粗又大 | 久久天天草| 激情av在线资源 | 国产拍揄自揄精品视频麻豆 | 99爱这里只有精品 | 美女中文字幕 | 色就色,综合激情 | 天堂视频中文在线 | 精品字幕在线 | 果冻av在线 | 欧美极品xxx | 麻豆国产电影 | 午夜精品一区二区三区在线观看 | 国产综合片 | 中文字幕高清在线播放 | 黄污网| 永久免费的av电影 | 天天av综合网 | 国产在线一卡 | 亚洲精品97| 午夜精品一区二区三区在线播放 | 伊人久久影视 | 黄网在线免费观看 | 91九色蝌蚪国产 | 91黄色在线观看 | 夜夜夜夜爽 | 久久成人黄色 | 亚洲激情久久 | www.91成人 | 国产午夜精品一区二区三区在线观看 | 少妇性xxx | 夜色成人网| 国产亚洲精品久久网站 | 高清国产午夜精品久久久久久 | 午夜免费在线观看 | 日韩欧美一区二区在线 | 亚洲精品久久久久久国 | 一区二区三区在线播放 | 久久最新| 国产精品久久二区 | 天天色天天操天天爽 | 久久精品亚洲精品国产欧美 | 天天综合色 | 狠狠色狠狠色终合网 | 久久久久免费精品视频 | 日日躁夜夜躁xxxxaaaa | 国产免费大片 | 天天操夜夜叫 | 欧美性生活免费看 | 欧美日韩国产精品一区二区 | 操操日日| 成人网页在线免费观看 | 欧美国产日韩一区二区三区 | 久久久久欠精品国产毛片国产毛生 | 欧美大片mv免费 | 97成人在线视频 | 99久久99久久精品免费 | 99免费精品 | 狠狠色丁香婷婷 | 中文字幕欧美日韩va免费视频 | 午夜婷婷在线观看 | 国产精品白浆视频 | 激情黄色av| 国产精品久久久久久久久久久久 | 天堂av在线网址 | 五月综合婷| 国产h片在线观看 | 日韩午夜电影 | 日韩欧美xxxx | 久久久国产精品一区二区中文 | 天天插日日射 | bbbb操bbbb | 中文字幕观看在线 | 中文字幕一区在线观看视频 | 美女视频a美女大全免费下载蜜臀 | 久草在线视频在线 | 91视频成人免费 | 不卡av在线播放 | 在线网站黄 | 在线观看91精品国产网站 | 美女网站在线播放 | 狠狠色丁香婷婷综合欧美 | 久久99视频免费观看 | 成人久久毛片 | 丁香婷婷基地 | 国产精品手机在线观看 | 亚欧洲精品视频在线观看 | 在线看免费 | 91在线视频免费91 | 久久精品视频网址 | 96香蕉视频 | 婷婷狠狠操 | 四虎在线免费观看 | 欧美一区二区三区在线视频观看 | 欧美日韩视频免费 | 天天操天天干天天综合网 | 亚洲午夜精品在线观看 | 国产精品麻豆视频 | 日韩av伦理片 | 免费在线观看的av网站 | 97视频在线免费 | 国产福利不卡视频 | 天天做日日爱夜夜爽 | 欧美黑人性爽 | 国产成人一二三 | 四虎永久精品在线 | 国产在线精品一区二区三区 | av千婊在线免费观看 | 欧美激情操 | 亚洲我射av | 九九热只有这里有精品 | www.久久99 | 黄色软件在线观看 | 在线观看免费视频你懂的 | 怡红院成人在线 | 天天操天天操 | 久久综合免费 | 久久免费视频在线观看6 | 精品一区二区在线免费观看 | 久久综合亚洲鲁鲁五月久久 | 韩国av免费观看 | 欧美另类高清 videos | 香蕉在线播放 | 国产高清在线免费观看 | www色,com| 99热国产在线 | 日韩一二三区不卡 | 国内精品久久久久国产 | 成人国产精品免费观看 | 美女免费视频网站 | 一级成人免费 | 一本大道久久精品懂色aⅴ 五月婷社区 | av一二三区| 国产一级二级三级视频 | 精品中文字幕在线观看 | 免费看的黄色片 | 色婷五月天 | 免费av网址大全 | 日韩高清精品一区二区 | 欧美成年性 | 日躁夜躁狠狠躁2001 | 美女网站色 | 嫩嫩影院理论片 | 国产精品日韩在线 | 国产精品一区二区久久精品爱微奶 | 久久久久9999亚洲精品 | 青青草国产精品 | 91爱爱网址 | 91视频高清免费 | 久久国产热视频 | 亚洲精品99久久久久久 | 国产理论免费 | 亚洲成人资源 | 在线色资源 | 国产精品一区二区三区在线播放 | 精品国产一区二区三区久久久 | 免费观看日韩 | 狠狠的干狠狠的操 | 久久精品亚洲综合专区 | 国产精品久久久99 | 婷婷久久国产 | 国产精品午夜8888 | 成人91在线| 国产美女黄网站免费 | 日本精品中文字幕 | 亚洲欧洲中文日韩久久av乱码 | 天天艹天天干天天 | 国产精品久久久久久久久久东京 | 久久99久久99精品免视看婷婷 | 中文字幕91在线 | 欧美日韩在线视频一区二区 | 日日夜夜精品视频天天综合网 | 久久久久久久久久久高潮一区二区 | 日本中文字幕网站 | 国产精品久久久久久久久久久久午 | 精品自拍网 | 国产精品人成电影在线观看 | 亚洲激情p | 久久国产精品99精国产 | 精品福利视频在线 | 天天射天天干天天插 | 日韩电影中文字幕 | 91完整版在线观看 | 一级黄色在线免费观看 | 国产成人黄色在线 | 免费看毛片网站 | 黄色成人在线观看 | 国内精品视频在线 | 精品一区在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 久色小说 | 99精品免费在线 | 美女网站色 | 五月在线视频 | 免费视频 三区 | 99久久精品国产一区二区成人 | 亚洲精品久久久蜜桃 | 国产成人免费在线观看 | 国产在线播放一区 | 日韩av看片| 最新成人av| 三级黄色网址 | 成人中文字幕+乱码+中文字幕 | www.av免费观看 | 在线观看成年人 | 国产精品久久久久久久久费观看 | 久久精品视频网址 | 就要干b| 国产色在线,com | 狠狠干综合 | 亚洲高清视频在线播放 | 激情欧美国产 | 嫩草av影院 | 久久午夜电影院 | av在线免费播放 | 国内精品小视频 | 午夜精品影院 | 99久久99久久 | 美女视频黄在线观看 | 免费高清看电视网站 | 国产精品一区久久久久 | 韩国中文三级 | 91在线精品观看 | 天天色综合天天 | 四虎伊人| 天天色综合1 | 国产在线专区 | 成人免费视频免费观看 | 91九色蝌蚪视频网站 | 韩日精品在线 | 久久深夜 | 最新中文字幕在线播放 | 久久av在线| 一区二区三区手机在线观看 | 韩国精品福利一区二区三区 | 在线免费观看麻豆视频 | 亚州精品视频 | 久青草影院 | 欧美日韩国产精品久久 | 成人一区二区三区中文字幕 | 国产精品乱码久久 | 亚洲国内精品在线 | 人人干网| 亚洲va欧美va人人爽春色影视 | 久久久免费看 | 免费视频久久久 | 精品久久免费看 | 午夜精品视频一区二区三区在线看 | 在线v片免费观看视频 | 天天摸天天操天天爽 | 精品久久久久久久久久久久久久久久 | 最近高清中文字幕在线国语5 | 日韩欧美视频免费观看 | 色婷婷视频在线观看 | 色视频网页| 人人dvd| 精品在线看| 国产一级在线免费观看 | 一区二区三区电影在线播 | 国语精品久久 | 在线免费观看黄色av | 一区免费观看 | 最近更新好看的中文字幕 | 亚洲精品国产第一综合99久久 | 国产亚洲精品久久久久久久久久久久 | 久久精品99国产 | 欧美人zozo| 国产特级毛片aaaaaa毛片 | 麻豆视传媒官网免费观看 | 日韩免费专区 | 久久高清国产视频 | 久久精品香蕉视频 | 久久一级电影 | 久久精品看 | 色综合久久久久久中文网 | 人人澡超碰碰97碰碰碰软件 | 久久免费在线观看视频 | 色婷婷av国产精品 | 夜又临在线观看 | 欧美福利视频 | 欧美一区二区三区在线观看 | 国产亚洲精品无 | 狠狠的干狠狠的操 | 久久综合射 | 国产精品成人一区二区三区吃奶 | 91精品视频观看 | 国产又粗又猛又黄又爽的视频 | 草久视频在线观看 | 日韩高清不卡一区二区三区 | 日本xxxx.com| 色综合天天色综合 | 久久久福利影院 | 成人三级网址 | 久久精品国产第一区二区三区 | 中文字幕 第二区 | 午夜美女视频 | 香蕉在线视频播放网站 | 亚洲精品久久久久久久不卡四虎 | 日韩黄色免费看 | 国产在线观看午夜 | 视频一区二区精品 | 国产免费激情久久 | 91av在线免费看 | 亚洲女同videos| 亚洲精品免费在线视频 | 婷婷色网视频在线播放 | 国产视频不卡一区 | 中文字幕在线视频免费播放 | 在线观看va | 国产短视频在线播放 | 色婷婷久久一区二区 | 国产在线精品区 | 国产精品国产自产拍高清av | 美女网站色 | 久久影院亚洲 | 亚洲一区二区观看 | 久久国产经典视频 | 国产精品 欧美 日韩 | 久草在线视频资源 | 日日干夜夜骑 | 国产精品久久久久久久久久ktv | 人人草在线视频 | 嫩草av影院 | 热热热热热色 | 国产成人在线观看 | 视频一区二区精品 | 91精品一区二区三区蜜臀 | 国产福利一区二区三区在线观看 | 国产精品永久久久久久久久久 | 91久久久久久久 | 人人爽人人香蕉 | 国产原创在线视频 | 欧美伦理一区二区三区 | 在线观看免费视频 | 久久97超碰 | 中文字幕在线免费97 | 亚洲永久精品一区 | 96亚洲精品久久久蜜桃 | 伊人精品在线 | 免费在线观看a v | 久久9999久久免费精品国产 | 五月婷婷六月丁香 | 国产97色 | 99久久久久久久久久 | 国产日韩欧美视频 | 日日狠狠 | 久久精品黄 | 国产老妇av | 九九久久国产 | 日韩v在线91成人自拍 | 中文在线字幕免费观 | 国产又粗又猛又黄又爽的视频 | 成年免费在线视频 | 人成免费网站 | 日韩一区二区三区视频在线 | 不卡的av电影在线观看 | 国产精品一区二区三区观看 | 久久在线一区 | 六月丁香在线视频 | 国产超碰在线 | 亚洲国产婷婷 | 四虎在线视频免费观看 | 日本中文字幕观看 | 久久国产精品99久久人人澡 | 色综合天天综合在线视频 | 亚洲精品玖玖玖av在线看 | 午夜婷婷网| 免费欧美精品 | 欧美一级高清片 | 99一区二区三区 | 天天色天天射天天综合网 | 久福利 | 国产精品永久免费在线 | 依人成人综合网 | 国产亚洲一级高清 | av九九 | 91在线影院| 天堂va欧美va亚洲va老司机 | 97福利在线 | av免费网站观看 | 黄色片毛片| 黄色免费高清视频 | 国产一区91 | 天天射网| 免费av看片 | 在线一级片 | 人人爽人人爽人人爽 | 一区二区精品在线视频 | 夜夜天天干 | 二区视频在线观看 | 日韩二区在线播放 | 国产精品大全 | 免费观看视频的网站 | 91精品老司机久久一区啪 | 中文字幕在线观看视频一区二区三区 | 在线之家免费在线观看电影 | 97偷拍在线视频 | 久久女教师 | 国产在线精品福利 | 久久最新视频 | 丁香婷婷综合激情五月色 | 欧美日韩国产精品一区二区 | 丁香婷婷久久久综合精品国产 | 日韩在线视 | 午夜久久网站 | 日本韩国欧美在线观看 | 综合网成人| 国产午夜av| av3级在线 | 日韩理论电影在线观看 | 国产自偷自拍 | 亚洲欧美精品在线 | 午夜私人影院久久久久 | 人人澡人人添人人爽一区二区 | 97视频在线 | 国产午夜精品免费一区二区三区视频 | 在线观看免费中文字幕 | 亚洲免费在线视频 | 日韩手机在线观看 | 亚洲精品自拍视频在线观看 | 成人在线观看日韩 | 天堂麻豆 | 在线影院 国内精品 | 91精品国自产在线观看 | 麻豆视频国产精品 | 色综合激情网 | 99久久久成人国产精品 | 欧美综合色在线图区 | 久久精品专区 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 999国内精品永久免费视频 | 99精品一区二区三区 | 国产精品一区二区av影院萌芽 | 在线观看日本韩国电影 | 免费在线观看一级片 | 激情综合亚洲精品 | 在线免费黄色av | 人人干在线观看 | 在线国产精品视频 | 日本性生活一级片 | 97视频人人| 久久久色| 在线观看免费日韩 | 国产欧美中文字幕 | 天堂av在线网址 | 丁香国产视频 | 九九热只有精品 | av不卡免费在线观看 | 狠狠干激情 | 西西人体4444www高清视频 | 亚洲精品一区二区三区在线观看 | 天天操,夜夜操 | 一级a性色生活片久久毛片波多野 | 国产视频精品免费 | 99国产一区二区三精品乱码 | www.久久色| 国产精品一区二区在线观看免费 | 国产精品网址在线观看 | 丁香六月在线 | 国产一级电影免费观看 | 五月天视频网 | av中文字幕网| 欧美人操人 | 五月天婷婷免费视频 | 色婷婷九月 | 日韩欧美一区二区在线播放 | 国产麻豆精品95视频 | 色av资源网 | 色操插| 欧美最新大片在线看 | 中文字幕在线日本 | 国产成人精品久久久 | 美女在线国产 | 国产在线观 | 在线不卡的av | 少妇高潮流白浆在线观看 | 免费电影一区二区三区 | 亚洲免费公开视频 | 手机在线日韩视频 | 日韩视频中文字幕在线观看 | 婷婷国产视频 | 最近日本中文字幕 | 91传媒91久久久 | 国产精品色婷婷 | 狠狠躁夜夜躁人人爽超碰91 | www.激情五月.com | 日韩av资源站 | 亚洲精品小视频 | 久久在线精品 | 欧美成人久久 | 欧美日韩高清免费 | 午夜精品久久久久久久久久久久 | 久久最新网址 | 最近免费中文字幕 | 免费观看www视频 | 国产精品一区二区在线免费观看 | 一区二区三区三区在线 | 五月天久久婷 | 色综合天天视频在线观看 | 国产无套一区二区三区久久 | 婷婷激情综合网 | 四虎成人在线 | av亚洲产国偷v产偷v自拍小说 | 午夜av色 | 在线观看视频免费播放 | 亚洲欧美在线综合 | 又黄又爽又湿又无遮挡的在线视频 | 国产精品高清一区二区三区 | 精品国产乱码久久久久久1区二区 | 91精品爽啪蜜夜国产在线播放 | 色综合亚洲精品激情狠狠 | 精品自拍网 | 久久在线免费视频 | 91在线一区 | 波多野结衣综合网 | 日日夜夜天天 | 国产一二区精品 | 国产精品免费观看久久 | 福利区在线观看 | 91日韩精品视频 | 久久成人一区 | 国产精品一区二区久久精品爱涩 | 91在线视频免费 | 亚洲欧洲精品视频 | 午夜视频在线观看一区二区三区 | 日韩三级在线观看 | 国产精品99久久免费黑人 | 香蕉影视 | 亚洲黄色一级电影 | 久久久久久久久久久成人 | 久久久免费视频播放 | 亚洲黄色免费观看 | 成人国产一区二区 | 国产打女人屁股调教97 | 夜夜操天天干 | www.狠狠插.com | 免费视频91蜜桃 | 精品1区2区3区 | 正在播放久久 | 久操视频在线观看 | 美女网站视频色 | 免费亚洲一区二区 | 在线免费观看国产视频 | 人人爽人人爽人人爽人人爽 | www国产一区 | 精品国产一区二区三区在线 | 免费在线观看av网址 | 国产97色| 精品你懂的 | 国产一卡在线 | 久久一区91 | 国产高清在线免费 | 成人小视频在线免费观看 | 国产日韩在线观看一区 | 久久麻豆精品 | 欧美性极品xxxx娇小 | 国产1级视频 | 99re热精品视频 | 永久av免费在线观看 | 国产精品18久久久久vr手机版特色 | 激情开心色| 视频国产一区二区三区 | 色综合天| 色噜噜狠狠狠狠色综合久不 | 中文字幕在线观看播放 | 色香天天| 美女视频国产 | 成人在线网站观看 | 美女精品久久 | 能在线观看的日韩av | 国产成人av免费在线观看 | 天天干夜夜爱 | 在线观看国产www | 808电影| 国产精品第10页 | 亚洲福利精品 | 日本天天操 | 国产区精品在线观看 | 久久成年人视频 | www色婷婷com| 日韩欧美一区视频 | av久久在线 | 久热免费在线 | 亚洲国产丝袜在线观看 | 国产婷婷一区二区 | 伊人五月 | 久久久午夜精品福利内容 | 成人av地址 | 婷婷在线视频观看 | 久久久91精品国产一区二区三区 | 91精品国产三级a在线观看 | 免费又黄又爽视频 | 亚洲精品小区久久久久久 | 国产精品av在线免费观看 | 99国产视频在线 | 国产中文视频 | 色网址99| 福利一区二区三区四区 | 综合激情伊人 | 久久久久久久久久亚洲精品 | 手机色在线 | 免费高清在线观看成人 | 欧美精品一区二区免费 | 九九热免费观看 | 91人人爽久久涩噜噜噜 | 亚洲欧美国产日韩在线观看 | 亚洲精品国产片 | 九九九热 | 久久伊人婷婷 | 免费a网 | 国产精品中文字幕在线观看 | 久久精品91久久久久久再现 | 国产精品青青 | 中文字幕在线观看你懂的 | 亚洲 欧美变态 另类 综合 | 日韩三级视频在线观看 | 国产精品国产三级国产专区53 | 91麻豆看国产在线紧急地址 | 黄色免费在线视频 | 久久人人添人人爽添人人88v | 亚洲婷婷免费 | 17婷婷久久www | 日韩av快播电影网 | av经典在线 | 亚洲视频播放 | 欧美一二区在线 | 亚洲 欧美 变态 国产 另类 | 91精品国产自产老师啪 | 尤物九九久久国产精品的分类 | 国产麻豆精品95视频 | 国产青春久久久国产毛片 | 免费久久片 | 国产一区二区久久 | 正在播放一区 | 国产亚洲日| 一区二区视频在线看 | 热精品 | 午夜视频久久久 | 久久性生活片 | www..com毛片| 在线播放国产精品 | 欧美激情综合五月色丁香 | 精品一区二区精品 | 999久久久免费视频 午夜国产在线观看 | avcom在线| 啪啪免费观看网站 | 偷拍精品一区二区三区 | 日日干天天插 | 成人av在线影视 | 国产高清精品在线 | 国产亚洲aⅴaaaaaa毛片 | 中文av在线播放 | 免费福利片2019潦草影视午夜 | 91精品国自产在线 | 99热在线这里只有精品 | 黄免费网站 | 午夜精品视频在线 | 国产一区二区三区免费在线观看 | 97精品视频在线 | 日本一区二区不卡高清 | 狠狠操狠狠干天天操 | 深爱激情站 | 欧美日韩免费一区二区三区 | 成人亚洲网 | 亚洲欧美激情精品一区二区 | 欧美日韩国产免费视频 | 久久精品首页 | 天天干夜夜操视频 | 在线观看91av| 黄色一级性片 | 一级精品视频在线观看宜春院 | 97视频免费 | 精品亚洲成a人在线观看 | 日韩欧美视频在线免费观看 | 青青色影院| www.97色.com| 成人黄色在线电影 | 手机在线黄色网址 | 九色91视频| 欧美日本不卡高清 | 成人久久视频 | 999久久久久久久久6666 | 久久人人97超碰com | 久久伊人爱 | 久久高清毛片 | 国内三级在线观看 | 欧美日韩视频一区二区 | 丁香激情婷婷 | 亚洲精品国偷拍自产在线观看 | 精品一区二区三区久久 | 伊人热 | 中文字幕一区二区三区四区视频 | 最新日韩在线观看 | 欧美日韩在线视频观看 | 成人黄大片视频在线观看 | 日本在线观看中文字幕 | 精品91在线 | 九九视频这里只有精品 | 婷婷中文字幕在线观看 | 在线观看av片 | 国产码电影 | h视频在线看 | 久久黄视频 | 十八岁以下禁止观看的1000个网站 | 九九热在线播放 | 天天搞夜夜骑 | 97人人爽| 精品国产一二三 | 久久国产亚洲精品 | 91视频在线观看下载 | 亚洲天堂精品视频在线观看 | 亚洲无人区小视频 | 亚洲欧美视频一区二区三区 | 国产精品成人a免费观看 | 亚洲 欧洲 国产 日本 综合 | 免费在线观看av网站 | 中文字幕 在线看 | 波多野结衣一区三区 | 麻豆视频免费在线 | 91亚洲在线 | 国产91成人 | 亚洲成aⅴ人片久久青草影院 | 视频在线99 | 午夜 免费| 国产精品成人久久久久 | 久久综合福利 | 国产资源在线播放 | 亚洲成人影音 | 日韩最新在线视频 | 国产在线观看,日本 | 97成人免费 | 中文字幕色综合网 | 免费在线观看不卡av | 国产青草视频在线观看 | 91在线视频导航 | 免费看国产一级片 | 国产一区av在线 | 在线观看免费成人 | 天天拍夜夜拍 | 国产成人精品一区二区三区在线 | 日韩艹| 五月天激情开心 | 97视频免费观看 | 国产乱视频 | 亚洲高清在线视频 | 美女精品国产 | 五月婷婷久草 | 伊人伊成久久人综合网站 | 亚洲成人蜜桃 | 黄色小说免费观看 | 久久国色夜色精品国产 | 91视频网址入口 | 亚洲精品色 | 国产一二三在线视频 | 国产精品久久网站 | 国产黄色a| 奇米影视8888在线观看大全免费 | 久久久国产精品久久久 | 欧美日本中文字幕 | 国产一级视频 | 少妇高潮流白浆在线观看 | 亚洲免费永久精品国产 | 国产精品视频全国免费观看 | 日韩一区二区在线免费观看 | 天天久久综合 | 手机成人在线电影 | 夜夜躁日日躁狠狠久久88av | 日日夜夜天天久久 | 黄色av一区二区三区 | 欧美日韩超碰 | 69视频在线播放 | av中文字幕av | 99国产精品免费网站 | 91精品视屏| 国产精品1区2区在线观看 | 久久伊人婷婷 | 国产高清网站 | 亚洲天堂精品视频在线观看 | 国产精品二区三区 | 婷婷夜夜 | 国产网站av | 亚洲欧美国产精品久久久久 | 国产精品一区二区三区观看 | 亚洲黄在线观看 | 九九日韩| 国产91精品看黄网站 | 欧美二区在线播放 | av电影中文字幕在线观看 | 激情五月综合网 | 久久视频精品 | 91桃花视频 | 99热最新 | 亚洲国产精品久久久久久 | 涩五月婷婷 | 日韩中文字幕免费看 | 亚洲精品乱码久久 | 成人av高清在线观看 | 日本精品一区二区三区在线播放视频 | 欧美日一级片 | 黄色资源网站 | av片一区| 麻豆va一区二区三区久久浪 | 午夜精品久久久久久99热明星 | 色播五月激情综合网 | 中文字幕在线播放第一页 | 久久久久电影网站 | 日韩欧美高清视频在线观看 | 免费看的黄色网 | 国产视频 亚洲精品 | 又黄又爽又刺激的视频 | 久久综合久久综合九色 | 精品久久久久久电影 | 在线观看视频亚洲 | 亚洲精品久久久久久久不卡四虎 | 婷婷丁香在线 | 久久国产一二区 | 欧美精品一级视频 | 人人插人人做 | 亚洲精品视频在线播放 | 亚洲精品国产精品国产 | 天天色天天射天天综合网 | 99久久国产免费免费 | 男女激情片在线观看 | 免费看一级片 | 亚洲视频在线观看网站 | 日本久久久精品视频 | 日本在线观看黄色 | 日韩一级黄色大片 | 国产精品一区二区久久国产 | av手机版| 精品在线观 | 中文字幕一区二区三区乱码在线 | 国产亚洲日 | 成人毛片一区 | 国产精品国产三级在线专区 | 91成人免费视频 | 免费黄色特级片 | 91免费视频黄 | 国产又粗又猛又爽 | 日日夜夜天天射 | 国产69精品久久久久99尤 | 在线欧美中文字幕 | 亚洲精品视频在线观看免费 | 在线观看亚洲国产精品 | 色婷婷五 | 国产一区在线不卡 | 亚洲成a人片在线www | 国产一区二区成人 | 日韩区视频 | 久久久久国产精品厨房 | 一区二区三区不卡在线 | 中文字幕在线播放一区二区 | 国产麻豆果冻传媒在线观看 | 国产99久久久国产精品 | 日韩精品一区二区三区免费观看视频 | 日韩中文字幕亚洲一区二区va在线 | 久久字幕精品一区 | 日韩一区在线播放 | 成人a视频 | 91av在线免费观看 | 久久成人毛片 | 蜜臀久久99精品久久久久久网站 | 久久免费毛片视频 | 久久综合九色综合97婷婷女人 | 国产日韩欧美在线免费观看 | 国产精品美女久久久久久久 | 91人人爽久久涩噜噜噜 | 美女视频免费精品 | 激情婷婷网 | 一本一本久久a久久精品综合 | 亚洲激情校园春色 | 久久久久久久国产精品视频 | 91精选在线| 成年人免费电影在线观看 | 精品国产一区二区三区久久久蜜月 | 久久久久国产成人精品亚洲午夜 | 国产免费成人av | 亚洲,播放 |