HongSoft(26929885) 16:51:26
String sql = "SELECT * FROM resource_files where fileform=?";
Connection conn = null; PreparedStatement stmt = null;
try {
if (sql != null && sql.indexOf(T_CORE_USER) >= 0)
conn = DBFactory.getDBTCoreUser().getConn();
else
conn = getConn();
stmt = conn.prepareStatement(sql);
stmt.setString(1,"jpg");
ResultSet srs=stmt.executeQuery(sql);
做一個測試,連這個都不成功,大家瞄一下,有什麼問題?
HongSoft(26929885) 16:51:56
Exception in thread "main" java.sql.SQLException: Syntax error or access violation: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1
壯士(455196) 16:51:12
看起來似乎沒問題
HongSoft(26929885) 16:54:33
是啊,就在同一個函數裡面,用
String sql = "SELECT * FROM resource_files where fileform='"+"jpg"+"'";
就成功了
cyt(53238) 16:52:04
mysql沒有 ?的吧?
HongSoft(26929885) 16:54:47
?真的沒有?
壯士(455196) 16:52:22
這個和驅動有關係
cyt(53238) 16:52:44
mysql 本身就一定沒有,驅動嘛,就不清楚了
jackyrong(1809772) 16:52:47
mysql裡用不了?這樣的,的確
美了巴滋兒(37263) 16:52:48
對,跟驅動程式有關
壯士(455196) 16:52:49
正常情況下,?是會被替換成'JPG'的
jackyrong(1809772) 16:53:18
哦?有可以的驅動?
壯士(455196) 16:53:15
?是preparedstatement的一個預置符號而已啊
HongSoft(26929885) 16:56:11
mysql不能用preparedstatement嗎?難道?
壯士(455196) 16:53:58
。。。怎麼可能,你換個驅動試試
cyt(53238) 16:53:59
至少我自己寫的是用 :param這種形式,不是?的。
mysql 沒有preparestatement的
壯士(455196) 16:54:06
java ?
HongSoft(26929885) 16:56:42
對
壯士(455196) 16:54:12
jdbc都是用?的啊
cyt(53238) 16:54:15
不信你找找mysql api
美了巴滋兒(37263) 16:54:40
這根mysql api沒關係。。。
壯士(455196) 16:54:45
是啊。。
cyt(53238) 16:55:13
jdbc也要依靠mysql api的
jackyrong(1809772) 16:55:55
用MYSQL的傳統驅動,以前試過的確不行
cyt(53238) 16:56:31
要自己做一些額外的parse的
HongSoft(26929885) 17:00:03
我的driver的版本夠高了,。。。
HongSoft(26929885) 17:00:24
怎麼mysql連這個都不支援啊?我searhc一下。。
cyt(53238) 17:00:04
100個放心,mysql一定是不支援的,以後的版本就難說,呵呵。driver就要選了,你問問壯士現在用的是什麼driver?
HongSoft(26929885) 17:05:06
壯士應該現在不是用的
ysql
HongSoft(26929885) 17:05:45
我以前大都用的oracle,難怪現在的系統不用preperastatmet,原來mysql不支援。。。
HongSoft(26929885) 17:06:08
害我測了半天rowset / resultset的效能比較。。
HongSoft(26929885) 17:08:20
發現一個問題: getConn在有cp的情況下,1ms都不需要。很快。
cyt(53238) 17:07:34
其實慢就是慢在socket的connect的時候,要網域名稱解釋和3次握手
cyt(53238) 17:08:20
所以一般串連池效率這方面效率不會差很遠,倒是裡面的串連策略會在其他方面有些影響
HongSoft(26929885) 17:12:12
的確是的。所以,我們的系統是一個usecase用了多個串連(當然,是不考慮事務的情況下)
HongSoft(26929885) 17:12:32
多次connec(),好象也挺快的
HongSoft(26929885) 17:13:11
因為用的rowset,所以connect也很快relaese了,也不會對串連數產生影響
cyt(53238) 17:11:41
不過rowset好像也不是所有資料庫支援吧?
HongSoft(26929885) 17:15:06
是嗎?應該是jdbc2.0後才有的
cyt(53238) 17:13:26
我也不清楚,呵呵,哪個高手出來解釋一下
HongSoft(26929885) 17:17:03
然後我就看了一下,rowset的所謂的斷接的特性,好象用處並不太大
david.turing(10508778) 17:14:35
sql.rowset不是JDK的SPI來的嗎?誰敢不支援?
HongSoft(26929885) 17:18:19
以前是沒有的
HongSoft(26929885) 17:18:52
後來成了SPI,SUN也做了一個實現
david.turing(10508778) 17:17:52
哦,你連前因後果都知道
HongSoft(26929885) 17:21:08
只是瞭解
HongSoft(26929885) 17:21:31
為什麼說斷接的特性用處不大呢?
HongSoft(26929885) 17:21:39
是有原因的
HongSoft(26929885) 17:22:22
這裡先插一句: POEAA裡面提到了rowset,說對我們的架構模式能產生很大的影響。。
HongSoft(26929885) 17:24:27
如果要用斷接特性:唯一的地方是在select 返回CachedRowSet之後,繼續使用它(並且是在conn.close())之後。
HongSoft(26929885) 17:24:55
但這樣使用對代碼的可讀性影響太大了,很醜。
HongSoft(26929885) 17:25:11
其他的update/insert/delete沒有什麼影響
HongSoft(26929885) 17:26:28
還提一下,用Prestatement可以對系統的效能和安全性產生很大的正面影響。我們的系統就碰到了這樣的問題。
HongSoft(26929885) 17:27:30
POEAA裡面提到了rowset,我認為它可以非常方便的幫我們使用DDD,但POEAA說的卻是TableModel,現在還在不理解之中。
david.turing(10508778) 17:26:40
PrepareStatement有什麼安全性問題?
HongSoft(26929885) 17:30:32
我說的是“正面影響”,是指用statemenet會有問題
david.turing(10508778) 17:28:46
同意。
HongSoft(26929885) 17:32:44
我們現在用的mysql,只能用statement,在所有的sql中的string都必須用這個方法進行轉化:
HongSoft(26929885) 17:32:52
// 對字串進行編碼,以傳入sql語句
public static String encodeToSQLString(String s){
if(s == null)
return null;
return s.replaceAll("////", "////////")
.replaceAll("/r", "////r")
.replaceAll("/n", "////n")
.replaceAll("/t", "////t")
.replaceAll("/b", "////b")
.replaceAll("///'", "/////'")
.replaceAll("///"", "/////"")
;
}
HongSoft(26929885) 17:33:32
否則別人可以sql inject
一夜沒睡好(5315916) 17:31:36
我的作業系統是winxp,office是2003,開啟word文檔時,其中圖片及目錄為亂碼?不知是什麼原因
HongSoft(26929885) 17:34:16
我試的時候,drop掉了一個論壇的資料庫
david.turing(10508778) 17:31:48
恩,聰明的方法。
一夜沒睡好(5315916) 17:31:59
是不是winxp中不能安裝office2003
HongSoft(26929885) 17:34:44
這個方法也是PrepareStatement的方法
HongSoft(26929885) 17:34:55
我們借用它的方法
cyt(53238) 17:32:33
mysql api本身提供一個函數專門做這種轉換的,呵呵,不知道轉到JDBC裡面會怎麼樣子了
david.turing(10508778) 17:32:57
能share以下這個模組?
HongSoft(26929885) 17:35:40
是嗎?你說的api是c層級的API吧?
HongSoft(26929885) 17:35:45
什麼模組?
HongSoft(26929885) 17:36:05
method不都有了嗎?
david.turing(10508778) 17:33:51
直接insert sql很困難,如果你做了轉型。
HongSoft(26929885) 17:36:46
現在做了這個應該是沒有問題了:)
david.turing(10508778) 17:34:58
恩,其實沒什麼的,單用jsp語義可以防止injection的
HongSoft(26929885) 17:37:51
怎麼做呢?輸入檢查?
david.turing(10508778) 17:36:56
將注釋嵌入到可能產生SQL的語句,防止產生正確文法sql.
david.turing(10508778) 17:38:20
後台對;進行分析,防止SQL串聯。
HongSoft(26929885) 17:42:23
哦
cyt(53238) 17:39:58
unsigned long STDCALL mysql_escape_string(char *to,const char *from,
unsigned long from_length);
david.turing(10508778) 17:42:09
cyt這個是最簡單的了,呵呵~
cyt(53238) 17:42:45
其實JDBC應該提供一個類似的函數才對
cyt(53238) 17:43:04
例如oracle的escape方式和mysql是不一樣的
david.turing(10508778) 17:44:07
好主意,不過這個世界上的資料庫太多,有幾百個。
cyt(53238) 17:44:48
標準嘛,JDBC還不是要照顧到了這幾百種資料庫
cyt(53238) 17:45:48
意思是ODBC/JDBC的標準裡面要增加這一條
david.turing(10508778) 17:46:58
為了sql injection加入一個SPI,hongsoft太有面子了。
cyt(53238) 17:47:33