關(guān)于PreparedStatement的setObject作用及說明
PreparedStatement的setObject作用
在了解setObject作用前講解一下PreparedStatement這個(gè)接口,然后循序漸進(jìn)從setXxx()方法講解到setObject。
PreparedStatement
java.sql包中的PreparedStatement接口繼承了Statement接口,PreparedStatement對(duì)象可以防止sql注入,而Statement不能防止sql注入,所以實(shí)際開發(fā)的時(shí)候千萬不要使用Statement。
SQL注入:
比如我的SQL語句為:
select * from user where username =' zhangsan' username ' and password ='password ' ;
其中傳入的參數(shù)為:username(用戶名) 和 password(密碼)。
惡意注入之前的含意是查詢user表的所有字段,匹配條件是username和password跟數(shù)據(jù)表的某條數(shù)據(jù)完全匹配使得條件成立,換言之就是用戶名和密碼必須都為正確的才可以查詢到數(shù)據(jù)。
惡意注入方式一:輸入 username: 隨意 password: ’ or ‘1’='1
select * from user where username ='xxxxx' and password ='xxx' or '1'='1';
and 優(yōu)先級(jí) 執(zhí)行 高于 or
惡意注入方式二、在SQL添加 – 是mysql的注釋 用戶名框:輸入 zhangsan’ 空格–空格 password 隨意輸入即可
select * from user where username ='zhangsan' -- ' and password ='' ;
注意:以上的 zhangsan’ 空格–空格 中的zhangsan是數(shù)據(jù)庫存在的
setObject
setObject就是給JDBC的SQL語句的占位符賦值的,即是下面的“?”
預(yù)編譯的SQL:參數(shù)使用?作為占位符
注意:sql的參數(shù)使用?作為占位符。 如:
select * from user where username = ? and password = ?;
獲取執(zhí)行sql語句的對(duì)象 PreparedStatement Connection.prepareStatement(String sql)
給?賦值:(Xxx代表參數(shù)類型)
- 方法: setXxx(參數(shù)1,參數(shù)2)
- 參數(shù)1:?的位置編號(hào) 從1 開始
- 參數(shù)2:?的值
例如:
setString(1,"one")
就是定義參數(shù)類型為String類型,然后給第一個(gè)?位置上賦值為one。
select * from user where username = 'one' and password = ?;
setInt(2,2)
就是定義參數(shù)類型為Int類型,然后給第二個(gè)?的位置上賦值為2。
select * from user where username = 'one' and password = 2;
注意:setString定義為String類型就只能傳String類型,也就是說定義什么類型就要傳入什么類型。
重點(diǎn)來了
PreparedStatement的setObject的作用和setString的作用是一樣的!
setObject的第一個(gè)參數(shù)是?的位置編號(hào),第二個(gè)參數(shù)是Object類型,因?yàn)樗械念愋湍J(rèn)繼承object,這個(gè)時(shí)候參數(shù)就沒有類型限制,你可以傳入String類型或者Int類型…不需要手動(dòng)設(shè)置傳參類型。
例如:
setObject(1,"one")
就是給第一個(gè)?位置上賦值為String類型的"one"。
select * from user where username = 'one' and password = ?;
setObject(2,2)
就是給第二個(gè)?的位置上賦值為Int類型的2。
select * from user where username = 'one' and password = 2;
JDBC關(guān)于PreparedStatement.setObject的一些細(xì)節(jié)
JDBC中PreparedStatement.setObject(index,Object)方法,
1、index從1開始
2、在插入時(shí)間格式的字段時(shí),此處的Object格式必須是java.sql.Date的對(duì)象
3、Oracle表中date格式可以表示年月日時(shí)分秒
4、從表中取出對(duì)象封裝到JavaBean對(duì)象中,字段類型可以直接為java.util.Date
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解eclipse下創(chuàng)建第一個(gè)spring boot項(xiàng)目
本文詳細(xì)介紹了創(chuàng)建第一個(gè)基于eclipse(eclipse-jee-neon-3-win32-x86_64.zip)+spring boot創(chuàng)建的項(xiàng)目。2017-04-04基于Java寫minio客戶端實(shí)現(xiàn)上傳下載文件
這篇文章主要介紹了基于Java寫minio客戶端實(shí)現(xiàn)上傳下載文件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05Spring+Vue整合UEditor富文本實(shí)現(xiàn)圖片附件上傳的方法
這篇文章主要介紹了Spring+Vue整合UEditor富文本實(shí)現(xiàn)圖片附件上傳的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Java ArrayList中存放引用數(shù)據(jù)類型的方式
這篇文章主要介紹了Java ArrayList中存放引用數(shù)據(jù)類型的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Java數(shù)據(jù)結(jié)構(gòu)之循環(huán)隊(duì)列簡單定義與用法示例
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之循環(huán)隊(duì)列簡單定義與用法,簡要描述了循環(huán)隊(duì)列的概念、原理,并結(jié)合實(shí)例形式分析了java循環(huán)隊(duì)列的定義與使用方法,需要的朋友可以參考下2017-10-10