自己平时一直会有制定计划的习惯,平时可能会使用notepad或者xls,但是总觉得这样管理起来比较的混乱。考虑到这方面,自己动手做了一个任务管理的小软件,这个软件现在功能还是很简单,我想慢慢的根据需求来完善它。考虑到可能和我有同样习惯的人会比较多,我会在何时的适合部署在某个PaaS和大家一起使用。
这篇文章是我在做这个项目的时候,碰到的一些mysql相关的问题。记录一下,以便自己以后查找,也方便和我有相同问题的人。
在我这个项目中,因为我不仅仅要存放日期信息,我也要存放时间的信息,如2012-12-27 14:45:00,所以我选择了mysql中的timestamp,在java中,我对应选择了java.sql.Timestamp。这样的对应关系,已经能都满足我的要求。
PreparedStatement中并不支持 in 的语句。下面两个资料是我在查的时候发现的,大家可以参考一下:
在我们程序中,我使用的是第二篇文章中的方法。
类似这样的一段mysql
delete from task where code in(5, 6, 7);
我们可以先构造
String sql = "delete from task where code in (%s)";
然后我们使用preparePlaceHolders函数,替换上面sql字符串中的%s,把%s替换成相应个数的?。
public static String preparePlaceHolders(int length) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < length;) {
builder.append("?");
if (++i < length) {
builder.append(",");
}
}
return builder.toString();
}
在我们sql改造成带有?的sql之后,我们就能使用这个sql构造成一个preparedstatement对象,构造好之后,我们要做的就是向PreparedStatement中设置相应的值了,使用setValues方法。
public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException {
for (int i = 0; i < values.length; i++) {
preparedStatement.setObject(i + 1, values[i]);
}
}
下面的代码是我待用上面两个方法的简单代码,希望对大家有用
public void deleteSimpleTasks(List simpleTaskCodes)
throws ClassNotFoundException, SQLException {
Connection conn = DBHelper.getConnection();
String sql = "delete from task where code in (%s)";
sql = String.format(sql, DBHelper.preparePlaceHolders(simpleTaskCodes
.size()));
try {
PreparedStatement ps = conn.prepareStatement(sql);
DBHelper.setValues(ps, simpleTaskCodes.toArray());
ps.executeUpdate();
ps.close();
} catch (SQLException e) {
// TODO log
throw e;
}
DBHelper.close(conn);
}
我这里要生成一段序列,是为了在存放附件时候使用的一种策略。在我生成每一个task entity的时候,我就会为这个task entity分配一个值,这个值是用来索引这个task对应的attachment的。如果这个值是10000,后面如果为这个task上传一个附件,附件的标号是attachment_123,那我只要在表中存放(10000, attachment_123),这样我就能表示task中有attachment_123这个附件了。(大家有没有更好的方法,欢迎交流)
我生成一个升序的序列,是为这些服务的。因为mysql中有auto_increment这样的一种机制,所以我建立了这样的一张表:
create table sequence (
code int(12) auto_increment primary key,
temp char(1)
);
每当我插入一个temp的时候,code这个值就会变大,这个就是我实现和oracle中sequence的方法。我不清楚是不是temp这个是多余的,有没有更好的方法。
在上面中,提到我是使用auto_increment的方法实现和Oracle中类似的sequence的功能,但是我们怎么能取得这个自动增加的值呢?下面的材料是我在找资料的时候找到的,希望对大家有所帮助:
里面提到的方法就是我使用的方法,文章讲的很详细了,我这里就不再介绍了。如有疑问,大家可以留言。
设置初始值的方法也很简答,直接上代码:
create table sequence (
code int(12) auto_increment primary key,
temp char(1)
)AUTO_INCREMENT = 3; 3就是我们设置的初始值。