欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis中if標簽的基本使用

 更新時間:2024年12月08日 10:07:09   作者:君子劍mango  
本文介紹了MyBatis框架中的if標簽的使用方法,包括動態(tài)生成SQL語句、處理不同類型的參數(shù)和if標簽進行條件判斷,具有一定的參考價值,感興趣的可以了解一下

在MyBatis框架中,if標簽用于在構(gòu)建SQL語句時,根據(jù)參數(shù)條件判斷的結(jié)果,動態(tài)地選擇加入或不加where條件中。

一 常見使用

在使用MyBatis處理查詢邏輯的時候,常用的是判斷一些參數(shù)是否為空,列舉常用的幾種情況展示

1.1 數(shù)據(jù)準備

1.1.1 創(chuàng)建表模型

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 創(chuàng)建實體類

@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 創(chuàng)建mapper層

public interface ApprovalInfoMapper {

}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//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 插入測試數(shù)據(jù)

@Test
public void insertBatchObject() {
    List<ApprovalInfo> approvalInfoList = new ArrayList<>();
    // 使用工具類往集合中添加數(shù)據(jù)
    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 mapper
        PUBLIC "-//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>

表中數(shù)據(jù)如下:

1.2 mapper方法參數(shù)是String類型

mapper方法參數(shù)是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條件中,查詢出全部的數(shù)據(jù);

如果infoType的值為"",那么info_type = #{infoType}就不會加入到where條件中,查詢出全部的數(shù)據(jù);

如果infoType的值為"  ",那么info_type = #{infoType}就會加入到where條件中,且查詢出來的結(jié)果當然是空的,MyBatis不會去除空格再進行計算;

如果infoType的值為culture,那么info_type = #{infoType}就會加入到where條件中,且只查詢符合條件的結(jié)果,且從數(shù)據(jù)庫中查出來的順序就是往List有序集合中依次添加的順序;

public interface ApprovalInfoMapper {
    List<ApprovalInfo> queryApprovalInfosByType(@Param("infoType") String infoType);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//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_time
        from 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方法參數(shù)是String類型,那么在mapper映射文件中,就需要判斷參數(shù)是否等于null,和是否等于空字符串;

1.3 mapper方法參數(shù)是Long類型

mapper方法參數(shù)是包裝類Long類型或是long類型的區(qū)別;

如果在查詢條件中(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("集合中第一條數(shù)據(jù): " + approvalInfoList1.get(0));
    System.out.println("集合中最后一條數(shù)據(jù): " + approvalInfoList1.get(approvalInfoList1.size() - 1));
}

在服務(wù)層調(diào)用mapper層的queryApprovalInfoListByBaseId(@Param("id") long id)方法,對方法參數(shù)傳值描述如下:
        如果對mapper層的方法參數(shù)id傳基本數(shù)據(jù)類型,可以正常使用;
        如果對mapper層的方法參數(shù)id傳包裝類型,那么會先進行拆箱(由Long-->long),傳null值會拋異常;
在服務(wù)層調(diào)用mapper層queryApprovalInfoListByWrapperId(@Param("id") Long id)方法,對方法參數(shù)傳值描述如下:
        如果對mapper層的方法參數(shù)id傳基本數(shù)據(jù)類型,可以正常使用;
        如果對mapper層的方法參數(shù)id傳包裝類型,可以正常使用;
小結(jié):mapper層接口參數(shù)有動態(tài)sql條件時,最好使用包裝類型,而不是基本數(shù)據(jù)類型;

public interface ApprovalInfoMapper {
    /**
     * mapper層方法參數(shù)有參與到動態(tài)sql條件, 最好使用包裝類型, 而不是基本數(shù)據(jù)類型
     */
    List<ApprovalInfo> queryApprovalInfoListByBaseId(@Param("id") long id);
    List<ApprovalInfo> queryApprovalInfoListByWrapperId(@Param("id") Long id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//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_time
        from 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_time
        from approval_info
        <where>
            <if test="id != null">
                id >= #{id}
            </if>
        </where>
    </select>
</mapper>

mapper方法參數(shù)是Long類型,那么在mapper映射文件中,就只需要判斷參數(shù)是否等于null;

番外篇

篇一:關(guān)于表中記錄為空時,查詢結(jié)果是null,譬如查詢表中的最值,在mapper層的方法返回值中使用基本數(shù)據(jù)類型還是包裝類型

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

如果表中有數(shù)據(jù),那么方法返回值使用long類型或是Long類型都可以;
如果表中沒有數(shù)據(jù),那么方法返回值使用long類型接收null值會報錯,Long類型可以接收null值;
小結(jié):如果表中記錄為空,且查詢結(jié)果為null,譬如mapper層獲取表中字段最值時,方法返回值類型使用包裝類型;

public interface ApprovalInfoMapper {
    /**
     * 獲取表中字段的最值使用包裝類型, long類型不能接收null值
     */
    long getMaxIndexBaseType();
    Long getMaxIndexWrapperType();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//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>

 篇二:關(guān)于表中記錄為空時,查詢結(jié)果是0,譬如統(tǒng)計表中記錄的數(shù)量,在mapper層的方法返回值中使用基本數(shù)據(jù)類型還是包裝類型

@Test
public void testCount() {
    long baseCount = approvalInfoMapper.queryCountBaseType();
    System.out.println("基本數(shù)據(jù)類型接收的值: " + baseCount);
    Long wrapperCount = approvalInfoMapper.queryCountWrapperType();
    System.out.println("包裝數(shù)據(jù)類型接收的值: " + wrapperCount);
}

如果表中沒有數(shù)據(jù),那么方法返回值0,使用long類型或是Long類型都可以接收;

如果表中有數(shù)據(jù),那么方法返回值10,使用long類型或是Long類型都可以接收;
小結(jié):如果表中記錄為空,且查詢結(jié)果為0,譬如mapper層統(tǒng)計表中記錄的數(shù)量,方法返回值類型使用基本數(shù)據(jù)類型和包裝類型都可以;

public interface ApprovalInfoMapper {
    /**
     * 獲取表中記錄的數(shù)量
     */
    long queryCountBaseType();
    Long queryCountWrapperType();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//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方法參數(shù)是Date類型

mapper方法參數(shù)是包裝類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類型篩選數(shù)據(jù)
     */
    List<ApprovalInfo> queryApprovalInfoListByDate(@Param("date") Date date);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//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_time
        from 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_time
        from 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_time
        from approval_info
        <where>
            <if test="date != null">
                create_time <![CDATA[>=]]> #{date}
            </if>
        </where>
    </select>
</mapper>

mapper方法參數(shù)是Date類型,那么在mapper映射文件中,就只需要判斷參數(shù)是否等于null;

1.5 小結(jié)

如果MyBatis的mapper層方法參數(shù)是String類型,那么在mapper映射文件需要判斷參數(shù)不等于null,和不等于空字符串;

如果MyBatis的mapper層方法參數(shù)是Long類型等基本數(shù)據(jù)類型對應(yīng)的包裝類型,那么在mapper映射文件只需要判斷參數(shù)不等于null;

如果MyBatis的mapper層方法參數(shù)是Date類型,那么在mapper映射文件只需要判斷參數(shù)不等于null;

在MyBatis表示關(guān)系運算符的方式有如下三種:

        方式一,可以使用>關(guān)系運算符和>=關(guān)系運算符,不可以使用<關(guān)系運算符或<=關(guān)系運算符;

        方式二,可以將關(guān)系運算符進行轉(zhuǎn)義,使用&開頭,和使用;結(jié)尾的方式

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

        方式三,可以使用<![CDATA[ ]]>嵌套關(guān)系運算符,<![CDATA[>]]>,<![CDATA[>=]]>,<![CDATA[<]]>,和<![CDATA[<=]]>

二 其他使用

2.1 if標簽指定的單個字符

如果infoSize的值是指定字符A,那就查詢指定字符A的ApprovalInfo集合,如果不是那就查詢?nèi)康腁pprovalInfo集合:

@Test
public void testSelectApprovalInfoBySize() {
    String size = "A";
    List<ApprovalInfo> approvalInfoList = approvalInfoMapper.queryApprovalInfoListBySize(size);
    System.out.println(approvalInfoList);
}
public interface ApprovalInfoMapper {
    /**
     * 當參數(shù)值是單字符時, 對應(yīng)著的動態(tài)sql標簽的判斷條件如何處理
     */
    List<ApprovalInfo> queryApprovalInfoListBySize(@Param("size") String size);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//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_time
        from approval_info
        <where>
            <if test="size = 'A'">
                info_size = #{size}
            </if>
        </where>
    </select>
</mapper>

2.2  if標簽指定的多個字符

如果infoType的值是指定的字符串culture,那就查詢指定的字符串culture的ApprovalInfo集合,如果不是那就查詢?nèi)康腁pprovalInfo集合:

@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: 4
    String 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 {
    /**
     * 當參數(shù)值是多字符時, 對應(yīng)著的動態(tài)sql標簽的判斷條件如何處理
     * mapper接口中的方法參數(shù), 只是用于mapper映射文件中的條件判斷和組裝sql字段值, 不一定要和表中字段名保持一致
     */
    List<ApprovalInfo> queryApprovalInfoListByType(@Param("infoType") String infoType);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//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_time
        from 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_time
        from approval_info
        <where>
            <if test='infoType == "culture"'>
                info_type = #{infoType}
            </if>
        </where>
    </select>
</mapper>

在mapper映射文件中,判斷方法參數(shù)是否等于指定的值,使用<if>標簽的test屬性值可以寫如下兩種書寫的格式:

        <if test=" infoType == 'culture' ">,雙引號和單引號配合著使用;
        <if test=' infoType == "culture" '>,單引號和雙引號配合著使用;

2.3  if標簽指定的數(shù)字

如果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 {
    /**
     * 當參數(shù)值是數(shù)字時, 對應(yīng)著的動態(tài)sql標簽的判斷條件如何處理
     */
    List<ApprovalInfo> queryApprovalInfoListById(@Param("id") Long id, @Param("infoType") String infoType);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//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_time
        from 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_time
        from 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屬性值用于設(shè)置條件判斷:

        如果test屬性值為true,那么if標簽的條件會加到where中,

        如果test屬性值為false,那么if標簽的條件不會加到where中,

<if>標簽的test屬性值的條件判斷的內(nèi)容可以寫基本數(shù)據(jù)類型,字符串常量,關(guān)系表達式和引用類型對象;

@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 mapper
        PUBLIC "-//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_time
        from approval_info
        <where>
            <if test="true">
                info_type = #{infoType}
            </if>
        </where>
    </select>

    <!-- 方式二: 數(shù)字(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_time
        from 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_time
        from 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_time
        from 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_time
        from approval_info
        <where>
            <if test='"abc"'>
                info_type = #{infoType}
            </if>
        </where>
    </select>

    <!-- 方式五: 關(guān)系表達式, 相等表達式 -->
    <select id="queryApprovalInfoListByType" resultMap="approvalInfoMap">
        select id, info_name, info_type, info_size, approval_time, create_time
        from approval_info
        <where>
            <if test="'abc'=='abc'">
                info_type = #{infoType}
            </if>
        </where>
    </select>

    <!-- 方式六: 關(guān)系表達式, 不相等表達式 -->
    <select id="queryApprovalInfoListByType" resultMap="approvalInfoMap">
        select id, info_name, info_type, info_size, approval_time, create_time
        from 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_time
        from approval_info
        <where>
            <if test="infoType">
                info_type = #{infoType}
            </if>
        </where>
    </select>

    <!-- 方式八: 引用類型對象, infoType用在關(guān)系表達式中 -->
    <select id="queryApprovalInfoListByType" resultMap="approvalInfoMap">
        select id, info_name, info_type, info_size, approval_time, create_time
        from approval_info
        <where>
            <if test="infoType == 'culture'">
                info_type = #{infoType}
            </if>
        </where>
    </select>
</mapper>

小結(jié):在if標簽的test屬性值表達式中,引用類型對象不加引號(雙引號或單引號),字符和字符串類型需要加引號(雙引號或單引號);

在mapper映射文件中,if標簽的標簽體是表字段、運算符和值表達式,其中值表達式和if標簽的test屬性值表達式的內(nèi)容是一致的,只不過在使用引用類型時需要使用#{}或${}給包括起來;

在mapper接口的方法中,方法參數(shù)可以自定義需要的參數(shù),不一定非得和表中字段一樣或是匹配,只要能表述清楚就可以了;

@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 mapper
        PUBLIC "-//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_time
        from 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屬性:指定參數(shù)的Java類型;
jdbcType屬性:指定參數(shù)的JDBC類型;
‌typeHandler‌屬性:指定自定義的類型處理器,用于處理特定類型的參數(shù)或結(jié)果‌;
MyBatis在預編譯(parsing)階段會讀取SQL中的字段類型,以確保預編譯SQL的字段類型正確;
MyBatis在預編譯(parsing)階段由SqlSourceBuilder解析#{}參數(shù),將#{}替換為?號(占位),并將#{}中的內(nèi)容解析為ParameterMapping的封裝,ParameterMapping包含了參數(shù)的各個屬性,解析是除了typeHandler和javaType外其它屬性都直接從配置中獲取到然后設(shè)定,若未指定則為null,ParameterMapping中的typeHandler和javaType是必須要的,因為在后面通過setter方法設(shè)置參數(shù)值時,從#{}中javaType屬性指定的類型信息來選擇對應(yīng)的setter方法進行參數(shù)設(shè)定,最后執(zhí)行sql;
在執(zhí)行sql時,但是有時候在執(zhí)行的時會報ClassCastException,譬如表中字段是單字符就會報String cannot be cast to Integer的錯誤,需要手動設(shè)置參數(shù)的Java類型為:info_size = #{size, javaType=String};

到此這篇關(guān)于MyBatis中if標簽的基本使用的文章就介紹到這了,更多相關(guān)MyBatis if標簽使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java 垃圾回收機制詳解(動力節(jié)點Java學院整理)

    Java 垃圾回收機制詳解(動力節(jié)點Java學院整理)

    在系統(tǒng)運行過程中,會產(chǎn)生一些無用的對象,這些對象占據(jù)著一定的內(nèi)存,如果不對這些對象清理回收無用對象的內(nèi)存,可能會導致內(nèi)存的耗盡,所以垃圾回收機制回收的是內(nèi)存。下面通過本文給大家詳細介紹java垃圾回收機制,一起學習吧
    2017-02-02
  • Mybatis 高級用法和tk.mybatis使用示例詳解

    Mybatis 高級用法和tk.mybatis使用示例詳解

    tkmybatis 是對底層 sql 進行了抽象封裝,不需要考慮 sql 怎么寫,只需要按照邏輯思維,遵循 tkmybatis 的語法即可實現(xiàn)數(shù)據(jù)庫操作,這篇文章主要介紹了Mybatis 高級用法和tk.mybatis使用,需要的朋友可以參考下
    2024-05-05
  • java 中HashMap實現(xiàn)原理深入理解

    java 中HashMap實現(xiàn)原理深入理解

    這篇文章主要介紹了java 中HashMap實現(xiàn)原理深入理解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • SpringBoot 中使用RabbtiMq?詳解

    SpringBoot 中使用RabbtiMq?詳解

    這篇文章主要介紹了SpringBoot 中使用RabbtiMq詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價價值,需要的朋友可以參考一下
    2022-07-07
  • Java中線程安全有哪些實現(xiàn)思路

    Java中線程安全有哪些實現(xiàn)思路

    在 Java 多線程編程中,線程安全是一個非常重要的概念,本文主要介紹了Java中線程安全有哪些實現(xiàn)思路,非常具有實用價值,需要的朋友可以參考下
    2023-05-05
  • SpringCloud Feign的使用簡介

    SpringCloud Feign的使用簡介

    這篇文章主要介紹了SpringCloud Feign的使用簡介,幫助大家更好的理解和學習使用SpringCloud,感興趣的朋友可以了解下
    2021-04-04
  • 使用java基于pushlet和bootstrap實現(xiàn)的簡單聊天室

    使用java基于pushlet和bootstrap實現(xiàn)的簡單聊天室

    這篇文章主要介紹了使用java基于pushlet和bootstrap實現(xiàn)的簡單聊天室的相關(guān)資料,需要的朋友可以參考下
    2015-03-03
  • Spring boot+VUE實現(xiàn)token驗證的示例代碼

    Spring boot+VUE實現(xiàn)token驗證的示例代碼

    本文詳細介紹了使用Vue和SpringBoot實現(xiàn)token認證的方法,包括前后端交互流程、后端依賴導入、token工具類、攔截器、跨域處理、前端路由守衛(wèi)、請求攔截器等內(nèi)容,具有一定的參考價值,感興趣的可以了解一下
    2024-10-10
  • Spring mvc工作原理_動力節(jié)點Java學院整理

    Spring mvc工作原理_動力節(jié)點Java學院整理

    這篇文章主要為大家詳細介紹了Spring mvc工作原理的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 關(guān)于Java中String創(chuàng)建的字符串對象內(nèi)存分配測試問題

    關(guān)于Java中String創(chuàng)建的字符串對象內(nèi)存分配測試問題

    這篇文章主要介紹了Java中String創(chuàng)建的字符串對象內(nèi)存分配測試,給大家詳細介紹了在創(chuàng)建String對象的兩種常用方法比較,通過示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2021-07-07

最新評論