群裡面的討論:關於rowset,mysql,PrepareStatement,Poeaa等

來源:互聯網
上載者:User

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
  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.