欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

由淺到深學(xué)習(xí)JDBC一

JDBC:

寶坻網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),寶坻網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為寶坻上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的寶坻做網(wǎng)站的公司定做!

雖然由于快節(jié)奏的開(kāi)發(fā),編程速度的追求,越愛(ài)越多的MVC框架出現(xiàn),比如持久層的hibernate,

mybatis等等,他們對(duì)Dao層的支持都很強(qiáng)大,既快速,又簡(jiǎn)便。但是他們的底層同樣是使用了JDBC,

為了追求高速簡(jiǎn)便,我們可以不使用JDBC,但一定要了解JDBC。了解JDBC也有助于學(xué)習(xí)其他持久層框架。

java和數(shù)據(jù)庫(kù)交互需要中間程序作為中轉(zhuǎn)。在很早以前,數(shù)據(jù)庫(kù)廠商還沒(méi)有一套統(tǒng)一的API作為

java語(yǔ)言和數(shù)據(jù)庫(kù)的接口,開(kāi)發(fā)程序是一件很頭疼的事。對(duì)不同的數(shù)據(jù)庫(kù)需要寫(xiě)不同的程序來(lái)作為交互。

     java訪問(wèn)-----oracle程序-----oracle數(shù)據(jù)庫(kù)

     java訪問(wèn)------MySQL程序------mysql數(shù)據(jù)庫(kù)

     java訪問(wèn)-------db2程序--------db2數(shù)據(jù)庫(kù)

那到底什么是JDBC呢:

    JDBC是代表Java數(shù)據(jù)庫(kù)連接,這對(duì)java編程語(yǔ)言和廣泛的數(shù)據(jù)庫(kù)之間獨(dú)立于數(shù)據(jù)庫(kù)的連接標(biāo)準(zhǔn)的Java API

     有了JDBC開(kāi)發(fā)就統(tǒng)一了很多。

     java訪問(wèn)-----JDBC程序-----oracle數(shù)據(jù)庫(kù)

     java訪問(wèn)------JDBC 程序------mysql數(shù)據(jù)庫(kù)

     java訪問(wèn)------JDBC 程序--------db2數(shù)據(jù)庫(kù)

以下簡(jiǎn)介JDBC針對(duì)oracl和mysql數(shù)據(jù)庫(kù)。

oracle提供的jdbc接口的實(shí)現(xiàn)類(lèi)-------ojdbc5.jar------jdk5.0  ojdbc6.jar-----jdk6.0

mysql提供的jdbc接口實(shí)現(xiàn)類(lèi)--------mysql-connector-java-6.0.6

如果要開(kāi)發(fā)JDBC程序,必然少不了這些jar包。下載可以去官網(wǎng)

https://dev.mysql.com/downloads/connector/

JDBC常用API簡(jiǎn)介:

java.sql.Connection:代表一個(gè)數(shù)據(jù)庫(kù)連接;

java.sql.Statement:發(fā)送sql語(yǔ)句1至數(shù)據(jù)庫(kù);(發(fā)送sql的工具)

DriverManager:(類(lèi)) 管理多個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)類(lèi)

java.sql.ResultSet:結(jié)果集,存放查詢(xún)語(yǔ)句執(zhí)行后返回的數(shù)據(jù)結(jié)果

下圖1.0為JDBC訪問(wèn)數(shù)據(jù)庫(kù)流程

                                                圖1.0

由淺到深學(xué)習(xí)JDBC一

JDBC開(kāi)發(fā)步驟

1: 加載驅(qū)動(dòng)

如果是oracle數(shù)據(jù)庫(kù):

將oracle ojdbc.jar 復(fù)制到項(xiàng)目里,點(diǎn)擊項(xiàng)目,右鍵build path --add to buidpath 

Class.forName("oracle.jdbc.OracleDriver");

如果是mysql數(shù)據(jù)庫(kù):

將mysql  mysql-connector-java-6.0.6-bin 復(fù)制到項(xiàng)目里,build path --add to buidpath 

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

2:連接數(shù)據(jù)庫(kù)

     user:root----數(shù)據(jù)庫(kù)用戶(hù)名

     password:root------數(shù)據(jù)庫(kù)密碼

     url: oracle ----協(xié)議 :子協(xié)議 :thin:@ip:端口:SID(SID數(shù)據(jù)庫(kù)的實(shí)例名)。

     eg:String url = "jdbc:oracle:thin:@localhost:1521:XE";

     url:mysql ------ 協(xié)議:子協(xié)議://ip:端口:數(shù)據(jù)庫(kù)名

   eg:String url = "jdbc:mysql://localhost:3306/zdx";

3:準(zhǔn)備sql

     sql字符串中不能有分號(hào);

4:Statement將sql發(fā)送至數(shù)據(jù)庫(kù)

      int i=  executeUpdate(sql); //返回受影響的行數(shù)

5:如果是查詢(xún)語(yǔ)句,返回結(jié)果集,處理ResultSet。

6:關(guān)閉連接,釋放資源,按照先打開(kāi)后關(guān)閉的原則。

以上6步驟時(shí)開(kāi)發(fā)JDBC程序的標(biāo)準(zhǔn)步驟。

ResultSet結(jié)果集簡(jiǎn)介及使用方法:

     ResultSet結(jié)果集:存放查詢(xún)結(jié)果數(shù)據(jù)。

     ResultSet rs = Statement.executeQuery();

     rs指針初始位置在第一行數(shù)據(jù)之前

     boolean rs.next(): ,

     將rs的指針向下移動(dòng)一位,當(dāng)前行無(wú)數(shù)據(jù)返回false,有數(shù)據(jù)返回true,并獲得查詢(xún)數(shù)據(jù)。

     提供一組getXXX(int列序號(hào)或String列名)方法用于取得數(shù)據(jù)

以上是JDBC簡(jiǎn)介,下面是JDBC例子,例子才是王道。

JDBC1.0版本------是1.0版本。后面還會(huì)有更優(yōu)秀的版本娓娓道來(lái)!

JDBC_ResultSet.java

public class JDBC_ResultSet {

       public static void main(String[] args) throws ClassNotFoundException, SQLException {

             //1:加載驅(qū)動(dòng)

             //Class.forName("oracle.jdbc.OracleDriver");

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

             //2:獲得數(shù)據(jù)庫(kù)連接

             String user = "root";

             String password = "root";

             //String url = "jdbc:oracle:thin:@localhost:1521:XE";

             String url = "jdbc:mysql://localhost:3306/zdx?serverTimezone=UTC";

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

             //3:準(zhǔn)備sql

             String sql = "select * from student";

             //4:創(chuàng)建Statement,發(fā)送sql

             Statement stm = conn.createStatement();//獲的statement對(duì)象

             //5:如果是查詢(xún),處理結(jié)果集

             ResultSet rs = stm.executeQuery(sql);

             while(rs.next()){

                    int id = rs.getInt(1);

                    String name = rs.getString(2);

                    int age = rs.getInt(3);

                    String phone = rs.getString(4);

                    System.out.println(id+"---"+name+"---"+age+"---"+phone);

             }

             //6:關(guān)閉連接,釋放資源,原則,先打開(kāi)后關(guān)閉

             stm.close();

             conn.close();

             

       }

}

到了此處,我們的JDBC1.0已經(jīng)寫(xiě)完了,但是為什么說(shuō)是1.0呢,因?yàn)檫@個(gè)版本有一個(gè)很大的漏洞。

沒(méi)錯(cuò),那就是——依賴(lài)注入問(wèn)題。

===================華麗麗的分割線==============================

下面我們可以看這個(gè)例子

JDBC_Statement.java

public class JDBC_Statement {

       public static void main(String[] args) throws Exception {

             

             Scanner sc = new Scanner(System.in);

             System.out.println("請(qǐng)輸入卡號(hào)");

             String card_id = sc.nextLine();

             System.out.println("請(qǐng)輸入密碼");

             String pwd = sc.nextLine();

             //1:加載驅(qū)動(dòng)

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

             //2:獲得數(shù)據(jù)庫(kù)連接

             String user = "root";

             String password = "root";

             String url = "jdbc:mysql://localhost:3306/zdx?serverTimezone=UTC";

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

             //3:準(zhǔn)備sql

             String sql = "select * from account where card_id ="+card_id

                                 +" and password = '"+pwd+"'";

             System.out.println(sql);

             //4:創(chuàng)建Statement,發(fā)送sql

             Statement stm = conn.createStatement();//獲的statement對(duì)象

             //5:如果是查詢(xún),處理結(jié)果集

             ResultSet rs = stm.executeQuery(sql);

             if(rs.next()){

                    System.out.println("可以取錢(qián)了");

             }else{

                    System.out.println("密碼賬戶(hù)不正確");

             }

             //6:關(guān)閉連接,釋放資源,原則,先打開(kāi)后關(guān)閉

             stm.close();

             conn.close();

       }

}

這是一個(gè)銀行取錢(qián)的例子,如代碼所寫(xiě)。

數(shù)據(jù)庫(kù)有這樣一張account表,數(shù)據(jù)和字段如下:

由淺到深學(xué)習(xí)JDBC一

現(xiàn)在在控制臺(tái)輸入卡號(hào)密碼,卡號(hào)密碼正確即可取錢(qián),

錯(cuò)誤即提示賬戶(hù)不正確。

現(xiàn)在控制臺(tái)輸入正確卡號(hào)密碼

由淺到深學(xué)習(xí)JDBC一

然后,我輸入錯(cuò)誤的卡號(hào)密碼竟然也可以取錢(qián)!輸入錯(cuò)誤的卡號(hào) “123 or 1=1 -- ”密碼 "zxc"結(jié)果如下

由淺到深學(xué)習(xí)JDBC一

可見(jiàn)依然能訪問(wèn)數(shù)據(jù)庫(kù),這對(duì)于銀行可是致命性錯(cuò)誤,密碼錯(cuò)誤還可以取錢(qián)。

這就是依賴(lài)注入引起的著名錯(cuò)誤。

依靠人為輸入破壞sql結(jié)構(gòu).

select * from account where id = 1001 or 1=1 -- and password = 'xxx'

這條sql里,其中--是sql里的注釋 or 1=1 永遠(yuǎn)為真并且還是or連接,

所以這條sql只執(zhí)行到 or 1=1 ,1=1又是恒等。所以跳過(guò)了密碼。

為了解決這個(gè)問(wèn)題,我們就要說(shuō)PreparedStatement!

PreparedStatement簡(jiǎn)介及使用

PreparedStatement構(gòu)建動(dòng)態(tài)SQL,通過(guò)PreparedStatement執(zhí)行SQL語(yǔ)句,解決注入***。

PreparedStatement是Statement的子接口。

通過(guò)連接創(chuàng)建PreparedStatement,創(chuàng)建時(shí)將SQL語(yǔ)句中發(fā)生變化的部分用占位符“?“ 代替。

功能:和statement一樣,發(fā)送sql語(yǔ)句。 

          但是執(zhí)行多個(gè)同構(gòu)sql效率高。同構(gòu)sql能省去①②③步驟。

使用步驟:

     1.創(chuàng)建pstm

     String sql = "select * from account where card_id = ? and password = ?"

     PreparedStateement pstm = conn.prepareStatement(sql);

          ①驗(yàn)證權(quán)限

          ②驗(yàn)證語(yǔ)法

          ③將sql轉(zhuǎn)換內(nèi)部指令

2.綁定參數(shù)

     pstm.setInt(1,值);

     pstm.setString(2,值);

3.發(fā)送綁定參數(shù)至DB數(shù)據(jù)庫(kù)

     pstm.executeUpdate();//曾刪改

     pstm.executedQuery();//查詢(xún)

          ④執(zhí)行內(nèi)部指令操作數(shù)據(jù)庫(kù)

mysql內(nèi)部執(zhí)行sql步驟:

          ①驗(yàn)證權(quán)限

          ②驗(yàn)證語(yǔ)法

          ③將sql轉(zhuǎn)換內(nèi)部指令

          ④執(zhí)行內(nèi)部指令操作數(shù)據(jù)庫(kù)

使用PareparedStatement解決注入***問(wèn)題后的代碼如下:

JDBC2.0版本 是2.0版本>_< 。后面還會(huì)有更優(yōu)秀的版本娓娓道來(lái)!

JDBC_PreparedStatement.java

public class JDBC_PreparedStatement {

       public static void main(String[] args) throws Exception {

             

             Scanner sc = new Scanner(System.in);

             System.out.println("請(qǐng)輸入卡號(hào)");

             String card_id = sc.nextLine();

             System.out.println("請(qǐng)輸入密碼");

             String pwd = sc.nextLine();

             //1:加載驅(qū)動(dòng)

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

             //2:獲得數(shù)據(jù)庫(kù)連接

             String user = "root";

             String password = "root";

             String url = "jdbc:mysql://localhost:3306/zdx?serverTimezone=UTC";

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

             //3:準(zhǔn)備sql

             String sql = "select * from account where card_id =? and password =?";

             PreparedStatement pstm = conn.prepareStatement(sql);

             pstm.setInt(1, Integer.valueOf(card_id));

             pstm.setString(2, pwd);

             //5:如果是查詢(xún),處理結(jié)果集

             ResultSet rs = pstm.executeQuery();

             if(rs.next()){

                    System.out.println("可以取錢(qián)了");

             }else{

                    System.out.println("密碼賬戶(hù)不正確");

             }

             //6:關(guān)閉連接,釋放資源,原則,先打開(kāi)后關(guān)閉

             rs.close();

             pstm.close();

             conn.close();

       }

}

現(xiàn)在用PreparedStatement程序執(zhí)行,輸入卡號(hào),密碼

由淺到深學(xué)習(xí)JDBC一

出現(xiàn)異常,不會(huì)再出現(xiàn)密碼錯(cuò)誤卻取錢(qián)的問(wèn)題了?。?!

總結(jié)對(duì)比一下 Statement 和PreparedStatement


Statement

PreparedStatement

關(guān)系

父接口

子接口

安全

存在注入隱患

解決sql注入

效率

執(zhí)行異構(gòu)sql快

執(zhí)行同構(gòu)sql快

至此JDBC2.0結(jié)束。JDBC基本內(nèi)容結(jié)束,以下是JDBC進(jìn)階內(nèi)容。和優(yōu)化版JDBC例子。

=====================華麗麗的分割線===========================


由于 篇幅有限,后續(xù)部分請(qǐng)參閱下篇博客。由淺到深學(xué)習(xí)JDBC二

不妥之處懇請(qǐng)讀者批評(píng)指正,共同進(jìn)步。

網(wǎng)站題目:由淺到深學(xué)習(xí)JDBC一
文章出自:http://aaarwkj.com/article38/gihppp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站微信小程序、搜索引擎優(yōu)化、動(dòng)態(tài)網(wǎng)站、做網(wǎng)站、全網(wǎng)營(yíng)銷(xiāo)推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷(xiāo)型網(wǎng)站建設(shè)
五月婷婷六月丁香激情视频| 日韩精品一二三黄色一级| 丝袜美腿蜜汁一龙二凤| 国产精品欧美日韩一区| 国产精品视频一区二区噜| 清纯唯美亚洲自拍第一页 | 色呦呦视频在线免费观看| 一本久道久久综合狠狠老| 久草福利在线观看免费| 亚洲一区二区三区女同| 九九视频精品免费高清视频| 亚洲另类欧美日韩中文字幕| 国产又粗又长又大又长| 久久久久久精品人妻网| 丰满人妻二区三区性色| 成人国产在线欧美精品| 日韩亚洲av在线免费观看| 日韩精品专区中文字幕| 日本乱码一区二区三区在线观看| 亚洲品质自拍在线观看| 成人精品国产一区二区| 国内精品人妻久久毛片| 日韩精品视频在线观看| 一区二区三区日韩电影在线| 午夜神马福利激情视频| av一区二区日韩精品久| 宫部凉花中文字幕在线| 国产男女猛烈无遮挡av| 亚洲激情一区在线观看| 免费观看亚洲视频一区二区三区| 亚洲中文字幕伦理在线| 亚洲精品欧美综合二区| 精品国产精品中文字幕| 国内校园性猛交视频网站| 91伊人久热精品午夜福利| 91麻豆亚洲国产成人久久| 午夜视频免费看一区二区| 日本熟女视频免费观看| 久久国产精品一区免费观看| 日本不卡一区二区视频| 少妇高潮特黄在线观看|