JAVA:mapper.java和mapper.xml的关系,以及foreach的用法

发布时间 2023-12-11 17:43:44作者: Morning枫

简单理解就是,java声明了方法,xml实现了方法,类似与接口与实现接口,他们之间的关系如下:

//	Mapper.java中
List<Ranks> inquireOnlyName(
            @Param("names") List<String> names,
            @Param("status") String status,
            @Param("startIndex") int startIndex,
            @Param("pageSize") int pageSize,
            @Param("namesLength") int namesLength
    );
<!--Mapper.xml中-->
<select id="inquireOnlyName" resultType="maple.morning.yystools.entity.Ranks">
        SELECT *
        FROM ranks
        WHERE (CASE WHEN ranks_1 IN
	<foreach collection="names" index="index" item="name" open="(" separator="," close=")">
            #{name}
        </foreach>
	THEN 1 ELSE 0 END
	+ CASE WHEN ranks_2 IN
	<foreach collection="names" index="index" item="name" open="(" separator="," close=")">
            #{name}
        </foreach>
	THEN 1 ELSE 0 END
                  ) >= #{namesLength}

	AND status IN ${status}
	ORDER BY verify_time DESC
	LIMIT #{startIndex}, #{pageSize}
</select>

java中的方法名,对应xml中id的值
java中的返回属性,对应xml中resultType的值
此处需要返回原始的类,而不是包装类,例如List<>是包装类,而Ranks才是需要被返回的类,因此在xml中要返回原始的类!

参数:

status,startIndex,pageSize,namesLength这四个参数JAVA和xml是一一对应的
然后是names是一个List<String>,我们想把他作为in的条件参数,因此我们就要用到foreach

foreach:

collection:对应java传递的参数,也就是names(网上很多人都说什么List就要传递list,Array传递array什么的可能是我版本比较新哈,collection只能赋值java传递的参数才能运行)

index:索引,选填

item:每个元素取出来的值赋值给谁,这里我们用name接收每一个元素的值,然后放到#{name}

open和separator和close=:我们直接上例子?:
      foreach运行完后,拼接到in后的它长这样:('元素1','元素2','元素3','元素4'...),如果元素是数字,就没有单引号(他会自己判断去还是不去掉)。

很显然:
open:定义了拼接时候的第一个字段'('
separator:定义了每一个元素之间用什么符合间隔开,这里是用逗号',',如果为空就是贴在一起
close:定义了拼接末尾的最后一个字段')'