MyBatis <if>标签的使用

示例【根据学生姓名和班级信息查询】

创建t_student表

创建Student

package com.po;
public class Student {
	private Integer sid;		//学号
	private String sname;		//姓名
	private String sex;			//性别
	private String classes;		//班级
	public Integer getSid() {
		return sid;
	}
	public void setSid(Integer sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getClasses() {
		return classes;
	}
	public void setClasses(String classes) {
		this.classes = classes;
	}
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + ", sex=" + sex + ", classes=" + classes + "]";
	}	
}

创建StudentMapper.xml

<?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.mapper.StudentMapper">
	<!-- 根据姓名和班级查询 -->
	<select id="getStudentByNameAndClasses" resultType="com.po.Student">
		select * from t_student where 1=1
		<if test="sname!=null">
			and sname like concat('%',#{sname},'%')
		</if>
		<if test="classes!=null">
			and classes=#{classes}
		</if>
	</select>
</mapper>

配置mybatis-config.xml并加StudentMapper.xml

<mappers>
		<mapper resource="com/mapper/StudentMapper.xml"/>		
</mappers>

创建StudentDao

package com.dao;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import com.factory.SessionFactory;
import com.po.Student;
public class StudentDao {
	private SqlSession session=SessionFactory.getSqlSession();
	private List<Student> students=new ArrayList<Student>();
	@Test
	public void getStudentByNameAndClasses(){
		Student stu=new Student();
		stu.setSname("张三");
		stu.setClasses("大一");
		students=session.selectList("com.mapper.StudentMapper.getStudentByNameAndClasses", stu);
		for (Student student : students) {
			System.out.println(student);
		}
	}
}

传递sname、classes两个参数,然后执行getStudentByNameAndClasses()方法

只传递classses参数,然后执行getStudentByNameAndClasses()方法

 

 

### MyBatis 中 `<where>` 标签使用方法及与 SQL 查询结合 在 MyBatis 中,`<where>` 标签用于动态生成 SQL 查询中的 `WHERE` 子句。它能够自动处理条件拼接问题,避免手动添加 `AND` 或 `OR` 关键字时可能出现的语法错误。以下是对 `<where>` 标签的详细说明以及如何与 SQL 查询结合使用的示例。 #### `<where>` 标签的功能 `<where>` 标签会自动判断其内部是否有内容。如果存在内容,则会在前面加上 `WHERE` 关键字;如果没有内容,则不会生成任何 SQL 片段[^2]。此外,`<where>` 标签还会智能地移除第一个条件前多余的 `AND` 或 `OR` 关键字。 #### 示例代码 以下是一个使用 `<where>` 标签的完整示例: ```xml <select id="listPage1" resultType="com.qcby.shujia.demo.entity.UserBlog"> SELECT ub.*, u.username, u.head_Img, u.reason AS userReason FROM user_blog ub LEFT JOIN user u ON ub.user_id = u.id <where> <if test="userBlog.title != null"> AND ub.title LIKE CONCAT('%', #{userBlog.title}, '%') </if> <if test="userBlog.reason != null"> AND ub.reason LIKE CONCAT('%', #{userBlog.reason}, '%') </if> <if test="userBlog.userReason != null"> AND u.reason LIKE CONCAT('%', #{userBlog.userReason}, '%') </if> </where> </select> ``` 在这个例子中,`<where>` 标签包裹了多个 `<if>` 条件。每个 `<if>` 条件根据传入参数是否为 `null` 决定是否生成对应的 SQL 片段。如果所有条件都为 `null`,则不会生成 `WHERE` 子句。 #### `<where>` 标签与 `IF` 标签结合 当需要动态生成查询条件时,通常会将 `<where>` 标签与 `<if>` 标签结合使用。`<if>` 标签用于判断某个条件是否满足,而 `<where>` 标签则负责处理整个 `WHERE` 子句的结构[^3]。 例如,假设需要查询用户表中性别为 `0` 或 `1` 的记录,并支持对手机号进行模糊查询,可以使用以下代码: ```xml <select id="selectUsers" resultType="User"> SELECT * FROM users <where> <if test="gender != null"> AND gender = #{gender} </if> <if test="mobile != null"> AND mobile LIKE CONCAT('%', #{mobile}, '%') </if> </where> </select> ``` 在这个例子中,`<if>` 标签分别检查 `gender` 和 `mobile` 参数是否为 `null`,并根据结果生成相应的 SQL 条件。`<where>` 标签会自动处理 `WHERE` 关键字和条件间的逻辑关系[^3]。 #### 注意事项 - 如果 `<where>` 标签内的所有条件都不满足,则不会生成 `WHERE` 子句。 - 在条件中使用 `AND` 或 `OR` 时,`<where>` 标签会自动移除第一个条件前多余的逻辑关键字。 - 需要确保传递的参数值符合预期类型,以避免 SQL 注入风险。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云淡风轻58

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值