MyBatis中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 >= #{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é)尾的方式
< | < |
<= | <= |
> | > |
>= | >= |
& | & |
' | ' |
" | " |
方式三,可以使用<![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學院整理)
在系統(tǒng)運行過程中,會產(chǎn)生一些無用的對象,這些對象占據(jù)著一定的內(nèi)存,如果不對這些對象清理回收無用對象的內(nèi)存,可能會導致內(nèi)存的耗盡,所以垃圾回收機制回收的是內(nèi)存。下面通過本文給大家詳細介紹java垃圾回收機制,一起學習吧2017-02-02使用java基于pushlet和bootstrap實現(xiàn)的簡單聊天室
這篇文章主要介紹了使用java基于pushlet和bootstrap實現(xiàn)的簡單聊天室的相關(guān)資料,需要的朋友可以參考下2015-03-03Spring boot+VUE實現(xiàn)token驗證的示例代碼
本文詳細介紹了使用Vue和SpringBoot實現(xiàn)token認證的方法,包括前后端交互流程、后端依賴導入、token工具類、攔截器、跨域處理、前端路由守衛(wèi)、請求攔截器等內(nèi)容,具有一定的參考價值,感興趣的可以了解一下2024-10-10Spring mvc工作原理_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了Spring mvc工作原理的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08關(guān)于Java中String創(chuàng)建的字符串對象內(nèi)存分配測試問題
這篇文章主要介紹了Java中String創(chuàng)建的字符串對象內(nèi)存分配測試,給大家詳細介紹了在創(chuàng)建String對象的兩種常用方法比較,通過示例代碼給大家介紹的非常詳細,需要的朋友可以參考下2021-07-07