mybatis拼接查询条件

本文介绍了一个使用MyBatis实现的报警记录查询模块。该模块定义了报警记录的映射关系,并通过不同的SQL配置实现了基于条件筛选的报警记录查询功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?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="mapper.AlarmMapper" >
	 <resultMap id="AlarmResultMap" type="vo.AlarmRs" >
		<result column="alarm_id" property="alarm_id" jdbcType="INTEGER" />
		<result column="alarm_level" property="alarm_level" jdbcType="INTEGER" />
		<result column="alarm_flag" property="alarm_flag" jdbcType="INTEGER" />
		<result column="alarm_time" property="alarm_time" jdbcType="TIMESTAMP" />
		<result column="alarm_desc" property="alarm_desc" jdbcType="VARCHAR" />
	</resultMap>
	
	<sql id="Base_Column_List" >
                alarm_id, alarm_level, alarm_flag, alarm_time, alarm_desc 
  	</sql>
  	
  	<sql id="tableNameSql">
		jy_alarm
	</sql>
	
	<sql id="varSql2">
		<where>
			<trim suffixOverrides="and">
			  	<if test="startDate != null and startDate !=''" >
			     DATE(alarm_time) &gt;= #{startDate,jdbcType=VARCHAR} and 
			    </if>
			    <if test="endDate != null and endDate !=''" >
			     DATE(alarm_time) &lt;= #{endDate,jdbcType=VARCHAR} and 
			    </if>
			    <if test="level !=3" >
			     alarm_level = #{level,jdbcType=INTEGER} and 
			    </if>
			</trim>
		</where>
	</sql>
	
	<select id="getAlarmRs" resultMap="AlarmResultMap" parameterType="vo.AlarmCondition">
		select 
		<include refid="Base_Column_List" />
		from 
		<include refid="tableNameSql" /> 
		<include refid="varSql2" /> 
		ORDER BY alarm_time DESC 
	</select>
	
	<select id="getAlarmRsFirst" resultMap="AlarmResultMap" parameterType="vo.AlarmCondition">
		select alarm_id, alarm_level, alarm_flag, alarm_time, alarm_desc from jy_alarm 
		where DATE(alarm_time) = #{toDay,jdbcType=VARCHAR} ORDER BY alarm_time DESC
	</select>
	
</mapper>


### MyBatis 中动态 SQL 查询条件的构建方式 MyBatis 提供了一种强大的功能——动态 SQL,能够根据不同的条件动态生成 SQL 语句[^1]。这种机制使得开发者可以根据实际需求灵活地调整查询逻辑。 #### 使用 `<if>` 标签实现简单条件判断 `<if>` 标签是最常用的动态 SQL 元素之一,它可以用来判断某个条件是否满足,并决定是否将对应的 SQL 片段加入最终的 SQL 语句中[^2]。下面是一个简单的例子: ```xml <select id="findUserByCondition" parameterType="map" resultType="User"> SELECT * FROM users WHERE 1=1 <if test="name != null"> AND name = #{name} </if> <if test="age != null and age > 0"> AND age = #{age} </if> </select> ``` 在这个例子中,如果 `name` 或者 `age` 参数不为空,则会将其作为过滤条件追加到 SQL 语句中。 --- #### 使用 `<choose>`, `<when>`, 和 `<otherwise>` 实现多分支选择 类似于 Java 中的 `switch-case` 结构,在 MyBatis 中可以通过 `<choose>` 来实现多分支的选择逻辑[^4]。以下是具体示例: ```xml <select id="findUserByChoose" parameterType="map" resultType="User"> SELECT * FROM users WHERE 1=1 <choose> <when test="id != null"> AND id = #{id} </when> <when test="email != null"> AND email = #{email} </when> <otherwise> AND status = 'ACTIVE' </otherwise> </choose> </select> ``` 上述代码表示当 `id` 存在时按 `id` 进行筛选;如果没有提供 `id` 而提供了 `email`,则按照 `email` 筛选;两者都不存在的情况下,默认返回状态为 `'ACTIVE'` 的记录。 --- #### 遍历集合参数 (如 List 或 Array) 在某些场景下可能需要传递一组值给 SQL 查询,比如使用 `IN` 关键字匹配多个值的情况。此时可以借助 `<foreach>` 标签完成这一操作[^3]。如下所示: ```xml <select id="findUsersByIds" parameterType="map" resultType="User"> SELECT * FROM users WHERE id IN <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach> </select> ``` 这里假设传入的是一个名为 `list` 的列表对象,`<foreach>` 将自动遍历该列表并拼接成逗号分隔的形式。 --- #### 综合应用多种动态 SQL 元素 为了更复杂的需求,还可以综合运用以上提到的各种标签来创建更加复杂的查询逻辑。例如: ```xml <select id="complexQuery" parameterType="map" resultType="Order"> SELECT * FROM orders WHERE 1=1 <if test="userId != null"> AND user_id = #{userId} </if> <if test="statusList != null and statusList.size() > 0"> AND order_status IN <foreach collection="statusList" item="status" open="(" separator="," close=")"> #{status} </foreach> </if> <choose> <when test="startDate != null"> AND create_time >= #{startDate} </when> <otherwise> AND is_active = true </otherwise> </choose> </select> ``` 这段代码展示了如何在一个查询中同时处理单个字段、集合类型的输入以及多分支逻辑[^2]. --- ### 总结 通过合理组合 `<if>`、`<choose>`、`<when>`、`<otherwise>` 和 `<foreach>` 等标签,可以在 MyBatis 中轻松实现各种形式的动态 SQL 查询[^4]。这些工具极大地增强了 SQL 构造的灵活性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值