Mapper.xml文件语法总结

总结数据库xml文件中的常用语法

将Map作为参数传入传出

1
List<Map<String, Object>> queryOddList(Map<String, Object> paramMap);
1
2
3
4
5
6
7
<select id="queryOddList" resultType="java.util.Map" >
select d.`name` as deviceName , d.`id` as deviceId ,d.`code` as deviceCode ,d.`outdoors_address` as outdoorsAddress ,d.type as deviceType,d.sub_type as deviceSubType
LEFT JOIN `device_position` as dp on d.`id` = dp.`id`
where 1=1
<if test="oltId != null "> and o.`olt_id` = #{oltId}</if>
<if test="ponPort != null "> and o.`pon_port` = #{ponPort}</if>
</select>

总体来说与JSON差别不大,不需要在xml中写参数类型,只需要写返回类型(resultType)。

where 1=1

如果下面的参数全都是需要判断的,我们需要1=1来应对没有一个参数存在的情况

对数字判空写if

1
<if test="deviceId != null "> and d.`id` = #{deviceId}</if>

对字符串判空写if

1
<if test="username != null and username != ''">AND username = #{username}</if>

对单字符写if

方法1:

1
<if test="resType != null and resType == '1'.toString() "> 

方法2:不管是单字符的的什么,数字字母或者汉字,为了防止被转成char,可以采用外面是单引号,里面是双引号。因为会被转成java代码,java默认双引号里面的是字符串。

1
2
<if test="deviceIds != null  and deviceIds != ''"> and e.pwr_device_id in (${deviceIds})</if>
<if test='haveResponsibleStaff == "是"'> and du.sys_user_id is not null</if>

传入数组怎么操作

1
void updateCtoCutoverMark(@Param("cutoverId")Long cutoverId , @Param("userAccNbrList")List<String> userAccNbrList);
1
2
3
4
5
6
7
8
9
10
<update id="updateCtoCutoverMark">
UPDATE cto_cutover_serv_prod_itf
SET `STS` = 3, `STS_DATE` = NOW()
WHERE `CUTOVER_ID` = #{cutoverId}
AND `USER_ACC_NBR` IN
<foreach collection="userAccNbrList" item="userAccNbr" open="(" separator="," close=")">
#{userAccNbr}
</foreach>
AND sts IN (1, 8)
</update>
  1. foreach中的collection名字与mapper.java中的userAccNbrList名字对应
  2. foreach中的item中的名字userAccNbr与foreach标签中的userAccNbr对应
  3. open="(" separator="," close=")"用来声明列表出现在sql语句中的写法

多参数声明Param参数名称

将一条查询语句作为一个子查询

1
2
3
4
5
6
select 
dev.*, dev.name dpName, dev.id dpId,
(select name from spc_station st where st.id = dev.station_id) as stationName,
(select name from spc_room sr where sr.id =dev.room_id ) as roomName,
(select e.name from spc_exch e where e.id = exch_id) exch_name
....

一对一、一对多、多对多(注解与XML)

一对一,一对多,多对多总结

关于默认生成的selectVoList其中的标签

实体类添加额外字段

1
2
3
4
5
6
7
/** 局站id */
@Excel(name = "局站id")
private Long stationId;

/** 局站名称 */
@TableField(exist = false)
private String stationName;

resultMap(实体类属性与sql返回字段的映射)

1
2
3
4
<resultMap type="com.dtt.rms.power.cable.domain.PwrCable" id="PwrCableResult">
<result property="stationId" column="station_id" />
<result property="stationName" column="station_name" /> <!-- 局站名称 -->
</resultMap>

sql标签(包括select块和from块)

1
2
3
4
5
6
7
<sql id="selectByVo">
SELECT
station_id,
(SELECT ss.name FROM spc_station ss WHERE ss.id = pc.station_id) station_name
FROM
pwr_cable pc
</sql>

select标签如何使用

1
2
3
4
5
6
7
8
<select id="selectVoList" parameterType="com.dtt.rms.power.cable.domain.PwrCable" resultMap="PwrCableResult">
<include refid="selectByVo"/>
<where>
<if test="stationId != null "> and station_id = #{stationId}</if>
</where>
<!-- 这里不对stationName进行库里查询,因为stationName并不存在于库里 -->
</select>

trim标签去除后缀

<trim> 元素可以接受两个重要的属性:

  1. prefix:指定在开始位置添加的前缀;
  2. suffixOverrides:指定要删除的后缀。

<trim> 元素通常与 <set> 元素一起使用,用于构建含有动态属性的 SET 子句。例如,可以使用 <trim> 去除 SET 后的逗号(,)。

以下是一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<update id="updateVoById">
update pwr_cable
<trim prefix="SET" suffixOverrides=",">
<if test="name != null">
name = #{name},
</if>
<if test="age != null">
age = #{age},
</if>
<if test="email != null">
email = #{email},
</if>
</trim>
where id = #{id}
</update>

在这个例子中,<trim> 元素的 prefix 属性被设置为 “SET”,suffixOverrides 属性被设置为 “,”。在每个 <if> 元素中,当满足条件时插入对应的属性,并在末尾添加逗号。当最终构建 UPDATE 语句时,利用 <trim> 的作用,去除了多余的逗号。

@Param注解声明参数

在 MyBatis 的 Mapper 接口中,如果某个方法需要多个参数进行操作,可以使用 @Param 注解来为每个参数指定一个名称,以解决参数混淆的问题。通过使用 @Param 注解,可以在 Mapper 映射文件中引用具体的参数名称,确保参数的正确传递和映射。

下面是一个示例,展示了如何在 Mapper 接口中使用 @Param 注解声明多个参数:

1
2
3
4
5
import org.apache.ibatis.annotations.Param;

public interface UserMapper {
User selectUserByIdAndName(@Param("id") Long id, @Param("name") String name);
}

在上面的示例中,selectUserByIdAndName 方法使用了 @Param 注解,分别为参数 idname 指定了名称。这样在对应的 XML 映射文件中,可以通过 ${id}${name} 来引用这两个参数。

在 XML 映射文件中,可以这样引用多个使用 @Param 注解声明的参数:

1
2
3
4
<select id="selectUserByIdAndName" parameterType="map" resultType="User">
SELECT * FROM users
WHERE id = #{id} AND name = #{name}
</select>

通过以上的示例,我们可以清晰地了解如何在 MyBatis 的 Mapper 接口中使用 @Param 注解声明多个参数,以确保参数传递的准确性和可读性。


Mapper.xml文件语法总结
http://wahoyu.xyz/2023/11/28/MapperXML/
作者
Wahoyu
发布于
2023年11月28日
许可协议