我正在做一些基于Freemarker + Spring + MyBatis + Oracle的Web开发。现在我面临一个非常简单但很难的问题,就是如何处理不同类型的'NULL':
例如,一张表存储了许多学生的信息,学生一行包括他的姓名,班级编号和老师(我们假设他只有一位老师)。
NULL 1 :我们想找到三年级的学生,所以我们的查询条件变为{class_number ='3'}。在这种情况下,我们的查询变为:
从student_table中选择s *,其中class_number ='3'
MyBatis配置文件可以是这样的:
<select id="selectStudents" parameterType="map" resultType="map">
select * from student_table a where 1=1
<if test="class_number!= null">
and a.CLASS_NUMBER= #{product_name,jdbcType=VARCHAR}
</if>
<if test="teacher_name!= null">
and a.TEACHER_NAME= #{teacher_name,jdbcType=VARCHAR}
</if>
</select>
是的,这是我们想要的。
NULL 2 :由于历史原因,某些行的teacher_name为空,这意味着该学生的老师不详。我们想找到这些老师未知的学生。显然,xml文件以上不能满足我们的要求。我们应该这样修改:
<select id="selectStudents" parameterType="map" resultType="map">
select * from student_table a where 1=1
<choose>
<when test="class_number!=null && ques_type!=''">
and a.CLASS_NUMBER= #{class_number,jdbcType=VARCHAR}
</when>
<otherwise>
and a.CLASS_NUMBER is null
</otherwise>
</choose>
<choose>
<when test="class_number!=null && ques_type!=''">
and a.TEACHER_NAME= #{teacher_name,jdbcType=VARCHAR}
</when>
<otherwise>
and a.TEACHER_NAME is null
</otherwise>
</choose>
</select>
如果我们在单个系统中同时具有两个查询要求,我该怎么办?