首页 > 数据库 >MyBatis - 基础学习9 - 动态sql(sql片段,foreach)

MyBatis - 基础学习9 - 动态sql(sql片段,foreach)

时间:2022-11-22 17:57:55浏览次数:38  
标签:语句 map 片段 查询 foreach sql MyBatis

一.sql片段

为什么要使用sql片段:

我么在编写一些大规模的sql语句时,总会面临所写的sql语句在几个增删改语句中反复出现,它们都做着相同的事,我们却要反复的编写(虽然可以复制粘贴),为了简化我们的sql结构

所以mybatis衍生出来了sql片段,用来对重复的sql语句进行集中放置,然后按需调用

我们在没有使用sql片段时:语句中的if判断在我们的查询语句中反复出现,这个时候呢,我们就可以去使用我们的sql片段

 

 

如下图:

我们把复用的sql语句单独提取出来,然后在需要使用的地方使用 <include>标签导入即可

 

 

 

 

 

 sql片段的使用大大的提高了代码的复用性,使得代码的开起来结构更加的简明了

二.动态sql之foreach

1.编写接口

 List<Blog> selectForeach(Map map);

 

2.在mapper.xml中编写sql语句

    <select id="selectForeach" parameterType="map" resultType="blog">
        SELECT * FROM blog
        <where>
            <foreach collection="tit" item="title" open="(" close=")" separator="or">
                title = #{title}
            </foreach>
        </where>
    </select>

 

 foreach的强大之处在于它可以在mysql层次遍历查询,重点:灵活查询数据库记录,帮助简化我们的本质sql语句:

例如:查询数据库第1,2,3条数据

  • sql : where (id = 1) or (id =2  )or(id =3)
  • mybatis优化: 

                            <where>

                            <foreach collection="tit" item="title" open="(" close=")" separator="or">

                            title = #{title}

                            </foreach>

                            </where>

一眼看上去可能是sql语句看上去简单;但是foreach的重点在于动态查询,我们可以通过传入的 map 集合,在不改动sql语句的情况下,想查那条数据就查那条数据

collection:传入的集合,既然是动态查询就需要知道查哪里,可能一条,可能多条,所以是集合;一般用ArrayList< >进行封装map传入

item:对应的是我们要根据那个字段进行查询,一定是数据库的字段名

open:一般用来表示区间的开始 常用“  and ( ”

close:表示区间关闭                   常用“  )”

separator:区间内的字段条件的连接词  常用 “  and  |  or  ”

然后主体就是sql查询条件了,和一般的sql语句一样

3.测试

@Test
    public void TestselectForeach(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
    HashMap map = new HashMap();
    ArrayList<String> tit = new ArrayList<String>();
    tit.add("Java");
    map.put("tit",tit);
    List<Blog> blogs = mapper.selectForeach(map);


    for (Blog blog : blogs) {
        System.out.println(blog);
    }
    sqlSession.close();
}

 

由于在foreach语法中,我们需要传入的是一个集合(collection 标签需要的),所以我们在封装map的时候就需要封装一个数组进去,就可以传入很多个数据了

注:collection一定需要一个集合,就算我们只查一条数据,都要创建一个数据,然后封装map进去,反而言之,查询一条记录为什么要使用foreach呢

 

标签:语句,map,片段,查询,foreach,sql,MyBatis
From: https://www.cnblogs.com/5ran2yl/p/16915933.html

相关文章

  • 11月22日内容总结——存取数据的历史和数据库的介绍、MySQL介绍、下载和相关操作
    目录一、存取数据的演变史1、文本文件2、软件开发目录规范3、数据库服务(重点)1.数据库管理软件的由来①程序所有的组件就不可能运行在一台机器上②数据安全问题③并发总结......
  • Mysql基本使用
    目录存取数据的演变史数据库软件应用史数据库的本质数据库的分类MySQL简介MySQL基本使用系统服务的制作密码相关操作SQL与NoSQL数据库重要概念基本SQL语句存取数据的演变......
  • python之路33 MySQL 1
    存取数据的演变1.文本文件文件路径不固定:C:\aaa.txtD:\bbb.txtE:\ccc.txt数据格式不统一:jason|123jason$123jason1232.软件开发目录规范规定......
  • day40MySQL
    存储数据的演变史1.文本文件 文件路径不固定:C:\aaa.txtD:\bbb.txtE:\ccc.txt数据格式不统一:jason|123jason$123 jason1232.软件开发目录规范 规定了数......
  • MySQL基本操作
    今日内容概要存取数据的演变史数据库软件应用史数据库的本质数据库的分类MySQL简介MySQL基本使用SQL与NoSQL数据库相关概念常见基本SQL语句今日内容详细......
  • MySQL数据库基础
    今日内容详细存储数据的演变史数据库软件应用史数据库的本质数据库的分类MySQL简介MySQL基本使用系统服务的制作密码相关操作SQL与NoSQL数据库重要概念基本SQL......
  • SQL将时间段拆分为每天
      实现方法如下 SELECT单号,所属人ID,日期数,convert(char(10),DATEADD(dd,number,s.开始日期),120)AS'开始日期',convert(char(10),DATEADD(dd,number,......
  • K8S kubesphere安装mysql
    原先我们使用Docker按照mysql时候的命令 dockerrun-p3306:3306--namemysql-01\-v/mydata/mysql/log:/var/log/mysql\-v/mydata/mysql/data:/var/lib/mysql......
  • Mysql基础
    Mysql基础一、存取数据的演变史1.文本文件文件路径不固定,格式不统一2.软件开发目录规范数据保存在db目录下(路径偏向统一),数据格式还没有得到统一(文本,json格式......
  • MySQL
    一、数据库概述数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据库是一个按数据......