项目需求

现有一张u_ps的车位信息表,对应每个小区的车位id ps_id自增长,每个车位又对应车位编号num,车位id由自增长,车位编号可以根据自己小区情况手动添加设置,但是不能重复,车位编号不能重复。这就需要在新增车位信息的时候代码检验新增的该numu_ps表中是否存在,存在则抛出异常,不存在则做插入操作。

问题关键

不同的小区community_id中车位num可以重复,如果分开设计表设置唯一约束是可行的,但是我们的需求是将所有的小区车位信息放在同一个表中,这就涉及到在插入一条数据的时候需要判断是否是同一小区id,在community_id相同的情况下num不能重复。

1、表分开时,对字段设置约束

我们的主键为车位id ps_id,我们的思路是当插入一条数据,先查询车位信息表,遍历新的数据中的num是否存在,或者说新增的num在表中是否为空,是则抛出异常,否则执行插入操作。 这是代码逻辑。

在sql中最直接的方法就是设置唯一索引(这跟主键并不冲突)

mysql查询某个字段重复的数量 mysql查询多个字段重复数据_字段


选中num

mysql查询某个字段重复的数量 mysql查询多个字段重复数据_mysql查询某个字段重复的数量_02


点击索引

mysql查询某个字段重复的数量 mysql查询多个字段重复数据_java_03


mysql查询某个字段重复的数量 mysql查询多个字段重复数据_mysql_04


这样就将num字段设置为唯一索引

在项目xml文件中设置插入语句

mysql查询某个字段重复的数量 mysql查询多个字段重复数据_数据库_05


insert ignore into 语句是针对主键(唯一索引)字段的情况下做判断是否有重复的字段值,如果有则忽略本次操作抛出异常(try{}catch(){}),没有则执行插入操作。

2、所有操作在同一张表中

我们在不修改sql的情况下利用代码逻辑来实现

sql语句是最基本的插入语句:

mysql查询某个字段重复的数量 mysql查询多个字段重复数据_java_06


代码逻辑:

mysql查询某个字段重复的数量 mysql查询多个字段重复数据_数据库_07


解析代码:

new一个新的Ps(车位信息类)bean对象,将我们插入的数据中的community_id和num放进listps对象中,对listps 执行sqlSession查询操作并放进list集合中,再对该查询结果集中的两个字段进行判空,如果为空说明该表中没有该字段的值,则进行插入操作,如果不为空则抛出异常并且在catch中再次抛出异常ServiceException e,这里设置两次catch,ServiceException e是为了返回给前端我们车位编号重复的异常,如果不设置的话前端只会收到异常信息

StringUtilMycc为我们设置的工具类,该类下的isEmpty方法为判空操作。

注意:判空时还需要保证传递的该字段的值不能为空,如果只判断表中数据是否为空的话最后的测试结果指挥报空指针!!!这是我的工具类下的isEmpty方法:

mysql查询某个字段重复的数量 mysql查询多个字段重复数据_数据库_08


mysql查询某个字段重复的数量 mysql查询多个字段重复数据_数据库_09


注:框架改动、配置问题等不同无法做到同步,仅作为一个思路参考