做insert操作时,可能在保存之前要判断用户输入的某个数据是否在数据库中唯一存在,是否与其他数据重复。这里重点记录sql语句以及service如何实现。
1、错误示范
service层:
selMap =commDAO.selectOne(KFSGL + "KFSDM_Q", paramsMap);
dao层:
<!-- 查询是否存在相同的开发商代码-->
<select id="KFSDM_Q" parameterType="hashmap" resultType="hashmap">
select 1 as count from dual where exists
select if from Fw_sypt_kfsjlb where kfsdm=#{KFSDM}
</select>
错误原因:
1、当用户输入的开发商代码重复时,sql语句得到的count=1,此时结果与预期相同,用户无法保存。
2、当用户输入的开发商代码不重复时,sql语句得到的count=null,此时没有返回结果,selectOne()查询出错,抛出异常,导致可以保存的数据无法保存。原因是:selectOne必须返回一条结果。而使用select()查询时,也会抛出异常,并且select的返回值是List,不好进行转换;selectOne的返回值类型是Map,比较好进行转换。
2、正确做法
service层:
selMap =commDAO.selectOne(KFSGL + "KFSDM_Q", paramsMap);
dao层:
<!-- 查询是否存在相同的开发商代码-->
<select id="KFSDM_Q" parameterType="hashmap" resultType="hashmap">
select count(id) as count from Fw_sypt_kfsjlb where kfsdm=#{KFSDM}
</select>
原理:保证一定有返回值,用到count()函数