關(guān)于PreparedStatement的setObject作用及說明
PreparedStatement的setObject作用
在了解setObject作用前講解一下PreparedStatement這個接口,然后循序漸進從setXxx()方法講解到setObject。
PreparedStatement
java.sql包中的PreparedStatement接口繼承了Statement接口,PreparedStatement對象可以防止sql注入,而Statement不能防止sql注入,所以實際開發(fā)的時候千萬不要使用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)先級 執(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語句的對象 PreparedStatement Connection.prepareStatement(String sql)
給?賦值:(Xxx代表參數(shù)類型)
- 方法: setXxx(參數(shù)1,參數(shù)2)
- 參數(shù)1:?的位置編號 從1 開始
- 參數(shù)2:?的值
例如:
setString(1,"one")就是定義參數(shù)類型為String類型,然后給第一個?位置上賦值為one。
select * from user where username = 'one' and password = ?;
setInt(2,2)就是定義參數(shù)類型為Int類型,然后給第二個?的位置上賦值為2。
select * from user where username = 'one' and password = 2;
注意:setString定義為String類型就只能傳String類型,也就是說定義什么類型就要傳入什么類型。
重點來了
PreparedStatement的setObject的作用和setString的作用是一樣的!
setObject的第一個參數(shù)是?的位置編號,第二個參數(shù)是Object類型,因為所有的類型默認繼承object,這個時候參數(shù)就沒有類型限制,你可以傳入String類型或者Int類型…不需要手動設(shè)置傳參類型。
例如:
setObject(1,"one")就是給第一個?位置上賦值為String類型的"one"。
select * from user where username = 'one' and password = ?;
setObject(2,2)就是給第二個?的位置上賦值為Int類型的2。
select * from user where username = 'one' and password = 2;
JDBC關(guān)于PreparedStatement.setObject的一些細節(jié)
JDBC中PreparedStatement.setObject(index,Object)方法,
1、index從1開始
2、在插入時間格式的字段時,此處的Object格式必須是java.sql.Date的對象
3、Oracle表中date格式可以表示年月日時分秒
4、從表中取出對象封裝到JavaBean對象中,字段類型可以直接為java.util.Date
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于maven項目引入maven庫沒有的jar處理辦法
這篇文章主要介紹了關(guān)于maven項目引入maven庫沒有的jar處理辦法,在平時開發(fā)中,有些jar包是不存在maven中央庫中的,那么此時該如何解決才能方便后續(xù)處理呢,需要的朋友可以參考下本文2023-03-03
mybatis打印的sql日志不寫入到log文件的問題及解決
這篇文章主要介紹了mybatis打印的sql日志不寫入到log文件的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
Java對象以Hash結(jié)構(gòu)存入Redis詳解
這篇文章主要介紹了Java對象以Hash結(jié)構(gòu)存入Redis詳解,和Java中的對象非常相似,卻不能按照Java對象的結(jié)構(gòu)直接存儲進Redis的hash中,因為Java對象中的field是可以嵌套的,而Redis的Hash結(jié)構(gòu)不支持嵌套結(jié)構(gòu),需要的朋友可以參考下2023-08-08
java對接webservice接口的4種方式總結(jié)
因工作需要和一個Sap相關(guān)系統(tǒng)以WebService的方式進行接口聯(lián)調(diào),之前僅聽過這種技術(shù),但并沒有實操過,所以將本次開發(fā)進行記錄,這篇文章主要給大家介紹了關(guān)于java對接webservice接口的4種方式,需要的朋友可以參考下2023-10-10
collection集合體系與并發(fā)修改異常的解決方法
今天小編就為大家分享一篇關(guān)于collection集合體系與并發(fā)修改異常的解決方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03

