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

目录
  • MyBatis动态sql
    • 动态sql处理简单的多参数查询
    • 动态sql处理更新功能
  • 动态sql扩展
  • 动态sql处理集合参数
    • foreach标签处理数组类型参数
    • foreach标签处理List类型参数
    • foreach标签处理Map类型参数
  • 分页功能
    • 基于MySql的分页查询

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:

    //接口中
    /**
     * 根据名称,编码模糊查
     * @param name
     * @param code
     * @return
     */
    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:

    //接口中定义方法
    /**
     *多参查找
     * @param map
     * @return
     */
    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:

    //接口中的方法
    /**
     *修改的方法
     * @param provider
     * @return
     */
    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标签处理数组类型参数

    //接口中的方法
    /**
     * 同时查询多个供货商关联的入库单列表数据
     * @param args
     * @return
     */
    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集合
     * @param list
     * @return
     */
    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类型参数

    //接口中的方法
    /**
     * 多参数查询条件封装Map入参
     * @param map
     * @return
     */
    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的分页查询

//相应接口
	/**
     * 分页查询---多条件
     * @param newsId    根据类型id
     * @param title     根据标题名称模糊查
     * @param startRow  其实行号
     * @param pageSize  每页显示数量
     * @return          返回集合
     */
    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());
        }
    }

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

(0)

相关推荐

  • Mybatis如何通过出入Map参数作为条件进行查询

    目录 通过出入Map参数作为条件进行查询 Mybatis查询传递Map参数 使用场景 传参 持久层 生成sql 查询结果 通过出入Map参数作为条件进行查询 映射文件中查询语句部分: <!--通过map进行条件查询--> <select id="selectByMap" resultType="com.heiketu.testpackage.pojo.Product">     select * from Products where pro

  • Mybatis模糊查询之三种定义参数方法和聚合查询、主键回填实现方法

    目录 一.使用#定义参数 1. 持久层接口添加根据名字内容模糊查询方法 2. UserMapper.xml映射文件添加标签 3. 添加测试方法 4. 运行结果 二.使用$定义参数 1. UserMapper.xml映射文件更改标签内容 2. 修改测试方法 3. 运行结果 三.使用<bind>标签定义参数 1. UserMapper.xml映射文件更改标签内容 2. 运行结果 四.聚合查询 1. 持久层接口添加查询所有用户个数方法 2. UserMapper.xml添加标签 3. 添加测试方法

  • mybatis-plus 如何判断参数是否为空并作为查询条件

    目录 判断参数是否为空并作为查询条件 只需要在eq条件构造器中只需要添加一句判断即可 StringUtils.isNullOrEmpty()方法作用是 附上isNullOrEmpty()源码 ---[拓展]--- 查询时某些字段为null的问题 判断参数是否为空并作为查询条件 @Override     public Page<DemandEntity> selectByDepartmentDisplay(DemandEntity demandEntity) {         EntityW

  • Mybatis动态SQL的实现示例

    场景 在实际应用开发过程中,我们往往需要写复杂的 SQL 语句,需要拼接,而拼接SQL语句又稍微不注意,由于引号,空格等缺失可能都会导致错误. Mybatis提供了动态SQL,也就是可以根据用户提供的参数,动态决定查询语句依赖的查询条件或SQL语句的内容. 动态SQL标签 if 和 where 标签 <!--动态Sql : where / if--> <select id="dynamicSql" resultType="com.lks.domain.Use

  • mybatis动态sql之Map参数的讲解

    mybatis 动态sql之Map参数 Mapper文件: <mapper namespace="com.cn.shoje.oa.modules.logistics.dao.PurcDao"> <select id="findAll" parameterType="Map" resultType="Purchase"> select * from prod_purchase where 1=1 <

  • 解析Mybatis对sql表的一对多查询问题

    Mybatisd对sql表的一对多查询 select * from projectrecord pr left join projects po on po.pid=pr.pid left join emp e on e.empno = pr.empno where pr.pid=1 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.or

  • MyBatis 动态SQL和缓存机制实例详解

    有的时候需要根据要查询的参数动态的拼接SQL语句 常用标签: - if:字符判断 - choose[when...otherwise]:分支选择 - trim[where,set]:字符串截取,其中where标签封装查询条件,set标签封装修改条件 - foreach: if案例 1)在EmployeeMapper接口文件添加一个方法 public Student getStudent(Student student); 2)如果要写下列的SQL语句,只要是不为空,就作为查询条件,如下所示,这样

  • MyBatis动态SQL标签用法实例详解

    1.动态SQL片段 通过SQL片段达到代码复用 <!-- 动态条件分页查询 --> <sql id="sql_count"> select count(*) </sql> <sql id="sql_select"> select * </sql> <sql id="sql_where"> from icp <dynamic prepend="where&quo

  • Mybatis4 之Mybatis动态sql的实现代码

    1.什么是动态SQL 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.Mybatis的动态SQL功能正是为了解决这种问题, 其通过 if, choose, when, otherwise, trim, where, set, foreach标签,可组合成非常灵活的SQL语句,从而提高开发人员的效率. SQL语句不固定, 会根据前台用户的操作而进行变化的SQL语句, 可以被称之为动态SQL. 在MyBatis中, 提供了一组标签,

  • Mybatis 动态SQL的几种实现方法

    案例sql脚本 DROP DATABASE IF EXISTS `javacode2018`; CREATE DATABASE `javacode2018`; USE `javacode2018`; DROP TABLE IF EXISTS t_user; CREATE TABLE t_user( id int AUTO_INCREMENT PRIMARY KEY COMMENT '用户id', name VARCHAR(32) NOT NULL DEFAULT '' COMMENT '用户名'

  • Mybatis动态SQL实例详解

    动态SQL 什么是动态SQL? MyBatis的官方文档中是这样介绍的? 动态 SQL 是 MyBatis 的强大特性之一.如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号.利用动态 SQL,可以彻底摆脱这种痛苦. 使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性. 如果你之前用过 JS

  • Mybatis动态SQL之IF语句详解

    Mysql 5.0 以后,支持了动态sql语句,我们可以通过传递不同的参数得到我们想要的值. 1. Mybatis–动态SQL之IF语句 没有搭建环境的请点击 1.1 BlogMapper.java // 查询博客 List<Blog> queryBlogIf(Map map); 1.2 BlogMapper.xml <select id="queryBlogIf" parameterType="map" resultType="Blog

  • MyBatis动态SQL标签的用法详解

    1.MyBatis动态SQL MyBatis 的强大特性之一便是它的动态 SQL,即拼接SQL字符串.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号.利用动态 SQL 这一特性可以彻底摆脱这种痛苦. 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中. 动态 SQL 元素和

随机推荐