Taskmanagement 之 mysql(一)

  自己平时一直会有制定计划的习惯,平时可能会使用notepad或者xls,但是总觉得这样管理起来比较的混乱。考虑到这方面,自己动手做了一个任务管理的小软件,这个软件现在功能还是很简单,我想慢慢的根据需求来完善它。考虑到可能和我有同样习惯的人会比较多,我会在何时的适合部署在某个PaaS和大家一起使用。

  这篇文章是我在做这个项目的时候,碰到的一些mysql相关的问题。记录一下,以便自己以后查找,也方便和我有相同问题的人。

  1. mysql中的时间存放和Java中的对应
  2. 当我们使用PreparedStatement的时候,如果sql中有 in 语句的解决方法
  3. 类似Oracle中的sequence,在mysql中的实现方法(这个是我自己想法,大家看看是不是合适,如果大家有其他办法,欢迎一起交流
  4. 在我们使用mysql的时候,我们可能使用到auto_increment,我们去的插入后产生的auto_increment的方法,以及设置初始值的方法


  在我这个项目中,因为我不仅仅要存放日期信息,我也要存放时间的信息,如2012-12-27 14:45:00,所以我选择了mysql中的timestamp,在java中,我对应选择了java.sql.Timestamp。这样的对应关系,已经能都满足我的要求。

PreparedStatement中并不支持 in 的语句。下面两个资料是我在查的时候发现的,大家可以参考一下:

http://www.javaranch.com/journal/200510/Journal200510.jsp#a2

http://www.cnblogs.com/fanstatic/archive/2011/08/02/2125003.html

在我们程序中,我使用的是第二篇文章中的方法。

类似这样的一段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<Integer> 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的功能,但是我们怎么能取得这个自动增加的值呢?下面的材料是我在找资料的时候找到的,希望对大家有所帮助:

MySQL获取Auto_increment字段刚插入的值

里面提到的方法就是我使用的方法,文章讲的很详细了,我这里就不再介绍了。如有疑问,大家可以留言。

设置初始值的方法也很简答,直接上代码:

create table sequence (
	code int(12) auto_increment primary key,
	temp char(1)
)AUTO_INCREMENT = 3;

3就是我们设置的初始值。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值