上網瀏覽帖子發現乙個關於sql中的in裡面的引數動態新增的問題。
通常in裡面的引數通過乙個子查詢獲得與該引數相同型別或者可互轉換的型別的乙個字段資訊。實際中經常會用到有個陣列,該陣列的內容正好是作為in裡面的引數列表。通過sql拼接的方式一定能夠實現,即便看起來比較繁瑣。
下面是通過預編譯命令和引數佔位的方式來實現:
string sql = "select urlid, url from f_url where url in(?)";
pstmt = conn.preparestatement(sql);
pstmt.setstring(1, "/index.jsp,/login.jsp");
rs = pstmt.executequery();
上面**的意圖看起來是執行如下sql:
select urlid, url from f_url where url in('/index.jsp','/login.jsp')
實際上是:
select urlid, url from f_url where url in('/index.jsp,/login.jsp')
因此上面的方法是錯誤的!!!
另外preparestatment物件有乙個void setarray (int parameterindex, array x)方法,萬不可因為in裡面的引數是同型別,看起來正好該方法滿足需求,實時上這是對資料庫中陣列型別資料的支援,並不是作為此處使用。
上面就網上看到的一帖問題做個mark。
關於jdbc中sql語句的拼接注意事項:
拼接內容資料型別和資料庫資料型別一致或能夠轉換
單引號和雙引號的匹對使用
內容中避免隱含中文不可見字元,全形字符等
拼接的sql放在資料庫客戶端執行檢驗是否通過(sql除錯方法)
最重要的是:避免sql與**緊密耦合,分離是更好的選擇(可以統一管理)
下面是幾個sql字串拼接的例子:
1.
string ins = "'/index.jsp','/login.jsp'";
string sql = "select urlid, url from f_url where url in(" + ins + ")";
注意到in裡面的引數型別是varchar,因而在拼接的時候引數值需要用單引號(「'」)引住。
2.
string ins = "10,11,12";
string sql = "select urlid, url from f_url where urlid in(" + ins + ")";
注意到in裡面的引數型別是int,因而直接拼接。
3.
stringbuilder sb = new stringbuilder();
string ins = "10,11,12";
關於jdbc中sql語句的注釋:
通常在程式中直接拼寫sql語句的時候很少去寫注釋,原因是sql寫在**裡本身就是一種醜陋的方式。通過檔案或者其它地方讀取sql,然後在程式中執行,這個時候sql中的注釋卻有可能影響到其正確性,主要問題源於sql的換行。
換行符:
1.windows中的換行符是\r\n,
2. linux/unix下的換行符是\n。
下面是在拼接sql中使用注釋的一些例子:
1.「--」 後的內容全部注釋掉
string sql1 = "select urlid, url from f_url --注釋";2.
string sql2 = "select urlid, url from f_url --注釋 \n where urlid > 10";
上面sql注釋內容之後使用了換行。程式實際執行的sql是:
select urlid, url from f_url where urlid > 10";
3.
string sql2 = "select urlid, url from f_url \n --注釋 where urlid <=10";
上面sql中先使用了換行然後「--」注釋後面內容。程式實際執行的sql是:
select urlid, url from f_url
4.
string sql2 = "select urlid, --注釋 url from f_url where urlid > 10 \n or urlid <=10";
上面sql在程式中是無法執行通過的,注釋符「--」破壞了sql語法的正確性。需要在注釋內容之後新增換行符才能保證sql正確。
通過上面4個例子,很容易發現注釋特徵。含有注釋的sql語句要想在程式中正常執行需要保證注釋內容不破壞sql語句語法的正確性,保證了sql的語法正確性之後需要保證注釋不能改變sql原本期望的命令內容。
簡單明瞭就是保證注釋後面有換行。
注釋破壞sql通常來自程式從外部讀取sql的時候,去除掉了原本的換行,使得整個內容變為一行。比如:乙個sql指令碼檔案其中有多行,在讀取其內容的時候使之變為一行,這時候其中的注釋內容將影響到sql在程式中的執行。
JDBC執行SQL語句
一.執行sql語句 使用preparedstatement,由preparedstatement建立,preparedstatement物件用於傳送帶有乙個或多個輸入引數的sql語句,執行語句時,輸入引數將被送到資料庫中。preparedstatement的例項擴充套件了statement,因此它們...
SQL語句注釋的妙用
mysql裡面的sql語句,裡面是可以加注釋的 例如 select from author where authorid 1 可以寫成 get a author select from author where authorid 1 照樣可以正常執行。有人說,這有鳥用啊?那好看下面 1 在php裡面...
利用sql語句新增字段注釋
sql server中如何用sql語句給表的字段加注釋 關於注釋這個問題,之前沒用sql語句去新增過,都是在enterprise manager裡面新增的 查了一下資料,得知microsoft在sql server 2000中引入了擴充套件屬性,使用者可在各種資料庫物件上定義這些屬性。這些擴充套件屬...