management 和 mysql_Taskmanagement 之 mysql(一)

自己平时一直会有制定计划的习惯,平时可能会使用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就是我们设置的初始值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值