IT俱乐部 Java MyBatis动态sql查询及多参数查询方式

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

MyBatis动态sql

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

常用标签

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

if标签

语法

....Sql语句

where标签

语法

    
    ....Sql语句
    

Eg:     

    //接口中
    /**
     * 根据名称,编码模糊查
     * @param name
     * @param code
     * @return
     */
    List listbyCodeAndName(@Param("name")String name,
                                          @Param("code")String code);    
    
    

        select * from  smbms_provider
    
        
            
             and proName like concat('%',#{name},'%')                 
             and proCode like concat('%',#,'%')
        
    
    //测试类
     @Test
    void listbyCodeAndName() {
        List list=mapper.listbyCodeAndName("北","0");
        for (SmbmsProvider smbmsProvider : list) {
            System.out.println(smbmsProvider.getProName());
        }
    }

choose(when,otherwise)标签

语法

    
            sql语句...
    
    
         sql语句...
    
    
         sql语句...
    

总结:

​ 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 listByMoreParam(Map map);

        select * from smbms_provider
        
            
            
                 and proName LIKE         CONCAT('%',#{name},'%')
                 and proCode LIKE CONCAT('%',#,'%')
                 and proName LIKE CONCAT('%',#{proContact},'%')
                  and YEAR(creationDate) = YEAR(#{creationDate})
            
        
    
    //测试类
    @Test
    void listByMoreParam() {
        try {
            Map 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 list=mapper.listByMoreParam(map);
            for (SmbmsProvider smbmsProvider : list) {
                System.out.println(smbmsProvider.getProName());
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

动态sql处理更新功能

set标签

语法

    
        sql语句...
    

Eg:     

    //接口中的方法
    /**
     *修改的方法
     * @param provider
     * @return
     */
    int updateProviderInfo(SmbmsProvider provider);

        update `smbms_provider`
    
        
            proCode=#{proCode},
            proName=#{proName},
            proDesc=#{proDesc},
            proContact=#{proContact},
            proPhone=#{proPhone},
            proAddress=#{proAddress},
            proFax=#{proFax},
            createdBy=#{createdBy,
            creationDate=#{creationDate},
            modifyDate=#{modifyDate},
            modifyBy=#{modifyBy},
        
         where id=#{id}
    
    
    //测试类

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

​总结:

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

动态sql扩展

trim标签

语法

    ....

其属性介绍 

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

eg:

    
	

        update `smbms_provider`
        
        proCode=#{proCode},proName=#{proName},proDesc=#{proDesc},proContact=#{proContact},proPhone=#{proPhone},proAddress=#{proAddress},proFax=#{proFax},createdBy=#{createdBy,creationDate=#{creationDate},modifyDate=#{modifyDate},modifyBy=#{modifyBy},

动态sql处理集合参数

语法:

    
            #{元素别名}
    

其属性介绍 

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

foreach标签处理数组类型参数     

    //接口中的方法
    /**
     * 同时查询多个供货商关联的入库单列表数据
     * @param args
     * @return
     */
    List listBySomeProviderId(Integer [] args);
        
        SELECT *
        FROM `smbms_bill`
        WHERE `providerId`  in 
        
            #{item}
        
    
    //测试类
      @Test
    void listBySomeProviderId() {
        Integer []  someId={1,2,3};
        List 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 listBySomeProviderIdInList(@Param("list")List list);
    
    
        SELECT *
        FROM `smbms_bill`
        WHERE `providerId`  in
        
            #{item}
        
    
    //测试类
     @Test
    void listBySomeProviderIdInList() {
        List listParam=new ArrayList();
        listParam.add(1);
        listParam.add(2);
        listParam.add(3);
        List 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 listByCodeAndSomeProviderId(Map map);1

        
     
        SELECT *
        FROM `smbms_bill`
        
            
            
                AND `billCode` LIKE CONCAT('%',#,'%')
            
            
                AND `providerId` IN
                     
                
                    #{items}
                
            
        
    
    //测试类
     @Test
    void listByCodeAndSomeProviderId() {
        List providerIds=new ArrayList();
        providerIds.add(1);
        providerIds.add(2);
        providerIds.add(3);
        Map map=new HashMap();
        map.put("providerIds",providerIds);
        map.put("code","1");
        List 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 listByPageInMoreParam(@Param("newsId")int newsId,
                                           @Param("title")String title,
                                           @Param("startRow")int startRow,
                                           @Param("pageSize")int pageSize);

        SELECT  * FROM `news_detail`
        
                and  `title` LIKE CONCAT('%',#{title},'%')
            
                AND `categoryId`=#{newsId}
            
        limit #{startRow} ,#{pageSize}
    
	//测试类
	 @Test
    void listByPageInMoreParam() {
    NewDetailMapper mapper= MyBatisUtil.getSqlSession().getMapper(NewDetailMapper.class);
        List list= mapper.listByPageInMoreParam(2,null,0,2);
        System.out.println(list.size());
        for (NewsDetail detail : list) {
            System.out.println(detail.getTitle());
        }
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持IT俱乐部。

本文收集自网络,不代表IT俱乐部立场,转载请注明出处。https://www.2it.club/code/java/6765.html
上一篇
下一篇
联系我们

联系我们

在线咨询: QQ交谈

邮箱: 1120393934@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部