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

2184 0
Honkers 2022-11-9 09:25:09 | 显示全部楼层 |阅读模式
目录

    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标签
语法
  1. <if test="条件判断">
  2. ....Sql语句
  3. </if>
  4. <!--如果test内容为true则执行if内的sql语句,反之则不执行-->
复制代码
where标签
语法
  1. <where>
  2.   <if test="条件判断">
  3.   ....Sql语句
  4.   </if>
  5. </where>
  6. <!--where标签用来替换sql语句中where关键词-->
复制代码
Eg:     
  1. //接口中
  2. /**
  3.   * 根据名称,编码模糊查
  4.   * @param name
  5.   * @param code
  6.   * @return
  7.   */
  8.   List<SmbmsProvider> listbyCodeAndName(@Param("name")String name,
  9.                      @Param("code")String code);
复制代码
  1. <!--相应的mapper映射文件-->
  2. <!--因为传入的参数是基本数据类型,所以parameterType属性可省略-->
  3. <select id="listbyCodeAndName" resultType="com.smbms.pojo.SmbmsProvider">
  4.     select * from smbms_provider
  5.   <!--where标签 代替sql中的where关键词-->
  6.     <where>
  7.       <!--符合if条件的则执行相应的sql语句-->
  8.       <if test="name!=null"> and proName like concat('%',#{name},'%')     </if>
  9.       <if test="code!=null"> and proCode like concat('%',#[code],'%')</if>
  10.     </where>
  11.   </select>
复制代码
  1. //测试类
  2.   @Test
  3.   void listbyCodeAndName() {
  4.     List<SmbmsProvider> list=mapper.listbyCodeAndName("北","0");
  5.     for (SmbmsProvider smbmsProvider : list) {
  6.       System.out.println(smbmsProvider.getProName());
  7.     }
  8.   }
复制代码
choose(when,otherwise)标签
语法
  1. <choose>
  2. <when test="判断条件">
  3.     sql语句...
  4.   </when>
  5.   <when test="判断条件">
  6.     sql语句...
  7.   </when>
  8. <otherwise>
  9.     sql语句...
  10.   </otherwise>
  11. </choose>
  12. <!--此标签相当于java中的switch语句功能-->
复制代码
总结:
1,choose(when,otherwise)是一个组合标签,when和otherwise写在choose标签中。
2,当when标签中的test属性判断为true,就会执行他所包含的语句。
3,choose中的多个when标签指挥执行匹配成功的第一个,执行之后就跳出choose标签。
4,当所有的when标签中的test属性判断都为false时,进入otherwise标签。
Eg:      
  1. //接口中定义方法
  2. /**
  3.   *多参查找
  4.   * @param map
  5.   * @return
  6.   */
  7.   List<SmbmsProvider> listByMoreParam(Map<String,Object> map);
复制代码
  1. <!--相应的mapper映射文件-->
  2. <select id="listByMoreParam" parameterType="map" resultType="com.smbms.pojo.SmbmsProvider">
  3.     select * from smbms_provider
  4.     <where>
  5.       <!--多选一的choose标签-->
  6.       <choose>
  7.         <when test="name!=null and name!=''"> and proName LIKE   CONCAT('%',#{name},'%')</when>
  8.         <when test="code!=null and code!=''"> and proCode LIKE CONCAT('%',#[code],'%')</when>
  9.         <when test="contact!=null and contact!=''"> and proName LIKE CONCAT('%',#{proContact},'%')</when>
  10.         <otherwise> and YEAR(creationDate) = YEAR(#{creationDate})</otherwise>
  11.       </choose>
  12.     </where>
  13.   </select>
复制代码
  1. //测试类
  2. @Test
  3.   void listByMoreParam() {
  4.     try {
  5.       Map<String,Object> map=new HashMap<>();
  6.       map.put("name","优百");
  7.       map.put("code","002");
  8.       map.put("contact",null);
  9.       map.put("creationDate",new SimpleDateFormat("yyyy-MM-dd").parse("2013-03-21"));
  10.       List<SmbmsProvider> list=mapper.listByMoreParam(map);
  11.       for (SmbmsProvider smbmsProvider : list) {
  12.         System.out.println(smbmsProvider.getProName());
  13.       }
  14.     } catch (ParseException e) {
  15.       e.printStackTrace();
  16.     }
  17.   }
复制代码
动态sql处理更新功能

set标签
语法
  1. <set>
  2. <if test="判断条件">
  3.    sql语句...
  4.   </if>
  5. </set>
复制代码
Eg:     
  1. //接口中的方法
  2.   /**
  3.   *修改的方法
  4.   * @param provider
  5.   * @return
  6.   */
  7.   int updateProviderInfo(SmbmsProvider provider);
复制代码
  1. <!--相应的mapper映射文件-->
  2. <update id="updateProviderInfo" parameterType="com.smbms.pojo.SmbmsProvider">
  3.     update `smbms_provider`
  4.   <!--set标签可以智能的忽略多余的逗号-->
  5.     <set>
  6.       <if test="proCode!=null">proCode=#{proCode},</if>
  7.       <if test="proName!=null">proName=#{proName},</if>
  8.       <if test="proDesc!=null">proDesc=#{proDesc},</if>
  9.       <if test="proContact!=null">proContact=#{proContact},</if>
  10.       <if test="proPhone!=null">proPhone=#{proPhone},</if>
  11.       <if test="proAddress!=null">proAddress=#{proAddress},</if>
  12.       <if test="proFax!=null">proFax=#{proFax},</if>
  13.       <if test="createdBy!=null">createdBy=#{createdBy,</if>
  14.       <if test="creationDate!=null">creationDate=#{creationDate},</if>
  15.       <if test="modifyDate!=null">modifyDate=#{modifyDate},</if>
  16.       <if test="modifyBy!=null">modifyBy=#{modifyBy},</if>
  17.     </set>
  18.     where id=#{id}
  19.   </update>
  20. <!--此方法中的if判断条件针对的是传入对象参数中部分属性有值-->
复制代码
  1. //测试类
  2.   @Test
  3.   void updateProviderInfo() {
  4.     result= mapper.updateProviderInfo(new SmbmsProvider("aaaa","sdsd",15L));
  5.     System.out.println(result);
  6.   }
复制代码
总结:
where,set标签能够动态的为sql语句添加前后缀,并可以只能的忽略标签前后多余的and,or或者逗号等字符。

动态sql扩展

trim标签
语法
  1. <trim prefix="前缀" suffix="后缀" prefixOverrides="忽略前缀" suffixOverrides="忽略后缀">
  2. ....
  3. </trim>
复制代码
其属性介绍
属性说明
perfix前缀,可自动对trim标签所包含的语句是否有返回值进行判断,如果有返回值,则为sql语句拼接相应前缀
suffix后缀,在trim标签包含的语句末尾拼接后缀。
prefixOverrides忽略的前缀,忽略trim标签内部首部指定的内容。此属性中字符 | 意为 或 。字符 ‘|’ 与前后的字符之间不能有空格。
suffixOverrides忽略的后缀,忽略trim标签包含内容尾部指定的内容。
eg:
  1.     <!--相应的mapper映射文件-->
  2. <update id="updateProviderInfo" parameterType="com.smbms.pojo.SmbmsProvider">
  3.         update `smbms_provider`
  4.         <!--使用冬天标签进行修改操作-->
  5.         <trim prefix="set" suffixOverrides="," suffix=" where id=#{id}">
  6.             <if test="proCode!=null">proCode=#{proCode},</if>
  7.             <if test="proName!=null">proName=#{proName},</if>
  8.             <if test="proDesc!=null">proDesc=#{proDesc},</if>
  9.             <if test="proContact!=null">proContact=#{proContact},</if>
  10.             <if test="proPhone!=null">proPhone=#{proPhone},</if>
  11.             <if test="proAddress!=null">proAddress=#{proAddress},</if>
  12.             <if test="proFax!=null">proFax=#{proFax},</if>
  13.             <if test="createdBy!=null">createdBy=#{createdBy,</if>
  14.             <if test="creationDate!=null">creationDate=#{creationDate},</if>
  15.             <if test="modifyDate!=null">modifyDate=#{modifyDate},</if>
  16.             <if test="modifyBy!=null">modfyBy=#{modifyBy},</if>
  17.         </trim>
  18.     </update>
复制代码
动态sql处理集合参数

语法:
  1.   <foreach collection="参数名称" item="元素别名"
  2.    open="(" separator="," close=")" index="当前元素位置下标">
  3.       #{元素别名}
  4.   </foreach>
复制代码
其属性介绍
属性说明
item为集合或数组中的元素取的别名。
open起始位置的拼接字符,表示in语句以 ( 开始。
separator元素之间的连接符,表示 in 语句中的元素之间以 ,连接。
close结束位置的拼接字符,表示 in语句以 )结束。
collection参数名称当参数类型为数组时,默认参数名为array。当参数类型为list集合时,默认参数为list。当参数类型为Map集合时,参数名为Map集合元素所在键值对的key。当参数类型为对象时,参数名为对象中集合类型的属性名。

foreach标签处理数组类型参数     
  1. //接口中的方法
  2. /**
  3.   * 同时查询多个供货商关联的入库单列表数据
  4.   * @param args
  5.   * @return
  6.   */
  7.   List<SmbmsBill> listBySomeProviderId(Integer [] args);
复制代码
  1. <!--相应的mapper映射文件--> <select id="listBySomeProviderId" resultType="com.smbms.pojo.SmbmsBill">
  2.     SELECT *
  3.     FROM `smbms_bill`
  4.     WHERE `providerId` in
  5.     <foreach collection="array" item="item" open="(" separator="," close=")" >
  6.       #{item}
  7.     </foreach>
  8.   </select>
复制代码
  1. //测试类
  2.   @Test
  3.   void listBySomeProviderId() {
  4.     Integer [] someId={1,2,3};
  5.     List<SmbmsBill> list= billMapper.listBySomeProviderId(someId);
  6.     System.out.println(list.size());
  7.     for (SmbmsBill bill : list) {
  8.       System.out.println(bill.getProductName());
  9.     }
  10.   }
复制代码
foreach标签处理List类型参数
  1. //相应接口
  2.   /**
  3.   * 查询多个供货商关联的入库单列表数据参数未list集合
  4.   * @param list
  5.   * @return
  6.   */
  7.   List<SmbmsBill> listBySomeProviderIdInList(@Param("list")List<Integer> list);
复制代码
  1. <!--相应的mapper映射文件-->
  2. <select id="listBySomeProviderIdInList" resultType="com.smbms.pojo.SmbmsBill">
  3.     SELECT *
  4.     FROM `smbms_bill`
  5.     WHERE `providerId` in
  6.     <foreach collection="list" item="item" open="(" separator="," close=")" >
  7.       #{item}
  8.     </foreach>
  9.   </select>
复制代码
  1. //测试类
  2.   @Test
  3.   void listBySomeProviderIdInList() {
  4.     List<Integer> listParam=new ArrayList<>();
  5.     listParam.add(1);
  6.     listParam.add(2);
  7.     listParam.add(3);
  8.     List<SmbmsBill> list= billMapper.listBySomeProviderIdInList(listParam);
  9.     System.out.println(list.size());
  10.     for (SmbmsBill bill : list) {
  11.       System.out.println(bill.getProductName());
  12.     }
  13.   }
复制代码
foreach标签处理Map类型参数
  1. //接口中的方法
  2.   /**
  3.   * 多参数查询条件封装Map入参
  4.   * @param map
  5.   * @return
  6.   */
  7.   List<SmbmsBill> listByCodeAndSomeProviderId(Map<String,Object> map);1
复制代码
  1. <!--相应的mapper映射文件-->
  2.   <!--入参类型为map-->
  3.   <select id="listByCodeAndSomeProviderId" parameterType="map"
  4.       resultType="com.smbms.pojo.SmbmsBill">
  5.     SELECT *
  6.     FROM `smbms_bill`
  7.     <where>
  8.       <!--code为map集合中的key-->
  9.       <if test="code!=null">
  10.         AND `billCode` LIKE CONCAT('%',#[code],'%')
  11.       </if>
  12.       <if test="providerIds!=null">
  13.         AND `providerId` IN
  14.          <!--providerIds为map集合中的key-->
  15.         <foreach collection="providerIds"
  16.             open="(" separator="," close=")" item="items">
  17.           #{items}
  18.         </foreach>
  19.       </if>
  20.     </where>
  21.   </select>
复制代码
  1. //测试类
  2.   @Test
  3.   void listByCodeAndSomeProviderId() {
  4.     List<Integer> providerIds=new ArrayList<>();
  5.     providerIds.add(1);
  6.     providerIds.add(2);
  7.     providerIds.add(3);
  8.     Map<String,Object> map=new HashMap<>();
  9.     map.put("providerIds",providerIds);
  10.     map.put("code","1");
  11.     List<SmbmsBill> list= billMapper.listByCodeAndSomeProviderId(map);
  12.     System.out.println(list.size());
  13.   }
复制代码
注意:
1,当参数为基本数据类型或数组,List集合类型时,myBatis框架会将参数封装在一个Map对象中。
2,当参数为数组时,collection对应值默认为array.
3,当参数为List集合类型时,collection对应值默认为list.
4,当参数为Map对象时,collection对应值为该Map对象中数组或集合元素对应的key.
5,如果使用@Param注解为参数设置了名称,collection对应值为参数名。
6,当参数为对象类型时,独享中有查询条件所需的集合属性,collection对应值为该集合属性名称。

分页功能


基于MySql的分页查询
  1. //相应接口
  2.         /**
  3.      * 分页查询---多条件
  4.      * @param newsId    根据类型id
  5.      * @param title     根据标题名称模糊查
  6.      * @param startRow  其实行号
  7.      * @param pageSize  每页显示数量
  8.      * @return          返回集合
  9.      */
  10.     List<NewsDetail> listByPageInMoreParam(@Param("newsId")int newsId,
  11.                                            @Param("title")String title,
  12.                                            @Param("startRow")int startRow,
  13.                                            @Param("pageSize")int pageSize);
复制代码
  1. <!--相应的mapper映射文件-->
  2. <select id="listByPageInMoreParam" resultType="com.news.pojo.NewsDetail">
  3.         SELECT  * FROM `news_detail`
  4.         <where>
  5.             <if test="title != null and title != ''">
  6.                 and  `title` LIKE CONCAT('%',#{title},'%')
  7.             </if>
  8.             <if test="newsId != null and newsId!=-1">
  9.                 AND `categoryId`=#{newsId}
  10.             </if>
  11.         </where>
  12.         limit #{startRow} ,#{pageSize}
  13.     </select>
复制代码
  1.         //测试类
  2.          @Test
  3.     void listByPageInMoreParam() {
  4.     NewDetailMapper mapper= MyBatisUtil.getSqlSession().getMapper(NewDetailMapper.class);
  5.         List<NewsDetail> list= mapper.listByPageInMoreParam(2,null,0,2);
  6.         System.out.println(list.size());
  7.         for (NewsDetail detail : list) {
  8.             System.out.println(detail.getTitle());
  9.         }
  10.     }
复制代码
以上为个人经验,希望能给大家一个参考,也希望大家多多支持中国红客联盟。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Honkers

荣誉红客

关注
  • 4004
    主题
  • 36
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行