返回顶部
首页 > 资讯 > 后端开发 > Python >MyBatis动态sql查询及多参数查询方式
  • 1020
分享到

MyBatis动态sql查询及多参数查询方式

MyBatis sql查询动态sql查询多参数查询 2022-11-13 18:11:50 1020人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录mybatis动态sql动态sql处理简单的多参数查询动态sql处理更新功能动态sql扩展动态sql处理集合参数foreach标签处理数组类型参数  &nbs

MyBatis动态sql

动态sql处理简单的多参数查询

常用标签

标签说明
if条件判断,与java中的if语句类似
where为sql语句动态添加where关键字
choose条件判断,这是一个组合标签,需要与when,otherwise标签搭配使用。
foreach以迭代方式处理集合类型的参数
set为sql语句动态添加set关键字,动态实现数据更新
trim对sql语句进行格式化处理,添加或移除前后缀

if标签

语法

<if test="条件判断">
....Sql语句
</if>
<!--如果test内容为true则执行if内的sql语句,反之则不执行-->

where标签

语法

<where>
    <if test="条件判断">
    ....Sql语句
    </if>
</where>
<!--where标签用来替换sql语句中where关键词-->

Eg:     

    //接口中
    
    List<SmbmsProvider> listbyCodeAndName(@Param("name")String name,
                                          @Param("code")String code);    
    <!--相应的mapper映射文件-->
    <!--因为传入的参数是基本数据类型,所以parameterType属性可省略-->
<select id="listbyCodeAndName" resultType="com.smbms.pojo.SmbmsProvider">
        select * from  smbms_provider
    <!--where标签 代替sql中的where关键词-->
        <where>
            <!--符合if条件的则执行相应的sql语句-->
            <if test="name!=null"> and proName like concat('%',#{name},'%')                 </if>
            <if test="code!=null"> and proCode like concat('%',#[code],'%')</if>
        </where>
    </select>
    //测试类
     @Test
    void listbyCodeAndName() {
        List<SmbmsProvider> list=mapper.listbyCodeAndName("北","0");
        for (SmbmsProvider smbmsProvider : list) {
            System.out.println(smbmsProvider.getProName());
        }
    }

choose(when,otherwise)标签

语法

<choose>
    <when test="判断条件">
            sql语句...
    </when>
    <when test="判断条件">
         sql语句...
    </when>
    <otherwise>
         sql语句...
    </otherwise>
</choose>
<!--此标签相当于java中的switch语句功能-->

总结:

​ 1,choose(when,otherwise)是一个组合标签,when和otherwise写在choose标签中。

​ 2,当when标签中的test属性判断为true,就会执行他所包含的语句。

​ 3,choose中的多个when标签指挥执行匹配成功的第一个,执行之后就跳出choose标签。

​ 4,当所有的when标签中的test属性判断都为false时,进入otherwise标签。

Eg:      

    //接口中定义方法
    
    List<SmbmsProvider> listByMoreParam(Map<String,Object> map);
<!--相应的mapper映射文件-->
<select id="listByMoreParam" parameterType="map" resultType="com.smbms.pojo.SmbmsProvider">
        select * from smbms_provider
        <where>
            <!--多选一的choose标签-->
            <choose>
                <when test="name!=null and name!=''"> and proName LIKE         CONCAT('%',#{name},'%')</when>
                <when test="code!=null and code!=''"> and proCode LIKE CONCAT('%',#[code],'%')</when>
                <when test="contact!=null and contact!=''"> and proName LIKE CONCAT('%',#{proContact},'%')</when>
                 <otherwise> and YEAR(creationDate) = YEAR(#{creationDate})</otherwise>
            </choose>
        </where>
    </select>
    //测试类
    @Test
    void listByMoreParam() {
        try {
            Map<String,Object> map=new HashMap<>();
            map.put("name","优百");
            map.put("code","002");
            map.put("contact",null);
            map.put("creationDate",new SimpleDateFORMat("yyyy-MM-dd").parse("2013-03-21"));
            List<SmbmsProvider> list=mapper.listByMoreParam(map);
            for (SmbmsProvider smbmsProvider : list) {
                System.out.println(smbmsProvider.getProName());
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

动态sql处理更新功能

set标签

语法

<set>
    <if test="判断条件">
        sql语句...
    </if>
</set>

Eg:     

    //接口中的方法
    
    int updateProviderInfo(SmbmsProvider provider);
<!--相应的mapper映射文件-->
<update id="updateProviderInfo" parameterType="com.smbms.pojo.SmbmsProvider">
        update `smbms_provider`
    <!--set标签可以智能的忽略多余的逗号-->
        <set>
            <if test="proCode!=null">proCode=#{proCode},</if>
            <if test="proName!=null">proName=#{proName},</if>
            <if test="proDesc!=null">proDesc=#{proDesc},</if>
            <if test="proContact!=null">proContact=#{proContact},</if>
            <if test="proPhone!=null">proPhone=#{proPhone},</if>
            <if test="proAddress!=null">proAddress=#{proAddress},</if>
            <if test="proFax!=null">proFax=#{proFax},</if>
            <if test="createdBy!=null">createdBy=#{createdBy,</if>
            <if test="creationDate!=null">creationDate=#{creationDate},</if>
            <if test="modifyDate!=null">modifyDate=#{modifyDate},</if>
            <if test="modifyBy!=null">modifyBy=#{modifyBy},</if>
        </set>
         where id=#{id}
    </update>
    <!--此方法中的if判断条件针对的是传入对象参数中部分属性有值-->
    //测试类

      @Test
    void updateProviderInfo() {
        result= mapper.updateProviderInfo(new SmbmsProvider("aaaa","sdsd",15L));
        System.out.println(result);
    }

总结

where,set标签能够动态的为sql语句添加前后缀,并可以只能的忽略标签前后多余的and,or或者逗号等字符。

动态sql扩展

trim标签

语法

<trim prefix="前缀" suffix="后缀" prefixOverrides="忽略前缀" suffixOverrides="忽略后缀">
    ....
</trim>

其属性介绍 

属性说明
perfix前缀,可自动对trim标签所包含的语句是否有返回值进行判断,如果有返回值,则为sql语句拼接相应前缀
suffix后缀,在trim标签包含的语句末尾拼接后缀。
prefixOverrides忽略的前缀,忽略trim标签内部首部指定的内容。此属性中字符 | 意为 或 。字符 ‘|’ 与前后的字符之间不能有空格。
suffixOverrides忽略的后缀,忽略trim标签包含内容尾部指定的内容。

eg:

    <!--相应的mapper映射文件-->
	
<update id="updateProviderInfo" parameterType="com.smbms.pojo.SmbmsProvider">
        update `smbms_provider`
        <!--使用冬天标签进行修改操作-->
        <trim prefix="set" suffixOverrides="," suffix=" where id=#{id}">
            <if test="proCode!=null">proCode=#{proCode},</if>
            <if test="proName!=null">proName=#{proName},</if>
            <if test="proDesc!=null">proDesc=#{proDesc},</if>
            <if test="proContact!=null">proContact=#{proContact},</if>
            <if test="proPhone!=null">proPhone=#{proPhone},</if>
            <if test="proAddress!=null">proAddress=#{proAddress},</if>
            <if test="proFax!=null">proFax=#{proFax},</if>
            <if test="createdBy!=null">createdBy=#{createdBy,</if>
            <if test="creationDate!=null">creationDate=#{creationDate},</if>
            <if test="modifyDate!=null">modifyDate=#{modifyDate},</if>
            <if test="modifyBy!=null">modifyBy=#{modifyBy},</if>
        </trim>
    </update>

动态sql处理集合参数

语法:

    <foreach collection="参数名称" item="元素别名"
         open="(" separator="," close=")" index="当前元素位置下标">
            #{元素别名}
    </foreach>

其属性介绍 

属性说明
item为集合或数组中的元素取的别名。
open起始位置的拼接字符,表示in语句以 ( 开始。
separator元素之间的连接符,表示 in 语句中的元素之间以 ,连接。
close结束位置的拼接字符,表示 in语句以 )结束。
collection参数名称当参数类型为数组时,默认参数名为array。当参数类型为list集合时,默认参数为list。当参数类型为Map集合时,参数名为Map集合元素所在键值对的key。当参数类型为对象时,参数名为对象中集合类型的属性名。

foreach标签处理数组类型参数     

    //接口中的方法
    
    List<SmbmsBill> listBySomeProviderId(Integer [] args);
    <!--相应的mapper映射文件-->    <select id="listBySomeProviderId" resultType="com.smbms.pojo.SmbmsBill">
        SELECT *
        FROM `smbms_bill`
        WHERE `providerId`  in 
        <foreach collection="array" item="item" open="(" separator="," close=")" >
            #{item}
        </foreach>
    </select>
    //测试类
      @Test
    void listBySomeProviderId() {
        Integer []  someId={1,2,3};
        List<SmbmsBill> list= billMapper.listBySomeProviderId(someId);
        System.out.println(list.size());
        for (SmbmsBill bill : list) {
            System.out.println(bill.getProductName());
        }
    }

foreach标签处理List类型参数

//相应接口

    
    List<SmbmsBill> listBySomeProviderIdInList(@Param("list")List<Integer> list);
    <!--相应的mapper映射文件-->
    <select id="listBySomeProviderIdInList" resultType="com.smbms.pojo.SmbmsBill">
        SELECT *
        FROM `smbms_bill`
        WHERE `providerId`  in
        <foreach collection="list" item="item" open="(" separator="," close=")" >
            #{item}
        </foreach>
    </select>
    //测试类
     @Test
    void listBySomeProviderIdInList() {
        List<Integer> listParam=new ArrayList<>();
        listParam.add(1);
        listParam.add(2);
        listParam.add(3);
        List<SmbmsBill> list= billMapper.listBySomeProviderIdInList(listParam);
        System.out.println(list.size());
        for (SmbmsBill bill : list) {
            System.out.println(bill.getProductName());
        }
    }

foreach标签处理Map类型参数

    //接口中的方法
    
    List<SmbmsBill> listByCodeAndSomeProviderId(Map<String,Object> map);1
<!--相应的mapper映射文件-->

        <!--入参类型为map-->
     <select id="listByCodeAndSomeProviderId" parameterType="map" 
             resultType="com.smbms.pojo.SmbmsBill">
        SELECT *
        FROM `smbms_bill`
        <where>
            <!--code为map集合中的key-->
            <if test="code!=null">
                AND `billCode` LIKE CONCAT('%',#[code],'%')
            </if>
            <if test="providerIds!=null">
                AND `providerId` IN
                     <!--providerIds为map集合中的key-->
                <foreach collection="providerIds"
                         open="(" separator="," close=")" item="items">
                    #{items}
                </foreach>
            </if>
        </where>
    </select>
    //测试类
     @Test
    void listByCodeAndSomeProviderId() {
        List<Integer> providerIds=new ArrayList<>();
        providerIds.add(1);
        providerIds.add(2);
        providerIds.add(3);
        Map<String,Object> map=new HashMap<>();
        map.put("providerIds",providerIds);
        map.put("code","1");
        List<SmbmsBill> list= billMapper.listByCodeAndSomeProviderId(map);
        System.out.println(list.size());
    }

注意:

1,当参数为基本数据类型或数组,List集合类型时,myBatis框架会将参数封装在一个Map对象中。

2,当参数为数组时,collection对应值默认为array.

3,当参数为List集合类型时,collection对应值默认为list.

4,当参数为Map对象时,collection对应值为该Map对象中数组或集合元素对应的key.

5,如果使用@Param注解为参数设置了名称,collection对应值为参数名。

6,当参数为对象类型时,独享中有查询条件所需的集合属性,collection对应值为该集合属性名称。

分页功能

基于mysql的分页查询 

//相应接口
	
    List<NewsDetail> listByPageInMoreParam(@Param("newsId")int newsId,
                                           @Param("title")String title,
                                           @Param("startRow")int startRow,
                                           @Param("pageSize")int pageSize);
<!--相应的mapper映射文件-->
<select id="listByPageInMoreParam" resultType="com.news.pojo.NewsDetail">
        SELECT  * FROM `news_detail`
        <where>
            <if test="title != null and title != ''">
                and  `title` LIKE CONCAT('%',#{title},'%')
            </if>
            <if test="newsId != null and newsId!=-1">
                AND `cateGoryId`=#{newsId}
            </if>
        </where>
        limit #{startRow} ,#{pageSize}
    </select>
	//测试类
	 @Test
    void listByPageInMoreParam() {
    NewDetailMapper mapper= MyBatisUtil.getSqlSession().getMapper(NewDetailMapper.class);
        List<NewsDetail> list= mapper.listByPageInMoreParam(2,null,0,2);
        System.out.println(list.size());
        for (NewsDetail detail : list) {
            System.out.println(detail.getTitle());
        }
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: MyBatis动态sql查询及多参数查询方式

本文链接: https://lsjlt.com/news/170272.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MyBatis动态sql查询及多参数查询方式
    目录MyBatis动态sql动态sql处理简单的多参数查询动态sql处理更新功能动态sql扩展动态sql处理集合参数foreach标签处理数组类型参数  &nbs...
    99+
    2022-11-13
    MyBatis sql查询 动态sql查询 多参数查询
  • mybatis 动态SQL查询方法总结
    这篇文章主要讲解了“mybatis 动态SQL查询方法总结”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mybatis 动态SQL查询方法总结”吧!背景××项目需要提供系统部分函数第三方调用...
    99+
    2023-06-20
  • Mybatis动态SQL及单表多表查询怎么应用
    本文小编为大家详细介绍“Mybatis动态SQL及单表多表查询怎么应用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mybatis动态SQL及单表多表查询怎么应用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。单...
    99+
    2023-07-02
  • MyBatis-Plus多表联查的实现方法(动态查询和静态查询)
    目录建库建表依赖配置代码测试1.静态查询2.动态查询 1.不传条件2.传条件建库建表 DROP DATABASE IF EXISTS mp; CREATE DATA...
    99+
    2024-04-02
  • Mybatis多表查询与动态SQL特性详解
    目录1.较复杂的查询操作1.1 参数占位符 #{} 和 ${}1.2SQL注入1.3like查询1.4resultType与resultMap1.4多表查询1.4.1一对一表映射1.4.2一对多表映射2.动态SQL2.1...
    99+
    2024-04-02
  • 基于mybatis 动态SQL查询总结
    背景 ××项目需要提供系统部分函数第三方调用接口,基于安全性和避免暴露数据库表信息的基础上进行函数接口的设计,根据第三方调用身份的权限提供某张表的自定义集合。 本项目基于mybati...
    99+
    2024-04-02
  • Mybatis详解动态SQL以及单表多表查询的应用
    目录单表查询操作参数占位符#{}和${}SQL 注入like模糊查询多表查询操作一对一多表查询一对多多表查询动态SQL使用if标签trim标签where标签set标签for...
    99+
    2024-04-02
  • MyBatis中动态SQL及关联查询怎么实现
    小编给大家分享一下MyBatis中动态SQL及关联查询怎么实现,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!序言 MyBatis,大家都知道,半自动的ORM框架,原来叫ibatis,后来好...
    99+
    2024-04-02
  • Mybatis 实现动态组装查询条件,仿SQL模式
    目的: 以前比较习惯使用Hibernate,后来觉得mybatis不能按我想要的自动组装为SQL查询条件,所以提供该工具类; 效果图: 如图所示,根据条件自动组装查询条件,下面来...
    99+
    2024-04-02
  • mybatis多个参数查询的方法是什么
    在MyBatis中,可以使用@Param注解或者Map对象来传递多个参数进行查询。下面分别介绍这两种方法: 使用@Param注解:...
    99+
    2024-03-12
    mybatis
  • Mybatis分页查询——四种传参方式
    目录 相关导读 一、顺序传参 1. 持久层接口方法 2. UserMapper.xml映射文件新增标签 3. 新来源地址:https://blog.csdn.net/qq_53317005/article/details/129849030...
    99+
    2023-08-31
    java maven mybatis mysql
  • 运用Mybatis动态查询字段及表名
    Mapper.java IPage getDyData(@Param("page") Page page, @Param("columns")String columns, @Param("tableName")String tableNa...
    99+
    2023-09-06
    mybatis java mysql
  • MyBatis-Plus多表联查(动态查询)的项目实践
    目录简介代码建库建表配置依赖测试1.静态查询2.动态查询简介 本文用示例介绍使用MyBatis-Plus进行多表查询的方法,包括静态查询和动态查询。 代码 controller pa...
    99+
    2022-11-13
    MyBatis-Plus多表联查 MyBatis-Plus多表动态查询
  • mybatis多表查询的实现(xml方式)
    目录前言数据库表及关系一对多查询多对一及一对一查询总结前言 表之间的关系有几种:一对多、多对一、 一对一、多对多在多对一关系中,把多的部分拆成一个一个对象其实就是一对一关系,如账户和...
    99+
    2024-04-02
  • Java之Mybatis多层嵌套查询方式
    目录Mybatis多层嵌套查询表的存储sql文件实体类XMLMybatis多层嵌套查询(多对多)依赖实体类Setmeal实体类CheckGroup实体类CheckItemmapper...
    99+
    2024-04-02
  • Mybatis流式游标查询-大数据DB查询OOM查询问题
    问题场景 Mysql数据处理类型分以下三种 com.mysql.cj.protocol.a.result.ResultsetRowsStatic:普通查询,将结果集一次性全部拉取到内存 com.mysql.cj.protocol.a....
    99+
    2023-09-01
    mysql 性能优化 Powered by 金山文档
  • mybatis的动态SQL和模糊查询实例详解
    现在以一个例子来介绍mybatis的动态SQL和模糊查询:通过多条件查询用户记录,条件为姓名模糊匹配,并且年龄在某两个值之间。 新建表d_user: create table d...
    99+
    2024-04-02
  • MySQL查询缓存涉及多少参数
    本篇文章给大家分享的是有关MySQL查询缓存涉及多少参数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 查询缓存...
    99+
    2024-04-02
  • Mybatis mysql模糊查询方式(CONCAT多个字段)及bug
    目录Mybatis mysql模糊查询及bug解决方案:一解决方案:二mybatis多个字段如何模糊查询一个值Mybatis mysql模糊查询及bug 先看下如下xml SELE...
    99+
    2024-04-02
  • MyBatis 多表联合查询及优化方法
    目录背景正文关于优化这篇文章我打算来简单的谈谈 mybatis 的多表联合查询。起初是觉得挺简单的,没必要拿出来写,毕竟 mybatis 这东西现在是个开发的都会用,而且网上的文章也...
    99+
    2022-11-13
    MyBatis 多表联合查询 MyBatis 多表查询
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作