關(guān)于PreparedStatement的setObject作用及說(shuō)明
PreparedStatement的setObject作用
在了解setObject作用前講解一下PreparedStatement這個(gè)接口,然后循序漸進(jìn)從setXxx()方法講解到setObject。
PreparedStatement
java.sql包中的PreparedStatement接口繼承了Statement接口,PreparedStatement對(duì)象可以防止sql注入,而Statement不能防止sql注入,所以實(shí)際開發(fā)的時(shí)候千萬(wàn)不要使用Statement。
SQL注入:
比如我的SQL語(yǔ)句為:
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ù)庫(kù)存在的
setObject
setObject就是給JDBC的SQL語(yǔ)句的占位符賦值的,即是下面的“?”
預(yù)編譯的SQL:參數(shù)使用?作為占位符
注意:sql的參數(shù)使用?作為占位符。 如:
select * from user where username = ? and password = ?;
獲取執(zhí)行sql語(yǔ)句的對(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類型,也就是說(shuō)定義什么類型就要傳入什么類型。
重點(diǎn)來(lái)了
PreparedStatement的setObject的作用和setString的作用是一樣的!
setObject的第一個(gè)參數(shù)是?的位置編號(hào),第二個(gè)參數(shù)是Object類型,因?yàn)樗械念愋湍J(rèn)繼承object,這個(gè)時(shí)候參數(shù)就沒(méi)有類型限制,你可以傳入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)文章
關(guān)于maven項(xiàng)目引入maven庫(kù)沒(méi)有的jar處理辦法
這篇文章主要介紹了關(guān)于maven項(xiàng)目引入maven庫(kù)沒(méi)有的jar處理辦法,在平時(shí)開發(fā)中,有些jar包是不存在maven中央庫(kù)中的,那么此時(shí)該如何解決才能方便后續(xù)處理呢,需要的朋友可以參考下本文2023-03-03
Spring運(yùn)行時(shí)動(dòng)態(tài)注冊(cè)bean的方法
這篇文章主要介紹了Spring運(yùn)行時(shí)動(dòng)態(tài)注冊(cè)bean的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
mybatis打印的sql日志不寫入到log文件的問(wèn)題及解決
這篇文章主要介紹了mybatis打印的sql日志不寫入到log文件的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Java對(duì)象以Hash結(jié)構(gòu)存入Redis詳解
這篇文章主要介紹了Java對(duì)象以Hash結(jié)構(gòu)存入Redis詳解,和Java中的對(duì)象非常相似,卻不能按照J(rèn)ava對(duì)象的結(jié)構(gòu)直接存儲(chǔ)進(jìn)Redis的hash中,因?yàn)镴ava對(duì)象中的field是可以嵌套的,而Redis的Hash結(jié)構(gòu)不支持嵌套結(jié)構(gòu),需要的朋友可以參考下2023-08-08
java對(duì)接webservice接口的4種方式總結(jié)
因工作需要和一個(gè)Sap相關(guān)系統(tǒng)以WebService的方式進(jìn)行接口聯(lián)調(diào),之前僅聽過(guò)這種技術(shù),但并沒(méi)有實(shí)操過(guò),所以將本次開發(fā)進(jìn)行記錄,這篇文章主要給大家介紹了關(guān)于java對(duì)接webservice接口的4種方式,需要的朋友可以參考下2023-10-10
Java實(shí)現(xiàn)簡(jiǎn)單修改文件名的方法分析
這篇文章主要介紹了Java實(shí)現(xiàn)簡(jiǎn)單修改文件名的方法,結(jié)合具體實(shí)例分析了2種比較常用的java文件名修改方法,需要的朋友可以參考下2017-09-09
collection集合體系與并發(fā)修改異常的解決方法
今天小編就為大家分享一篇關(guān)于collection集合體系與并發(fā)修改異常的解決方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03

