群里面的讨论:关于rowset,mysql,PrepareStatement,Poeaa等

来源:互联网 发布:php分销模块开发步骤 编辑:程序博客网 时间:2024/04/28 07:40

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
  




原创粉丝点击