背景
疫情期间,有一个老项目要从oracle迁移到MySQL, 其中碰到了一些坑,在此做个记录和大家分享一下
sequence 变 自增id
老项目中oracle主键id都是使用sequence,在mysql中自然得使用自增主键,这块主要朋友的问题是,在老项目中使用的dao层框架是springJdbc,再插入数据库中,有时需要返回插入的主键ID,oracle数据库一般都是,先查询nextval().再执行插入数据,在mysql中则不行,在springJdbc中使用KeyHolder,可以返回自增id。
oralce返回主键id代码
id = jdbcTemplate.queryForObject("SELECT SEQ_TABLE.NEXTVAL FROM DUAL",Long.class);
mysql返回主键ID代码
springjdbc通过keyHolder返回数据id
KeyHolder keyHolder = new GeneratedKeyHolder();
final String sql = "INSERT INTO TTABLEFO(PROVINCECODE,FILESEQ,VENDORCODE,FILEVERSION," +
"FILELENGTH,FILETIME,KEYINDEX,EXTENSION1,EXTENSION2,CREATE_TIME) VALUES(?,?,?,?,?,?,?,?,?,now())";
Object [] args = { file.getPROVINCECODE(), file.getFILESEQ(), file.getVENDORCODE(),file.getFILEVERSION(),
flag = jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection conn)
throws SQLException {
PreparedStatement prepareStatement = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
prepareStatement.setString(1, file.getPROVINCECODE());
prepareStatement.setLong(2, file.getFILESEQ());
prepareStatement.setString(3, file.getVENDORCODE());
return prepareStatement;
}
},keyHolder);
Long id = keyHolder.getKey().intValue();
涉及到时间函数的改造
oralce 涉及到时间一般都都使用sysdate,mysql中一般使用sysdate()/now()
oracle代码
insert into t_bis_agentit(staffid,verifytime,inserttime) values (?,?,sysdate)
mysql代码
now()
递归关键字connect by
oracle支持递归查询,而mysql根本没有类似的关键字,所以在查询中只能通过代码去实现递归查询
oracle代码