MyBatis的if标签的基本使用

在MyBatis框架中,if标签用于在构建SQL语句时,根据参数条件判断的结果,动态地选择加入或不加where条件中。

一 常见使用

在使用MyBatis处理查询逻辑的时候,常用的是判断一些参数是否为空,列举常用的几种情况展示

1.1 数据准备

1.1.1 创建表模型

CREATE TABLE `approval_info` (`id` BIGINT NOT NULL AUTO_INCREMENT,`info_name` VARCHAR(128) DEFAULT NULL,`info_type` VARCHAR(32) DEFAULT NULL,`info_size` VARCHAR(32) DEFAULT NULL,`approval_time` DATETIME DEFAULT NULL,`create_time` DATETIME DEFAULT NULL,PRIMARY KEY (`id`)
)

1.1.2 创建实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ApprovalInfo {private Long id;private String infoName;private String infoType;private String infoSize;private Date approvalTime;private Date createTime;
}

1.1.3 创建mapper层

public interface ApprovalInfoMapper {}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mango.mapper.ApprovalInfoMapper"></mapper>

1.1.4 插入测试数据

@Test
public void insertBatchObject() {List<ApprovalInfo> approvalInfoList = new ArrayList<>();// 使用工具类往集合中添加数据Collections.addAll(approvalInfoList, new ApprovalInfo(null, "cultureProjectOne", "culture", "A", assembleDate("2023-12-05 10:10:10"), assembleDate("2023-11-15 08:08:10")),new ApprovalInfo(null, "tourismProjectOne", "tourism", "A", assembleDate("2023-12-06 09:10:11"), assembleDate("2023-11-19 15:13:11")),new ApprovalInfo(null, "gameProjectOne", "game", "A", assembleDate("2023-12-08 17:10:13"), assembleDate("2023-11-21 01:03:16")),new ApprovalInfo(null, "cultureProjectTwo", "culture", "B", assembleDate("2023-12-11 01:07:15"), assembleDate("2023-11-25 20:23:40")),new ApprovalInfo(null, "cultureProjectThree", "culture", "B", assembleDate("2023-12-17 07:12:07"), assembleDate("2023-12-29 13:41:11")),new ApprovalInfo(null, "tourismProjectTwo", "tourism", "C", assembleDate("2023-12-21 13:01:19"), assembleDate("2023-12-01 11:31:19")),new ApprovalInfo(null, "gameProjectTwo", "game", "C", assembleDate("2023-12-25 19:13:10"), assembleDate("2023-12-03 17:51:15")),new ApprovalInfo(null, "gameProjectThree", "game", "B", assembleDate("2023-12-27 02:11:10"), assembleDate("2023-12-04 12:10:21")),new ApprovalInfo(null, "tourismProjectThree", "tourism", "B", assembleDate("2023-12-29 06:19:10"), assembleDate("2023-12-05 15:43:21")),new ApprovalInfo(null, "cultureProjectFour", "culture", "C", assembleDate("2023-12-31 01:09:10"), assembleDate("2023-12-08 20:21:37")));int effectLineNumber = approvalInfoMapper.saveBatchApprovalInfo(approvalInfoList);System.out.println("effectLineNumber is: " + effectLineNumber);
}private Date assembleDate(String strDate) {try {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return simpleDateFormat.parse(strDate);} catch (ParseException e) {e.printStackTrace();throw new RuntimeException(e.getMessage());}
}
public interface ApprovalInfoMapper {int saveBatchApprovalInfo(@Param("approvalInfoList") List<ApprovalInfo> approvalInfoList);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mango.mapper.ApprovalInfoMapper"><insert id="saveBatchApprovalInfo">insert into approval_info(info_name, info_type, info_size, approval_time, create_time)values<foreach collection="approvalInfoList" item="approvalInfo" separator=",">(#{approvalInfo.infoName}, #{approvalInfo.infoType}, #{approvalInfo.infoSize},#{approvalInfo.approvalTime}, #{approvalInfo.createTime})</foreach></insert>
</mapper>

表中数据如下:

1.2 mapper方法参数是String类型

mapper方法参数是String类型,如果在查询条件中infoType的值不为空,那么就加上infoType的判断条件:

@Test
public void testQueryApprovalInfosByType() {//==>  Preparing: select id, info_name, info_type, info_size, approval_time, create_time from approval_info//==>  Parameters://<==  Total: 10// String infoType = null;// String infoType = "";//==>  Preparing: select id, info_name, info_type, info_size, approval_time, create_time from approval_info WHERE info_type = ?//==>  Parameters:   (String)//<==  Total: 0// String infoType = "  ";//==>  Preparing: select id, info_name, info_type, info_size, approval_time, create_time from approval_info WHERE info_type = ?//==>  Parameters: culture(String)//<==     Columns: id, info_name, info_type, info_size, approval_time, create_time//<==        Row: 1, cultureProjectOne, culture, A, 2023-12-05 10:10:10, 2023-11-15 08:08:10//<==        Row: 4, cultureProjectTwo, culture, B, 2023-12-11 01:07:15, 2023-11-25 20:23:40//<==        Row: 5, cultureProjectThree, culture, B, 2023-12-17 07:12:07, 2023-12-29 13:41:11//<==        Row: 10, cultureProjectFour, culture, C, 2023-12-31 01:09:10, 2023-12-08 20:21:37//<==  Total: 4//[// ApprovalInfo(id=1, infoName=cultureProjectOne, infoType=culture, infoSize=A, approvalTime=Tue Dec 05 10:10:10 CST 2023, createTime=Wed Nov 15 08:08:10 CST 2023),// ApprovalInfo(id=4, infoName=cultureProjectTwo, infoType=culture, infoSize=B, approvalTime=Mon Dec 11 01:07:15 CST 2023, createTime=Sat Nov 25 20:23:40 CST 2023),// ApprovalInfo(id=5, infoName=cultureProjectThree, infoType=culture, infoSize=B, approvalTime=Sun Dec 17 07:12:07 CST 2023, createTime=Fri Dec 29 13:41:11 CST 2023),// ApprovalInfo(id=10, infoName=cultureProjectFour, infoType=culture, infoSize=C, approvalTime=Sun Dec 31 01:09:10 CST 2023, createTime=Fri Dec 08 20:21:37 CST 2023)// ]String infoType = "culture";List<ApprovalInfo> approvalInfoList = approvalInfoMapper.queryApprovalInfosByType(infoType);System.out.println(approvalInfoList);
}

如果infoType的值为null,那么info_type = #{infoType}就不会加入到where条件中,查询出全部的数据;

如果infoType的值为"",那么info_type = #{infoType}就不会加入到where条件中,查询出全部的数据;

如果infoType的值为"  ",那么info_type = #{infoType}就会加入到where条件中,且查询出来的结果当然是空的,MyBatis不会去除空格再进行计算;

如果infoType的值为culture,那么info_type = #{infoType}就会加入到where条件中,且只查询符合条件的结果,且从数据库中查出来的顺序就是往List有序集合中依次添加的顺序

public interface ApprovalInfoMapper {List<ApprovalInfo> queryApprovalInfosByType(@Param("infoType") String infoType);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mango.mapper.ApprovalInfoMapper"><resultMap id="approvalInfoMap" type="com.mango.domain.ApprovalInfo"><id property="id" column="id"/><result property="infoName" column="info_name"/><result property="infoType" column="info_type"/><result property="infoSize" column="info_size"/><result property="approvalTime" column="approval_time"/><result property="createTime" column="create_time"/></resultMap><select id="queryApprovalInfosByType" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test="infoType != null and infoType != ''">info_type = #{infoType}</if></where></select>
</mapper>

在mapper映射文件中,要写resultMap标签用于在查询语句中,将表中的字段映射到Java对象的属性中;

在mapper映射文件中,where条件后面只有一个if标签,那么要写成<where>标签嵌套<if>标签;

mapper方法参数是String类型,那么在mapper映射文件中,就需要判断参数是否等于null,和是否等于空字符串;

1.3 mapper方法参数是Long类型

mapper方法参数是包装类Long类型或是long类型的区别;

如果在查询条件中(Long类型)id的值不为空,那么就加上id的判断条件;

@Test
public void testSelectApprovalInfoByBaseId() {// Long targetId = 5L;// long targetId = 5L;Long targetId = null;List<ApprovalInfo> approvalInfoList1 = approvalInfoMapper.queryApprovalInfoListByBaseId(targetId);List<ApprovalInfo> approvalInfoList2 = approvalInfoMapper.queryApprovalInfoListByWrapperId(targetId);System.out.println(approvalInfoList1);System.out.println(approvalInfoList2);System.out.println("集合中第一条数据: " + approvalInfoList1.get(0));System.out.println("集合中最后一条数据: " + approvalInfoList1.get(approvalInfoList1.size() - 1));
}

在服务层调用mapper层的queryApprovalInfoListByBaseId(@Param("id") long id)方法,对方法参数传值描述如下:
        如果对mapper层的方法参数id传基本数据类型,可以正常使用;
        如果对mapper层的方法参数id传包装类型,那么会先进行拆箱(由Long-->long),传null值会抛异常;
在服务层调用mapper层queryApprovalInfoListByWrapperId(@Param("id") Long id)方法,对方法参数传值描述如下:
        如果对mapper层的方法参数id传基本数据类型,可以正常使用;
        如果对mapper层的方法参数id传包装类型,可以正常使用;
小结:mapper层接口参数有动态sql条件时,最好使用包装类型,而不是基本数据类型;

public interface ApprovalInfoMapper {/*** mapper层方法参数有参与到动态sql条件, 最好使用包装类型, 而不是基本数据类型*/List<ApprovalInfo> queryApprovalInfoListByBaseId(@Param("id") long id);List<ApprovalInfo> queryApprovalInfoListByWrapperId(@Param("id") Long id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mango.mapper.ApprovalInfoMapper"><resultMap id="approvalInfoMap" type="com.mango.domain.ApprovalInfo"><id property="id" column="id"/><result property="infoName" column="info_name"/><result property="infoType" column="info_type"/><result property="infoSize" column="info_size"/><result property="approvalTime" column="approval_time"/><result property="createTime" column="create_time"/></resultMap><select id="queryApprovalInfoListByBaseId" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test="id != null">id >= #{id}</if></where></select><select id="queryApprovalInfoListByWrapperId" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test="id != null">id >= #{id}</if></where></select>
</mapper>

mapper方法参数是Long类型,那么在mapper映射文件中,就只需要判断参数是否等于null;

番外篇

篇一:关于表中记录为空时,查询结果是null,譬如查询表中的最值,在mapper层的方法返回值中使用基本数据类型还是包装类型

@Test
public void testMaxIndex() {Long maxIndexWrapperType = approvalInfoMapper.getMaxIndexWrapperType();System.out.println("maxIndexWrapperType is: " + maxIndexWrapperType);long maxIndexBaseType = approvalInfoMapper.getMaxIndexBaseType();System.out.println("maxIndexBaseType is: " + maxIndexBaseType);
}

如果表中有数据,那么方法返回值使用long类型或是Long类型都可以;
如果表中没有数据,那么方法返回值使用long类型接收null值会报错,Long类型可以接收null值;
小结:如果表中记录为空,且查询结果为null,譬如mapper层获取表中字段最值时,方法返回值类型使用包装类型

public interface ApprovalInfoMapper {/*** 获取表中字段的最值使用包装类型, long类型不能接收null值*/long getMaxIndexBaseType();Long getMaxIndexWrapperType();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mango.mapper.ApprovalInfoMapper"><select id="getMaxIndexBaseType" resultType="long">select MAX(id) from approval_info</select><select id="getMaxIndexWrapperType" resultType="java.lang.Long">select MAX(id) from approval_info</select>
</mapper>

 篇二:关于表中记录为空时,查询结果是0,譬如统计表中记录的数量,在mapper层的方法返回值中使用基本数据类型还是包装类型

@Test
public void testCount() {long baseCount = approvalInfoMapper.queryCountBaseType();System.out.println("基本数据类型接收的值: " + baseCount);Long wrapperCount = approvalInfoMapper.queryCountWrapperType();System.out.println("包装数据类型接收的值: " + wrapperCount);
}

如果表中没有数据,那么方法返回值0,使用long类型或是Long类型都可以接收;

如果表中有数据,那么方法返回值10,使用long类型或是Long类型都可以接收;
小结:如果表中记录为空,且查询结果为0,譬如mapper层统计表中记录的数量,方法返回值类型使用基本数据类型和包装类型都可以

public interface ApprovalInfoMapper {/*** 获取表中记录的数量*/long queryCountBaseType();Long queryCountWrapperType();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mango.mapper.ApprovalInfoMapper"><select id="queryCountBaseType" resultType="long">select count(*) from approval_info</select><select id="queryCountWrapperType" resultType="java.lang.Long">select count(*) from approval_info</select>
</mapper>

1.4 mapper方法参数是Date类型

mapper方法参数是包装类Date类型,如果在查询条件中date的值不为空,那么就加上date的判断条件:

@Test
public void testSelectApprovalInfoByDate() {// Date date = null;Date date = assembleDate("2023-12-03 17:51:15");List<ApprovalInfo> approvalInfoList = approvalInfoMapper.queryApprovalInfoListByDate(date);System.out.println(approvalInfoList);System.out.println("====");System.out.println(approvalInfoList.get(0));System.out.println(approvalInfoList.get(approvalInfoList.size() - 1));
}
private Date assembleDate(String strDate) {try {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return simpleDateFormat.parse(strDate);} catch (ParseException e) {e.printStackTrace();throw new RuntimeException(e.getMessage());}
}
public interface ApprovalInfoMapper {/*** 使用date类型筛选数据*/List<ApprovalInfo> queryApprovalInfoListByDate(@Param("date") Date date);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mango.mapper.ApprovalInfoMapper"><resultMap id="approvalInfoMap" type="com.mango.domain.ApprovalInfo"><id property="id" column="id"/><result property="infoName" column="info_name"/><result property="infoType" column="info_type"/><result property="infoSize" column="info_size"/><result property="approvalTime" column="approval_time"/><result property="createTime" column="create_time"/></resultMap><!-- 方式一 --><select id="queryApprovalInfoListByDate" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test="date != null">create_time >= #{date}</if></where></select><!-- 方式二 --><select id="queryApprovalInfoListByDate" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test="date != null">create_time &gt;= #{date}</if></where></select><!-- 方式三 --><select id="queryApprovalInfoListByDate" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test="date != null">create_time <![CDATA[>=]]> #{date}</if></where></select>
</mapper>

mapper方法参数是Date类型,那么在mapper映射文件中,就只需要判断参数是否等于null;

1.5 小结

如果MyBatis的mapper层方法参数是String类型,那么在mapper映射文件需要判断参数不等于null,和不等于空字符串;

如果MyBatis的mapper层方法参数是Long类型等基本数据类型对应的包装类型,那么在mapper映射文件只需要判断参数不等于null;

如果MyBatis的mapper层方法参数是Date类型,那么在mapper映射文件只需要判断参数不等于null;

在MyBatis表示关系运算符的方式有如下三种:

        方式一,可以使用>关系运算符和>=关系运算符,不可以使用<关系运算符或<=关系运算符;

        方式二,可以将关系运算符进行转义,使用&开头,和使用;结尾的方式

<&lt;
<=&lt;=
>&gt;
>=&gt;=
&&amp;
'&apos;
"&quot;

        方式三,可以使用<![CDATA[ ]]>嵌套关系运算符,<![CDATA[>]]>,<![CDATA[>=]]>,<![CDATA[<]]>,和<![CDATA[<=]]>

二 其他使用

2.1 if标签指定的单个字符

如果infoSize的值是指定字符A,那就查询指定字符A的ApprovalInfo集合,如果不是那就查询全部的ApprovalInfo集合:

@Test
public void testSelectApprovalInfoBySize() {String size = "A";List<ApprovalInfo> approvalInfoList = approvalInfoMapper.queryApprovalInfoListBySize(size);System.out.println(approvalInfoList);
}
public interface ApprovalInfoMapper {/*** 当参数值是单字符时, 对应着的动态sql标签的判断条件如何处理*/List<ApprovalInfo> queryApprovalInfoListBySize(@Param("size") String size);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mango.mapper.ApprovalInfoMapper"><resultMap id="approvalInfoMap" type="com.mango.domain.ApprovalInfo"><id property="id" column="id"/><result property="infoName" column="info_name"/><result property="infoType" column="info_type"/><result property="infoSize" column="info_size"/><result property="approvalTime" column="approval_time"/><result property="createTime" column="create_time"/></resultMap><select id="queryApprovalInfoListBySize" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test="size = 'A'">info_size = #{size}</if></where></select>
</mapper>

2.2  if标签指定的多个字符

如果infoType的值是指定的字符串culture,那就查询指定的字符串culture的ApprovalInfo集合,如果不是那就查询全部的ApprovalInfo集合:

@Test
public void testSelectApprovalInfoByType() {//==>  Preparing: select id, info_name, info_type, info_size, approval_time, create_time from approval_info//==>  Parameters://<==  Total: 10// String type = null;// String type = "culture12306";//==>  Preparing: select id, info_name, info_type, info_size, approval_time, create_time from approval_info WHERE info_type = ?//==>  Parameters: culture(String)//<==  Total: 4String type = "culture";List<ApprovalInfo> approvalInfoList = approvalInfoMapper.queryApprovalInfoListByType(type);System.out.println(approvalInfoList);System.out.println("====");System.out.println(approvalInfoList.get(0));System.out.println(approvalInfoList.get(approvalInfoList.size() - 1));
}
public interface ApprovalInfoMapper {/*** 当参数值是多字符时, 对应着的动态sql标签的判断条件如何处理* mapper接口中的方法参数, 只是用于mapper映射文件中的条件判断和组装sql字段值, 不一定要和表中字段名保持一致*/List<ApprovalInfo> queryApprovalInfoListByType(@Param("infoType") String infoType);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mango.mapper.ApprovalInfoMapper"><resultMap id="approvalInfoMap" type="com.mango.domain.ApprovalInfo"><id property="id" column="id"/><result property="infoName" column="info_name"/><result property="infoType" column="info_type"/><result property="infoSize" column="info_size"/><result property="approvalTime" column="approval_time"/><result property="createTime" column="create_time"/></resultMap><!-- 方式一 --><select id="queryApprovalInfoListByType" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test="infoType == 'culture'">info_type = #{infoType}</if></where></select><!-- 方式二 --><select id="queryApprovalInfoListByType" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test='infoType == "culture"'>info_type = #{infoType}</if></where></select>
</mapper>

在mapper映射文件中,判断方法参数是否等于指定的值,使用<if>标签的test属性值可以写如下两种书写的格式:

        <if test=" infoType == 'culture' ">,双引号和单引号配合着使用;
        <if test=' infoType == "culture" '>,单引号和双引号配合着使用;

2.3  if标签指定的数字

如果id的值是指定长整型5,那就查询infoType是culture的ApprovalInfo集合;

如果id的值是指定长整型7,那就查询infoType是tourism的ApprovalInfo集合;

@Test
public void testQueryApprovalInfoListById() {// Long id = 5L;// Long id = 6L;Long id = 7L;String type = assembleMapData().get(id);List<ApprovalInfo> approvalInfoList = approvalInfoMapper.queryApprovalInfoListById(id, type);System.out.println(approvalInfoList);
}
private Map<Long, String> assembleMapData() {Map<Long, String> map = new HashMap<>();map.put(5L, "culture");map.put(7L, "tourism");return map;
}
public interface ApprovalInfoMapper {/*** 当参数值是数字时, 对应着的动态sql标签的判断条件如何处理*/List<ApprovalInfo> queryApprovalInfoListById(@Param("id") Long id, @Param("infoType") String infoType);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mango.mapper.ApprovalInfoMapper"><resultMap id="approvalInfoMap" type="com.mango.domain.ApprovalInfo"><id property="id" column="id"/><result property="infoName" column="info_name"/><result property="infoType" column="info_type"/><result property="infoSize" column="info_size"/><result property="approvalTime" column="approval_time"/><result property="createTime" column="create_time"/></resultMap><!-- 方式一 --><select id="queryApprovalInfoListById" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test="id == 5">and info_type = #{infoType}</if><if test="id == 7">and info_type = #{infoType}</if></where></select><!-- 方式二 --><select id="queryApprovalInfoListById" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test='id == 5'>and info_type = #{infoType}</if><if test='id == 7'>and info_type = #{infoType}</if></where></select>
</mapper>

2.4 if标签的test属性介绍

在MyBatis中,<if>标签的test属性值用于设置条件判断:

        如果test属性值为true,那么if标签的条件会加到where中,

        如果test属性值为false,那么if标签的条件不会加到where中,

<if>标签的test属性值的条件判断的内容可以写基本数据类型,字符串常量,关系表达式和引用类型对象;

@Test
public void testSelectApprovalInfoByType() {String type = "culture";List<ApprovalInfo> approvalInfoList = approvalInfoMapper.queryApprovalInfoListByType(type);System.out.println(approvalInfoList);
}
public interface ApprovalInfoMapper {List<ApprovalInfo> queryApprovalInfoListByType(@Param("infoType") String infoType);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mango.mapper.ApprovalInfoMapper"><resultMap id="approvalInfoMap" type="com.mango.domain.ApprovalInfo"><id property="id" column="id"/><result property="infoName" column="info_name"/><result property="infoType" column="info_type"/><result property="infoSize" column="info_size"/><result property="approvalTime" column="approval_time"/><result property="createTime" column="create_time"/></resultMap><!-- 方式一: boolean类型 --><select id="queryApprovalInfoListByType" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test="true">info_type = #{infoType}</if></where></select><!-- 方式二: 数字(byte short int long float double)类型, 0为false, 非0(哪怕是0.0)为true --><select id="queryApprovalInfoListByType" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test="1">info_type = #{infoType}</if></where></select><!-- 方式三: char类型, 任意char类型都表示为true --><select id="queryApprovalInfoListByType" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test="'a'">info_type = #{infoType}</if></where></select><!--单引号+单字符会解析成char类型;双引号+单字符会解析成String类型;单引号+多字符会解析成String类型;多引号+多字符会解析成String类型;--><!-- 方式四: String类型, String类型都表示为true --><select id="queryApprovalInfoListByType" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test="'abc'">info_type = #{infoType}</if></where></select><select id="queryApprovalInfoListByType" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test='"abc"'>info_type = #{infoType}</if></where></select><!-- 方式五: 关系表达式, 相等表达式 --><select id="queryApprovalInfoListByType" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test="'abc'=='abc'">info_type = #{infoType}</if></where></select><!-- 方式六: 关系表达式, 不相等表达式 --><select id="queryApprovalInfoListByType" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test="'abc' != 'cba'">info_type = #{infoType}</if></where></select><!-- 方式七: 引用类型对象, infoType是String类型 --><select id="queryApprovalInfoListByType" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test="infoType">info_type = #{infoType}</if></where></select><!-- 方式八: 引用类型对象, infoType用在关系表达式中 --><select id="queryApprovalInfoListByType" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test="infoType == 'culture'">info_type = #{infoType}</if></where></select>
</mapper>

小结:在if标签的test属性值表达式中,引用类型对象不加引号(双引号或单引号),字符和字符串类型需要加引号(双引号或单引号);

在mapper映射文件中,if标签的标签体是表字段、运算符和值表达式,其中值表达式和if标签的test属性值表达式的内容是一致的,只不过在使用引用类型时需要使用#{}或${}给包括起来;

在mapper接口的方法中,方法参数可以自定义需要的参数,不一定非得和表中字段一样或是匹配,只要能表述清楚就可以了;

@Test
public void testSelectApprovalInfoByCustomize() {String type = "culture";String code = "en";List<ApprovalInfo> approvalInfoList = approvalInfoMapper.queryApprovalInfoListByCustomize(type, code);System.out.println(approvalInfoList);
}
public interface ApprovalInfoMapper {List<ApprovalInfo> queryApprovalInfoListByCustomize(@Param("customizeType") String customizeType, @Param("customizeCode") String customizeCode);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mango.mapper.ApprovalInfoMapper"><resultMap id="approvalInfoMap" type="com.mango.domain.ApprovalInfo"><id property="id" column="id"/><result property="infoName" column="info_name"/><result property="infoType" column="info_type"/><result property="infoSize" column="info_size"/><result property="approvalTime" column="approval_time"/><result property="createTime" column="create_time"/></resultMap><select id="queryApprovalInfoListByCustomize" resultMap="approvalInfoMap">select id, info_name, info_type, info_size, approval_time, create_timefrom approval_info<where><if test="customizeCode == 'en'">and info_type = #{customizeType}</if></where></select>
</mapper>

2.5 MyBatis中#{}常用属性

MyBatis中#{}占位符的常用属性,javaType、jdbcType、mode、numericScale、resultMap、typeHandler、jdbcTypeName、expression。
javaType属性:指定参数的Java类型;
jdbcType属性:指定参数的JDBC类型;
‌typeHandler‌属性:指定自定义的类型处理器,用于处理特定类型的参数或结果‌;
MyBatis在预编译(parsing)阶段会读取SQL中的字段类型,以确保预编译SQL的字段类型正确;
MyBatis在预编译(parsing)阶段由SqlSourceBuilder解析#{}参数,将#{}替换为?号(占位),并将#{}中的内容解析为ParameterMapping的封装,ParameterMapping包含了参数的各个属性,解析是除了typeHandler和javaType外其它属性都直接从配置中获取到然后设定,若未指定则为null,ParameterMapping中的typeHandler和javaType是必须要的,因为在后面通过setter方法设置参数值时,从#{}中javaType属性指定的类型信息来选择对应的setter方法进行参数设定,最后执行sql;
在执行sql时,但是有时候在执行的时会报ClassCastException,譬如表中字段是单字符就会报String cannot be cast to Integer的错误,需要手动设置参数的Java类型为:info_size = #{size, javaType=String};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/481394.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ原理架构解析:消息传递的核心机制

文章目录 一、RabbitMQ简介1.1、概述1.2、特性 二、RabbitMQ原理架构三、RabbitMQ应用场景3.1、简单模式3.2、工作模式3.3、发布订阅3.4、路由模式3.5 主题订阅模式 四、同类中间件对比五、RabbitMQ部署5.1、单机部署5.2、集群部署&#xff08;镜像模式&#xff09;5.3、K8s部署…

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测&#xff0c;含优化前后对比 目录 NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测&#xff0c;含优化前后对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介…

【0346】Postgres内核 Startup Process 通过 signal 与 postmaster 交互实现 (5)

1. Startup Process 进程 postmaster 初始化过程中, 在进入 ServerLoop() 函数之前,会先通过调用 StartChildProcess() 函数来开启辅助进程,这些进程的目的主要用来完成数据库的 XLOG 相关处理。 如: 核实 pg_wal 和 pg_wal/archive_status 文件是否存在Postgres先前是否发…

说说Elasticsearch拼写纠错是如何实现的?

大家好&#xff0c;我是锋哥。今天分享关于【说说Elasticsearch拼写纠错是如何实现的&#xff1f;】面试题。希望对大家有帮助&#xff1b; 说说Elasticsearch拼写纠错是如何实现的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Elasticsearch 中&…

NAT拓展

NAT ALG&#xff08;NAT应用级网&#xff09; 为某些应用层协议&#xff0c;因为其报文内容可能携带IP相关信息&#xff0c;而普通NAT转化无法将这些IP转化&#xff0c;从而导致协议无法正常运行 例如FTP&#xff0c;DHCP&#xff0c;RSTP&#xff0c;ICMP&#xff0c;IPSEC…

Flutter:封装发送验证码组件,注册页使用获取验证码并传递控制器和验证码类型

验证码&#xff1a;view import package:flutter/material.dart; import package:get/get.dart; import index.dart;class SendcodePage extends GetView<SendcodeController> {// 接收注册页面&#xff0c;传进来的手机号控制器&#xff0c;和发送验证码的类型final Tex…

【目标跟踪】Anti-UAV数据集详细介绍

Anti-UAV数据集是在2021年公开的专用于无人机跟踪的数据集&#xff0c;该数据集采用RGB-T图像对的形式来克服单个类型视频的缺点&#xff0c;包含了318个视频对&#xff0c;并提出了相应的评估标准&#xff08;the state accurancy, SA)。 文章链接&#xff1a;https://arxiv.…

Linux的文件系统

这里写目录标题 一.文件系统的基本组成索引节点目录项文件数据的存储扇区三个存储区域 二.虚拟文件系统文件系统分类进程文件表读写过程 三.文件的存储连续空间存放方式缺点 非连续空间存放方式链表方式隐式链表缺点显示链接 索引数据库缺陷索引的方式优点&#xff1a;多级索引…

C++优选算法十七 多源BFS

1.单源最短路问题 一个起点一个终点。 定义&#xff1a;在给定加权图中&#xff0c;选择一个顶点作为源点&#xff0c;计算该源点到图中所有其他顶点的最短路径长度。 2.多源最短路问题 定义&#xff1a;多源最短路问题指的是在图中存在多个起点&#xff0c;需要求出从这些…

DAY141权限提升-Linux系统权限提升篇VulnhubCapability能力LD_Preload加载数据库等

一、演示案例-Linux系统提权-Web&用户-数据库类型 复现环境&#xff1a;Raven: 2 ~ VulnHub 1、信息收集 http://192.168.139.155/vendor/ 2、Web权限获取 searchsploit phpmailer find / -name 40969.py cp /usr/share/exploitdb/exploits/php/webapps/40969.py p.py p…

使用nginx请求转发时前端报跨域问题解决

当其他接口都没有问题&#xff0c;后端也进行了跨域的配置时&#xff0c;此时问题应该就出现在nginx中 我发现当上传文件大小小于1m时并不会发生错误&#xff0c;所以我们应该配置一下nginx允许上传文件的大小 在nginx.conf中添加 在nginx目录下重启nginx即可 &#xff08;Wi…

凭借 SpringBoot 构建新冠密接者跟踪系统:快速开发与部署优势凸显

第3章 系统分析 在进行系统分析之前&#xff0c;需要从网络上或者是图书馆的开发类书籍中收集大量的资料&#xff0c;因为这个环节也是帮助即将开发的程序软件制定一套最优的方案&#xff0c;一旦确定了程序软件需要具备的功能&#xff0c;就意味着接下来的工作和任务都是围绕着…

28.100ASK_T113-PRO Linux+QT 显示一张照片

1.添加资源文件 2. 主要代码 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QImage> #include <QPixmap>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui->setupUi(this);QIm…

Android笔试面试题AI答之SQLite(1)

文章目录 1. 阐述什么是SQLite &#xff1f;一、定义与特点二、工作原理三、应用领域四、数据类型与语言绑定 2. Linux 上安装 SQLite方式简述 &#xff1f;一、使用包管理器安装&#xff08;以Debian/Ubuntu为例&#xff09;二、从官方网站下载并编译安装三、注意事项 3. SQLi…

CPU进行float16计算,C++的half.hpp使用方式FP16运算

C不直接支持fp16&#xff0c;如何支持float16的计算&#xff0c;我们使用half包来让C支持fp16计算。half.hpp是C中用于处理半精度浮点数&#xff08;float16&#xff09;的头文件。 一、下载Half包 1.1 下载地址&#xff1a; half&#xff1a;半精度浮点库 2.2 解压缩&…

【C++】LeetCode:LCR 026. 重排链表

题干 LCR 026. 重排链表 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln-1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → … 不能只是单纯的改变节点内部的值&#xff0c;而是需要实…

蓝桥杯——递归

1、用递归实现阶乘 5*4*3*2*1120 package day3;public class Demo6 {public static void main(String[] args) {int result f(5);System.out.println(result);}private static int f(int i) {if(i1) {return 1;}return i * f(i-1);}}结果&#xff1a;120 2、爬楼梯 有一个楼…

Y20030012基于php+mysql的药店药品信息管理系统的设计与实现 源码 配置 文档

库存管理系统 1.摘要2. 系统功能3.功能结构图4.界面展示5.源码获取 1.摘要 21世纪是信息的时代&#xff0c;信息技术发展突飞猛进。各种信息化管理系统如雨后春笋一样出现。Internet的迅猛发展使其成为全球信息传递与共享的巨大的资源库。越来越多的网络环境下的Web应用系统被…

基于R语言森林生态系统结构、功能与稳定性分析与可视化

在生态学研究中&#xff0c;森林生态系统的结构、功能与稳定性是核心研究内容之一。这些方面不仅关系到森林动态变化和物种多样性&#xff0c;还直接影响森林提供的生态服务功能及其应对环境变化的能力。森林生态系统的结构主要包括物种组成、树种多样性、树木的空间分布与密度…

【Git 工具】用 IntelliJ IDEA 玩转 Git 分支与版本管理

文章目录 一、使用 IDEA 配置和操作 Git1.1 查看 Idea 中的 Git 配置1.2 克隆 Github 项目到本地 二、版本管理2.1 提交并推送修改2.2 拉取远程仓库2.3 查看历史2.4 版本回退 三、分支管理3.1 新建分支3.2 切换分支3.2 合并分支3.4 Cherry-Pick 参考资料 一、使用 IDEA 配置和操…