首页 > 数据库 >MyBatis动态SQL教程

MyBatis动态SQL教程

时间:2024-02-03 23:33:13浏览次数:27  
标签:教程 标签 SQL sqlSession emp gender MyBatis where Emp

动态SQL是 MyBatis 中非常强大且灵活的功能,允许你根据不同的条件构建SQL查询。
这主要通过 <if>、<choose>、<when>、<otherwise>、<foreach>等标签实现。

查询场景

/**
 * 根据条件查询员工信息
 * @param emp
 * @return
 */
List<Emp> getEmpCondition(Emp emp);

if标签的使用

<if> 标签:该标签用于根据条件判断是否包含某段SQL片段。

<select id="getEmpCondition" resultType="com.evan.mybatis.entity.Emp">
	select * from t_emp where 1=1
	<if test="empName != null and empName != ''">
		and emp_name = #{empName}
	</if>
	<if test="age != null and age != ''">
		and age = #{age}
	</if>
	<if test="gender != null and gender != ''">
		and gender = #{gender}
	</if>
</select>
测试
@Test
public void test1() {
	SqlSession sqlSession = SqlSessionUtil.getSqlSession();
	EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
	Emp emp = new Emp();
	emp.setEmpName("李四");
	List<Emp> emps = mapper.getEmpCondition(emp);
	emps.forEach(System.out::println);
	sqlSession.close();
}

结论:if标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之标签中的内容不会执行

where标签的使用

  • 若where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字
  • 若where标签中的if条件满足,则where标签会自动添加where关键字,并将条件前面多余的and或or去掉

注意:where标签不能去掉条件最后多余的and或or

<select id="getEmpCondition" resultType="com.evan.mybatis.entity.Emp">
        select * from t_emp
        <where>
            <if test="empName != null and empName !=''">
                emp_name = #{empName}
            </if>
            <if test="age != null and age != ''">
                and age = #{age}
            </if>
            <if test="gender != null and gender !=''">
                or gender = #{gender}
            </if>
        </where>
    </select>
测试
@Test
public void test1() {
	SqlSession sqlSession = SqlSessionUtil.getSqlSession();
	EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
	Emp emp = new Emp();
	emp.setEmpName("李四");
	emp.setAge(19);
	emp.setGender("女");
	List<Emp> emps = mapper.getEmpCondition(emp);
	emps.forEach(System.out::println);
	sqlSession.close();
}

trim标签的使用

trim用于去掉或添加标签中的内容,常用属性:

  • prefix:在trim标签中内容的前面添加指定内容
  • prefixOverrides:在trim标签中内容的前面去掉指定内容
  • suffix:在trim标签中内容的后面添加指定内容
  • suffixOverrides:在trim标签中内容的后面去掉指定内容
<select id="getEmpCondition" resultType="com.evan.mybatis.entity.Emp">
	select * from t_emp
	<trim prefix="where" suffixOverrides="and|or">
		<if test="empName != null and empName != ''">
			emp_name = #{empName} and
		</if>
		<if test="age != null and age != ''">
			age = #{age} or
		</if>
		<if test="gender != null and gender != ''">
			gender = #{gender}
		</if>
	</trim>
</select>
测试
@Test
public void test1() {
	SqlSession sqlSession = SqlSessionUtil.getSqlSession();
	EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
	Emp emp = new Emp(0,"李四",19,"男",null);
	List<Emp> emps = mapper.getEmpCondition(emp);
	emps.forEach(System.out::println);
	sqlSession.close();
}

choose、when、otherwise标签的使用

<choose>、<when>、<otherwise> 标签:这些标签类似于Java中的switch-case-default结构。
<choose>标签中的<when>标签表达式结果满足则条件拼接查询,否则在读多个<when>标签中继续判断,如都不满足,则执行<otherwise>标签内容。

注意:when至少有一个,otherwise最多设置一个

<select id="getEmpCondition" resultType="com.evan.mybatis.entity.Emp">
	select * from t_emp
	<where>
		<choose>
			<when test="empName != null and empName != ''">
				emp_name = #{empName}
			</when>
			<when test="age != null and age != ''">
				age = #{age}
			</when>
			<when test="gender != null and gender != ''">
				gender = #{gender}
			</when>
			<otherwise>
				gender = '女'
			</otherwise>
		</choose>
	</where>
</select>
测试
@Test
public void test1() {
	SqlSession sqlSession = SqlSessionUtil.getSqlSession();
	EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
	Emp emp = new Emp(0,null,0,"男",null);
	List<Emp> emps = mapper.getEmpCondition(emp);
	emps.forEach(System.out::println);
	sqlSession.close();
}

foreach标签的使用

场景1

方法形参为集合,实现批量添加操作。

/**
  * 批量添加
  * @param emps
  * @return
  */
int addEmp(@Param("emps") List<Emp> emps);
<insert id="addEmp">
	insert into t_emp(emp_name,age,gender,dept_id) values
	<foreach collection="emps" item="e" separator=",">
		(#{e.empName},#{e.age},#{e.gender},null)
	</foreach>
</insert>
测试
@Test
public void test2() {
	SqlSession sqlSession = SqlSessionUtil.getSqlSession();
	EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
	Emp emp1 = new Emp(0, "evan", 22, "女", null);
	Emp emp2 = new Emp(0, "allen", 23, "男", null);
	Emp emp3 = new Emp(0, "john", 24, "女", null);
	int result = mapper.addEmp(Arrays.asList(emp1, emp2, emp3));
	System.out.println("结果:" + result);
	sqlSession.close();
}

场景2:

形参为数组,实现批量删除操作。

/**
 * 批量删除
 * @param empNames
 * @return
 */
int removeEmp(@Param("empNames") String[] empNames);
  • 方式1: 通过形参数组并且where条件为in()方式条件进行批量删除
<delete id="removeEmp">
	delete from t_emp where emp_name in
		(
			<foreach collection="empNames" item="e" separator=",">
				#{e}
			</foreach>
		)
</delete>

<delete id="removeEmp">
    delete from t_emp where emp_name in
        <foreach collection="empNames" separator="," item="e" open="(" close=")">
            #{e}
        </foreach>
</delete>
  • 方式2: 通过形参数组并且where条件为or方式的模糊条件遍历
<delete id="removeEmp">
	delete from t_emp where 
	<foreach collection="empNames" item="item" separator="or">
		emp_name like '%${item}%'
	</foreach>
</delete>

sql标签的使用

sql标签,可以记录一段公共sql片段,在使用的地方通过include标签进行引入。

<!-- 公共sql语句 -->
<sql id="empColumns">emp_id,emp_name,age,gender,dept_id</sql>

<select id="getEmpCondition" resultType="com.evan.mybatis.entity.Emp">
        select <include refid="empColumns"/> from t_emp
        <where>
            <choose>
                <when test="empName != null and empName != ''">
                    emp_name = #{empName}
                </when>
                <when test="age != null and age != ''">
                    age = #{age}
                </when>
                <when test="gender != null and gender != ''">
                    gender = #{gender}
                </when>
                <otherwise>
                    gender = '女'
                </otherwise>
            </choose>
        </where>
</select>

标签:教程,标签,SQL,sqlSession,emp,gender,MyBatis,where,Emp
From: https://www.cnblogs.com/lisong0626/p/18005171

相关文章

  • MyBatis的常用动态标签
    1、<sql><!--<sqlid=""></sql>:设置一段SQL片段,即公共SQL,可以被当前映射文件中所有的SQL语句所访问<includerefid="empColumns"></include>:访问某个SQL片段--><sqlid="empColumns">selecteid,ename,age,sex,d......
  • 无涯教程-getDate()函数
    JavaScriptdategetDate()方法根据当地时间返回指定日期的月份。getDate返回的值是1到31之间的整数。getDate()-语法Date.getDate()getDate()-返回值返回今天的日期和时间。getDate()-示例vardt=newDate("December25,199523:15:00");console.log("getDate(......
  • iText PDF Java API 入门介绍教程
    ​ iText是一个非常强大的Java库,用于创建和操作PDF文档。可以在Java应用程序中生成PDF文档,包括文本、表格、图像等丰富的内容。iText具有强大的功能,如PDF/A、数字签名、加密等,适用于复杂的PDF处理需求。iText是一个非常灵活和强大的库,可以根据具体需求进行大量的定制和扩展。......
  • [SWPUCTF 2021 新生赛]easy_sql
    手工sql注入流程首先,检查字段数url?wllm=1'orderby3--+尝试到4的时候报错,故字段数为3爆库名url?wllm=1'unionselect1,extractvalue(1,concat('~',(selectdatabase()))),3--+爆表名url/?wllm=1'unionselect1,extractvalue(1,concat('~',(selectgro......
  • 动态sql语句
    MyBatis的动态sql语句sql语句是根据查询条件动态的变化mybatis提供一些动态sql的标签常用的动态sql标签: IF标签使用 如果查询条件不为空则按照查询条件查询。(可以使用多个IF标签,当IF标签满足时添加where条件)可以满足多个条件语法:<iftest="条件语句"></if>举......
  • MondoDb安装教程
    MondoDb使用教程一、安装和下载1.下载下载地址:https://www.mongodb.com/try/download/community2.安装将下载的tar.gz包上传到虚拟机1.解压:tar-zxvfmongodb-linux-x86_64-rhel70-4.4.28.tgz3.启动和关闭1:前台启动mkdir-p/soft/mongo/mongodb/data/dbmkdir-p/s......
  • 无涯教程-constructor函数
    Javascript日期构造函数属性返回对创建原型的数组函数的引用。constructor-语法date.constructorconstructor-返回值返回创建该对象的函数。constructor-示例vardt=newDate();console.log("dt.constructoris:"+dt.constructor);成功执行上述代码后,将显示......
  • 无涯教程-Return array from 函数s
    下面的示例更好地解释了此概念。Returnarrayfromfunctions-示例functiondisp(){returnnewArray("Mary","Tom","Jack","Jill")}varnums=disp()for(variinnums){console.log(nums[i])}成功执行上述代码后,将显示以下输出。MaryT......
  • pid文件未生成:mysqld_safe mysqld from pid file /usr/local/mysql/data/mysql.pid en
    问题/usr/local/mysql/bin/mysqld_safe--defaults-file=/usr/local/mysql/conf/my.cnf--user=mysql该命令启动mysql时,未启动成功,终端输出下列报错:2024-02-03T02:56:51.449040Zmysqld_safeLoggingto'/usr/local/mysql/mysqllog/logfile/mysql-err.log'.2024-02-03T02:......
  • MyBatis的XML配置文件及注释
    mybatis.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>......