Mybatis动态sql、if与where的使用、sql片段、foreach遍历、Mybatis的关联查询一对一、一对多、多对多、Mybatis的延时加载-day02

这篇博客详细讲解了Mybatis的动态SQL,包括if和where的使用、SQL片段和foreach遍历。同时深入探讨了Mybatis的关联查询,包括一对一、一对多和多对多的实现,以及如何配置resultMap进行延迟加载。最后介绍了Mybatis的懒加载机制及其配置。

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

第一节 Mybatis的动态SQL

1.1 if 和where的使用

  • if标签:是作为判断参数来使用的,如果符合条件,就把if标签体内的SQL拼接上,不符合条件就不拼接
  • 注意:用if进行判断是否为空时,不仅要判断null,还要判断空字符串’'
  • where标签:会去掉条件中的第一个and符号
  1. 在UserMapper.java接口中写一个方法
    在这里插入图片描述
  2. 在UserMapper.xml中配置sql
    在这里插入图片描述
  3. 测试与效果
package com.it.test;

import com.it.mapper.UserMapper;
import com.it.model.User;
import com.it.vo.UserQueryVo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @ClassName Demo02
 * @Author shuyy
 * @Date 2020/9/22
 **/
public class Demo01 {
   

    SqlSession sqlSession;

    @Before
    public void before() throws IOException {
   
        System.out.println("before...获取session");
        //1.读取配置文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //3.通过SqlSessionFactory创建SqlSession
        sqlSession = sessionFactory.openSession();
    }

    @After
    public void after(){
   
        System.out.println("after...关闭session");
        //5.关闭SqlSession
        sqlSession.close();
    }
    @Test
    public void test1(){
   
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        //System.out.println(userMapper);//返回的是一个代理对象
        //查询条件
        UserQueryVo queryVo = new UserQueryVo();
        User user = new User();
        user.setSex("男");
        user.setUsername("shu04");
        queryVo.setUser(user);
        List<User> list = userMapper.findUserList(queryVo);
        System.out.println(list);
        //sqlSession.commit();//增删改记得提交事务
    }
}

在这里插入图片描述
在这里插入图片描述

  1. 如果注释了姓名设置,会查询所有符合性别条件的
    在这里插入图片描述
  2. 如果注释了性别设置,虽然不会报错,但是查询不到结果,这是由于sql所致
    在这里插入图片描述
  3. 为了正确的使用sql,使用if与where来拼接sql,如果要查询的字段值为空,就不把该字段的条件加到sql上,起到动态拼接sql的效果
    在这里插入图片描述
	<!--if与where的使用--><!--查询性别和名字-->
    <select id="findUserList" parameterType="UserQueryVo" resultType="user">
        select * from user
        <where>
            <if test="user != null">
                <if test="user.sex != null and user.sex != ''">
                    sex = #{user.sex}
                </if>
                <if test="user.username != null and user.username != ''">
                    and username like '%${user.username}%'
                </if>
            </if>
        </where>
    </select>
  1. 注释一些配置的效果,就算注释了设置user,user为空也不报错
    在这里插入图片描述
  2. where会去除条件中第一个and符号(上面的语句中写的是and username like ‘%${user.username}%’),拼接后的语句中去除了and,防止了SQL错误
    在这里插入图片描述
  3. 注释了条件,就不拼接到对应的sql上
    在这里插入图片描述

1.2 SQL片断

  • Mybatis提供了SQL片段的功能,可以提高SQL的可重用性
    在这里插入图片描述
	<!--if与where的使用--><!--查询性别和名字-->
    <!--声明一个sql片段-->
    <sql id="select_user_where">
        <if test="user != null">
            <if test="user.sex != null and user.sex != ''">
                sex = #{user.sex}
            </if>
            <if test="user.username != null and user.username != ''">
                and username like '%${user.username}%'
            </if>
        </if>
    </sql>
    <select id="findUserList" parameterType="UserQueryVo" resultType="user">
        select * from user
        <where>
            <!--引用sql片段-->
            <include refid="select_user_where"/>
        </where>
    </select>
  • 成功执行
    在这里插入图片描述

1.3 foreach遍历

  1. 先在包装类中提供一个List,并提供get/set
    在这里插入图片描述
  2. 在UserMapper.java中提供一个方法
    在这里插入图片描述
  3. 在UserMapper.xml中提供对应的sql
    在这里插入图片描述
	<!--foreach的使用-->
    <select id="findUserByIds" parameterType="userQueryVo" resultType="user">
        select * from user
        <where>
            <if test="ids != null and ids.size > 0">
                <!--
                    foreach标签:表示一个foreach循环
                    collection:集合参数名称,如果是直接传入集合参数,则该处的参数名称只能填 list
                    item:每次遍历出来的对象
                    open:开始遍历时拼接的串(sql)
                    close:结束遍历时拼接的串(sql)
                    separator:遍历出的每个对象之间需要拼接的字符
                -->
                <foreach collection="ids" item="id" open="id in (" separator="," close=")">
                    ${id}
                </foreach>
            </if>
        </where>
    </select>
  1. 测试
package com.it.test;

import com.it.mapper.UserMapper;
import com.it.model.User;
import com.it.vo.UserQueryVo;<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值