2007-03-25

java.sql.SQLException: java.lang.NegativeArraySizeException

有段java程序, 通过jdbc调用mysql的
在执行分页查询的时候, 如果是这么写:
select * from orders limit 1, 30;//第一页的30条
没有任何问题.但是把它放到存储过程里(参见前一篇文章), 就会出那个exception,只要是页不满的情况都会报exception.但是有个特别的现象, 如果你把orders表清空, 然后执行java, 不会报错, 只有当行数大于某个值并且页不满才会报Exception.

非常不明白....
相对详细的代码在这:link

2007-03-24

myeclipse差劲

除了它集成的那几个Eclipse Foundation的项目外, 基本上都很差.
特别是UML, 当初看着感觉还不错, 用着问题就出来了: 不能识别泛型, 不能导入类, 删除类/关系删不干净, 生成的代码错误百出.最要命的是它还搞罢工, 本来就是serialize的object, 出点问题就死翘翘了.慎用....非常不稳定

mysql的分页存储过程

一般的分页面可以这样直接写在sql里面:

select * from test limit 3, 20;

表示每页显示20个, 第3页.这种写法不能通过PreparedStatement执行, 因为它是编译过的, 存储过程同理.所以这样写不会成功:

create procedure pager (in pno int, in psize int)
begin
declare pp int default 0;
set pp = (pno - 1) * psize;
select * from pager limit pp, psize;
end

应该算是mysql的bug.

有个折衷的办法:

create procedure pager (in _pno int, in _psize int)
begin
prepare stmt from "select * from test limit ?,?";
set @pno = (_pno - 1) * _psize;
set @psize = _psize;
execute stmt using @pno, @psize;
end

link, link

2007-03-22

autoboxing的bug么?

碰到这么个问题:

Double d = null;
double e = d;
System.out.println(e);

这会出问题, d不能自动autounboxing为double.会报nullPointer异常.
所以在做ibatis映射的时候, bean的属性需要是Double类型的.否则会有不必要的问题.
失望....

2007-03-15

dbdesigner不能连mysql的问题.

dbdesigner连mysql老报错:
cannot connect to mysql : invalid username/password

把password在mysql中更新一下就好了:
mysql> set password for 'root'@'localhost' =OLD_PASSWORD('newpassword');
一个与老版本兼容的问题, link

2007-03-13

目前Ajax主要存在的问题

  • Accessibility问题。
  • 主要开源框架(prototype和dojo)文档不足。
  • 缺乏好的跨域机制。XMLHttpRequest不行,Doug Crockford的JSONRequest不错,但是很难被微软采纳。
  • 跨浏览器编程仍然非常麻烦。
  • 对Comet (HTTP Streaming) 的重要性仍然认识不足。

2007-03-09

全排列算法

题目大致是这样滴:
有1, 2, 2, 3, 4, 5, 这六个字符, 打印出它们的所有排列顺序.
想了老半天, 结果就是这样滴:

public class SnippetTest
{
private void perm(char[] a, boolean[] f, String r)
{
for(int i = 0; i < f.length; i++)
{
if(!f[i])
{
f[i] = true;
if(r.length() == 5)System.out.println(r + a[i]);
perm(a, f, r + a[i]);
f[i] = false;
}
}
}

public static void main(String[] args)
{
char[] a = new char[]{'1', '2', '2', '3', '4', '5'};
boolean[] f = new boolean[6];//default is false
String r = "";
new SnippetTest().perm(a, f, r);
}
}

嗯....相当简洁的说.而且也是可以扩展的, 赞自己一个, 太TNND牛了