对于大多数在OO编程里执行insert操作,都要求返回刚插入记录的ID,而这个ID一般是AUTO_INCREMENT,如:
CREATE TABLE tab1 (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(64) NOT NULL,
PRIMARY KEY(id)
)
一般在Statement.executeUpdate执行insert语句时,返回影响的记录条数,就是1。但我们还需要得到ID值,返回给客户程序,刚刚插入的记录的ID(代表这个记录)。一般有几种办法:
1 在执行insert语句后,再执行SELECT @@IDENTITY AS ID 或 select last_insert_id() as id都是一样的。
2 ibatis做法和上面一样
<insert id="insertTab1">
insert into tab1
(name)
values
(#name#)
<selectKey resultClass="int" keyProperty="id" >
SELECT @@IDENTITY AS ID
</selectKey>
</insert>
3 通过Statment返回auto的值
pstmt = conn.prepareStatement("insert ...",Statement.RETURN_GENERATED_KEYS);
pstmt.setString(1, "name");
pstmt.executeUpdate();
rs = pstmt.getGeneratedKeys();
rs.next();
int id = rs.getInt(1);
2009年2月27日星期五
String StringBuffer StringBuilder
String是不可边类型,一旦创建就不能修改,当涉及String和String运算时,会创建多个String对象,有消耗,但不必太在意这点。
StringBuffer是可变类型,可以修改,不会频繁创建对象,并且线程安全,看看源码就知道了,有很多synchronized,在使用性能上要优于String。
StringBuilder和StringBuffer一样,只是少了synchronized,在多线程下不安全,但在使用StringBuilder时,有多少是在多线程下呢?!一般90%以上不在多线程下。推荐使用。
使用的优先顺序StringBuilder > StringBuffer > String
StringBuffer是可变类型,可以修改,不会频繁创建对象,并且线程安全,看看源码就知道了,有很多synchronized,在使用性能上要优于String。
StringBuilder和StringBuffer一样,只是少了synchronized,在多线程下不安全,但在使用StringBuilder时,有多少是在多线程下呢?!一般90%以上不在多线程下。推荐使用。
使用的优先顺序StringBuilder > StringBuffer > String
2009年2月25日星期三
java.net.BindException: Permission denied
在运行serverSocket = new ServerSocket(port);
却报出:java.net.BindException: Permission denied错误,在网上看到一段话,解决自己的疑问
-----------------------------
In UNIX environments port numbers below 1024 are reserved and can be bound or used only by root (superuser). So if the non-root users try to run the application they will receive an error message saying that
"java.net.BindException: Permission Denied"
There are two ways to avoid this exception. One way is to login as root and run the program. The other way is to specify a port greater than 1023
却报出:java.net.BindException: Permission denied错误,在网上看到一段话,解决自己的疑问
-----------------------------
In UNIX environments port numbers below 1024 are reserved and can be bound or used only by root (superuser). So if the non-root users try to run the application they will receive an error message saying that
"java.net.BindException: Permission Denied"
There are two ways to avoid this exception. One way is to login as root and run the program. The other way is to specify a port greater than 1023
2009年2月19日星期四
String replace有问题吗?!
System.out.println("abacae".replaceAll("a", "@"));
System.out.println("abacae".replaceAll("a", "$"));
执行结果:
@b@c@e
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
当替换成$时就出异常,没兴趣再查就String实现,自己实现得了不过就3行代码:
int idx;
while((idx = input.indexOf("a")) != -1){
input= input.substring(0, idx) + "$" +input.substring(idx + 1);
}
System.out.println("abacae".replaceAll("a", "$"));
执行结果:
@b@c@e
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
当替换成$时就出异常,没兴趣再查就String实现,自己实现得了不过就3行代码:
int idx;
while((idx = input.indexOf("a")) != -1){
input= input.substring(0, idx) + "$" +input.substring(idx + 1);
}
2009年2月15日星期日
2009年2月3日星期二
可能不知道我在说什么
紧用于记录,一个小请求流程 或 叫前端框架。并不是在说Command模式,只是记录一个流程。
1. 在action或screen(就是servlet)里
创建一个Command(代表一次请求)对象,信息包括请求的AO对象名、调用AO对象的方法名、和这次请求的参数需要封装(一般用到DO对象)到该Command对象里。
cmd = new CommandSurport("xxxAO", "xxxMethod");
cmd.setParameter();//其实就是放到Map里。
2. 还是在那个action里
在Spring容器中,选择一个CommandDispatcher,其实就是CommandDispatcherLogic(奇怪没有根据Command对象选择)。CommandDispatcher的作用就是把Command分发出去,其实就是执行的开始。
CommandDispatcher.execute(cmd);
3. 在CommandDispatcher.execute里
根据Command对象里的AO名信息从spring里获得(创建)指定AO对象(非单例)。在这里同时使用到spring的BeanPostProcessor(实现类为ApplicationObjectPostProcessor),把command设置到AO对象(其实是AO的父类ActionEvent)里。并把Command对象的参数(在第一步设置的),设置到AO对应的属性上(参看ApplicationObjectPostProcessor类)。
4. 执行AO.execute()
execute方法是在AO的父类ActionEvent里。
根据Command信息后的要调用的方法名如abc(第1步设置的),调用的AO对象的doAbc方法。
这个doAbc就是我们业务要做的。在这个AO对象里,有Command对象(在父类ActionEvent属性里)、和最主要的请求参数已经设置到AO对象的属性上了。有了这些就可以实现我们想要的逻辑。
到此完成,已经很清楚,没有必要有序列图。
逗了一个圈子,在doAbc里根据请求信息,执行业务逻辑。不知道这样做的好处是什么!?
1. 在action或screen(就是servlet)里
创建一个Command(代表一次请求)对象,信息包括请求的AO对象名、调用AO对象的方法名、和这次请求的参数需要封装(一般用到DO对象)到该Command对象里。
cmd = new CommandSurport("xxxAO", "xxxMethod");
cmd.setParameter();//其实就是放到Map里。
2. 还是在那个action里
在Spring容器中,选择一个CommandDispatcher,其实就是CommandDispatcherLogic(奇怪没有根据Command对象选择)。CommandDispatcher的作用就是把Command分发出去,其实就是执行的开始。
CommandDispatcher.execute(cmd);
3. 在CommandDispatcher.execute里
根据Command对象里的AO名信息从spring里获得(创建)指定AO对象(非单例)。在这里同时使用到spring的BeanPostProcessor(实现类为ApplicationObjectPostProcessor),把command设置到AO对象(其实是AO的父类ActionEvent)里。并把Command对象的参数(在第一步设置的),设置到AO对应的属性上(参看ApplicationObjectPostProcessor类)。
4. 执行AO.execute()
execute方法是在AO的父类ActionEvent里。
根据Command信息后的要调用的方法名如abc(第1步设置的),调用的AO对象的doAbc方法。
这个doAbc就是我们业务要做的。在这个AO对象里,有Command对象(在父类ActionEvent属性里)、和最主要的请求参数已经设置到AO对象的属性上了。有了这些就可以实现我们想要的逻辑。
到此完成,已经很清楚,没有必要有序列图。
逗了一个圈子,在doAbc里根据请求信息,执行业务逻辑。不知道这样做的好处是什么!?
自己常用的eclipse快捷键
ctrl + shif + l 快捷键一览。
ctrl + shift + f 格式化代码
ctrl + shift + t 搜索类型
ctrl + shift + r 搜索资源
ctrl + shift + o 导入
ctrl + shift + g 查看对某class的引用
alt + shift + r 改名
ctrl + / 注释和解注
F3 打开类、方法定义
F4 打开类的层次结构视图
F2 调试是显示一些值 和 类方法说明
F5 debug step into(跳进)
F6 debug step over(单步)
F7 debug step return(跳出)
F8 run 到下一个断点
ctrl + m 视图放大、缩小
ctrl + F8 切换视图
ctrl + d 删除当前行
ctrl + shift + f 格式化代码
ctrl + shift + t 搜索类型
ctrl + shift + r 搜索资源
ctrl + shift + o 导入
ctrl + shift + g 查看对某class的引用
alt + shift + r 改名
ctrl + / 注释和解注
F3 打开类、方法定义
F4 打开类的层次结构视图
F2 调试是显示一些值 和 类方法说明
F5 debug step into(跳进)
F6 debug step over(单步)
F7 debug step return(跳出)
F8 run 到下一个断点
ctrl + m 视图放大、缩小
ctrl + F8 切换视图
ctrl + d 删除当前行
订阅:
博文 (Atom)