调用接口方法,和获取自动生成key
StudentEntity entity = new StudentEntity();entity.setStudentName("黎明你好");entity.setStudentSex(1);entity.setStudentBirthday(DateUtil.parse("1985-05-28"));entity.setClassId("20000001");entity.setPlaceId("70000001");this.dynamicSqlMapper.createStudentAutoKey(entity);System.out.println("新增学生ID: " + entity.getStudentId());
if标签if标签可用在许多类型的sql语句中,我们以查询为例 。首先看一个很普通的查询:
<!-- 查询学生list,like姓名 --><select id="getStudentListLikeName" parameterType="StudentEntity" resultMap="studentResultMap">SELECT * from STUDENT_TBL STWHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')</select>
但是此时如果studentName为null,此语句很可能报错或查询结果为空 。此时我们使用if动态sql语句先进行判断,如果值为null或等于空字符串,我们就不进行此条件的判断,增加灵活性 。
参数为实体类StudentEntity 。将实体类中所有的属性均进行判断,如果不为空则执行判断条件 。
<!-- 2 if(判断参数) - 将实体类不为空的属性作为where条件 --><select id="getStudentList_if" resultMap="resultMap_studentEntity" parameterType="liming.student.manager.data.model.StudentEntity">SELECT ST.STUDENT_ID,ST.STUDENT_NAME,ST.STUDENT_SEX,ST.STUDENT_BIRTHDAY,ST.STUDENT_PHOTO,ST.CLASS_ID,ST.PLACE_IDFROM STUDENT_TBL STWHERE<if test="studentName !=null ">ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName, jdbcType=VARCHAR}),'%')</if><if test="studentSex != null and studentSex != '' ">AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}</if><if test="studentBirthday != null ">AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}</if><if test="classId != null and classId!= '' ">AND ST.CLASS_ID = #{classId, jdbcType=VARCHAR}</if><if test="classEntity != null and classEntity.classId !=null and classEntity.classId !=' ' ">AND ST.CLASS_ID = #{classEntity.classId, jdbcType=VARCHAR}</if><if test="placeId != null and placeId != '' ">AND ST.PLACE_ID = #{placeId, jdbcType=VARCHAR}</if><if test="placeEntity != null and placeEntity.placeId != null and placeEntity.placeId != '' ">AND ST.PLACE_ID = #{placeEntity.placeId, jdbcType=VARCHAR}</if><if test="studentId != null and studentId != '' ">AND ST.STUDENT_ID = #{studentId, jdbcType=VARCHAR}</if></select>
使用时比较灵活, new一个这样的实体类,我们需要限制那个条件,只需要附上相应的值就会where这个条件,相反不去赋值就可以不在where中判断 。
public void select_test_2_1() {StudentEntity entity = new StudentEntity();entity.setStudentName("");entity.setStudentSex(1);entity.setStudentBirthday(DateUtil.parse("1985-05-28"));entity.setClassId("20000001");//entity.setPlaceId("70000001");List<StudentEntity> list = this.dynamicSqlMapper.getStudentList_if(entity);for (StudentEntity e : list) {System.out.println(e.toString());}}
if + where 的条件判断当where中的条件使用的if标签较多时,这样的组合可能会导致错误 。我们以在3.1中的查询语句为例子,当java代码按如下方法调用时:
@Testpublic void select_test_2_1() {StudentEntity entity = new StudentEntity();entity.setStudentName(null);entity.setStudentSex(1);List<StudentEntity> list = this.dynamicSqlMapper.getStudentList_if(entity);for (StudentEntity e : list) {System.out.println(e.toString());}}
如果上面例子,参数studentName为null,将不会进行STUDENT_NAME列的判断,则会直接导“WHERE AND”关键字多余的错误SQL 。这时我们可以使用where动态语句来解决 。这个“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’ 。此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉 。上面例子修改为:
<!-- 3 select - where/if(判断参数) - 将实体类不为空的属性作为where条件 --><select id="getStudentList_whereIf" resultMap="resultMap_studentEntity" parameterType="liming.student.manager.data.model.StudentEntity">SELECT ST.STUDENT_ID,ST.STUDENT_NAME,ST.STUDENT_SEX,ST.STUDENT_BIRTHDAY,ST.STUDENT_PHOTO,ST.CLASS_ID,ST.PLACE_IDFROM STUDENT_TBL ST<where><if test="studentName !=null ">ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName, jdbcType=VARCHAR}),'%')</if><if test="studentSex != null and studentSex != '' ">AND ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER}</if><if test="studentBirthday != null ">AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE}</if><if test="classId != null and classId!= '' ">AND ST.CLASS_ID = #{classId, jdbcType=VARCHAR}</if><if test="classEntity != null and classEntity.classId !=null and classEntity.classId !=' ' ">AND ST.CLASS_ID = #{classEntity.classId, jdbcType=VARCHAR}</if><if test="placeId != null and placeId != '' ">AND ST.PLACE_ID = #{placeId, jdbcType=VARCHAR}</if><if test="placeEntity != null and placeEntity.placeId != null and placeEntity.placeId != '' ">AND ST.PLACE_ID = #{placeEntity.placeId, jdbcType=VARCHAR}</if><if test="studentId != null and studentId != '' ">AND ST.STUDENT_ID = #{studentId, jdbcType=VARCHAR}</if></where></select>
推荐阅读
- 七个对 Web 开发人员有用的资源
- 你必须知道的常用的足够简练的 11 个 Python代码
- 译文 面向 Web 开发人员的 50 多个 ChatGPT 提示
- Linux初学者在学习中常见的困惑
- C#控制台程序如何创建不需要IIS托管的HTTP Rest API
- JavaScript 的 Anti-Debugging 技術
- 工厂模式:将对象的创建与使用分离,提高程序可维护性和可扩展性
- 从不同维度分析:Linux与Windows的区别
- 你应该知道的18个Python函数
- 周冬雨|周冬雨戛纳造型惨遭网友嫌弃,网友言语粗鄙,但说的好有道理!