
继续TestLinkJ中keywords服务接口的话题。
在keywords表中,'id' 是主键,并且在定义中有auto_increment,表明其是自增主键。
CREATE TABLE /*prefix*/keywords (
`id` int(10) unsigned NOT NULL auto_increment,
`keyword` varchar(100) NOT NULL default '',
`testproject_id` int(10) unsigned NOT NULL default '0',
`notes` text,
PRIMARY KEY (`id`),
KEY /*prefix*/testproject_id (`testproject_id`),
KEY /*prefix*/keyword (`keyword`),
UNIQUE KEY /*prefix*/keyword_testproject_id (`keyword`,`testproject_id`)
) DEFAULT CHARSET=utf8;
在KeywordsService接口中,定义了createKeywords(Keywords keywords)这样一个方法,用以新增一个关键字。
@Service
public class KeywordsServiceImpl implements KeywordsService {
@Autowired
private KeywordsMapper keywordsMapper;
@Override
public Integer createKeywords(Keywords keywords) {
return keywordsMapper.insert(keywords);
}
}
这里就存在一个问题,假设我们目前最大的id是100,如果我们给系统新增如下一个关键字
Keywords keywords=Keywords.builder().id(666).keyword("tester").testproject_id(333).notes("tester").build();
那么系统的id的最大值从100迁跃到了666。这时候如果我们delete掉所有记录,并重新将备份的数据插入,会发现无法插入,因为这时候数据库中下一个值为667。
因此,我们得让系统在插入关键字时,获取到系统当前的id最大值,然后将其作为该条拟插入数据的id,以防止跳号。
<!-- 先查询自增主键值 -->
<insert id="insert" parameterType="com.testlink4j.domain.Keywords">
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into keywords (id, keyword, testproject_id,
notes)
values (#{id,jdbcType=INTEGER}, #{keyword,jdbcType=VARCHAR}, #{testproject_id,jdbcType=INTEGER},
#{notes,jdbcType=LONGVARCHAR})
</insert>
这样,就能解决数据库中自增ID的问题了。