• JAVA框架 Mybaits 动态sql


    动态sql

    一:if标签使用:

    我们在查询的时候,有时候由于查询的条件的不确定性,导致where的后面的条件的不同,这时候就需要我们进行where后面的条件进行拼接。

    Mapper配置文件:

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE mapper
     3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     5 <mapper namespace="jd.com.vodemo.voMapper" >
     6     <select id="findAccByIdAndName" resultType="jd.com.mybaitstest.account" parameterType="jd.com.vodemo.vodemo">
     7         SELECT    * FROM t_account WHERE 1=1 AND
     8         <if test="ac.name!=null and ac.name!=''">
     9             NAME LIKE '%${ac.name}%'
    10         </if>
    11         <if test="ac.id!=null and ac.id!=''">
    12             AND id >#{ac.id}
    13         </if>
    14     </select>
    15 </mapper>

     注意:我们需要使用SELECT    * FROM t_account WHERE 1=1 AND  条件1 AND 条件2.。。。。。这种使用。

    其中if标签中的test表达式是测试条件和字段是否为空或者nul,注意这里也是属性.属性。

    实际的输出语句:

    2018-04-25 18:40:14,733 DEBUG [main] voMapper.findAccByIdAndName.debug:139 | ==>  Preparing: SELECT * FROM t_account WHERE 1=1 AND NAME LIKE '%ok%' AND id >?

    二、where标签:可以帮我们补全where关键字也不需要1=1的条件:

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE mapper
     3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     5 <mapper namespace="jd.com.vodemo.voMapper" >
     6     <select id="findAccByIdAndName" resultType="jd.com.mybaitstest.account" parameterType="jd.com.vodemo.vodemo">
     7         SELECT    * FROM t_account
     8         <where>
     9             <if test="ac.name!=null and ac.name!=''">
    10                 NAME LIKE '%${ac.name}%'
    11             </if>
    12             <if test="ac.id!=null and ac.id!=''">
    13                  And id >#{ac.id}
    14             </if>
    15         </where>
    16 
    17     </select>
    18 </mapper>

    sql语句:

    如果别的查询语句也需要这些条件 我们可以进行重用

     在<mapper>标签下面 使用sql标签。

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE mapper
     3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     5 <mapper namespace="jd.com.vodemo.voMapper" >
     6     <sql id="useMangCon" >
     7         <where>
     8             <if test="ac.name!=null and ac.name!=''">
     9                 NAME LIKE '%${ac.name}%'
    10             </if>
    11             <if test="ac.id!=null and ac.id!=''">
    12                 And id >#{ac.id}
    13             </if>
    14         </where>
    15     </sql>
    16     <select id="findAccByIdAndName" resultType="jd.com.mybaitstest.account" parameterType="jd.com.vodemo.vodemo" >
    17 
    18         SELECT    * FROM t_account
    19     <include refid="useMangCon" />
    20 
    21     </select>
    22 </mapper>

    其种id是唯一是别人调用的时候标识。

    相应的引用使用的标签是include标签。

    1 <include refid="useMangCon" />

     这样这部分的条件可以进行复用。

    三、foreach的标签

    当前端传来一些列的id,为列表的时候,我们可以使用id进行查询。这时候sql使用的是in而 不是or  or的效率很低。

    1           <foreach collection="ids" item="xx" open="where id IN (" close=")" separator="," >
    2                 #{xx}
    3             </foreach>

    首先了解下foreach的里的属性意思:

    1、collection:集合,就是传入的变量的集合的名称。这个需要跟你传入的对象内的属性字段相对应!

    2、item:循环的元素,将元素放入这个item中(是将ids的元素放在item里面不是一个而是整个集合)。

    3、open:循环开始的拼接符。

    4、colse:循环结束的拼接符。

    5、separator:就是sql语句中集合内的元素之间的分隔符。

    6、#{xx}:取出item的集合。这个名字要和item的名字一样。因为是同一个变量的名称。

    完整的例子:

     1     <select id="findAccByIdList" parameterType="jd.com.vodemo.vodemo" resultType="jd.com.mybaitstest.account" >
     2         SELECT * FROM t_account
     3         <!--<where>-->
     4             <foreach collection="ids" item="xx" open="where id IN (" close=")" separator="," >
     5                 #{xx}
     6             </foreach>
     7         <!--</where>-->
     8 
     9 
    10     </select>

    其中的where标签可以有也可以没有,只是在foreach中的open拼接的时候需要注意带不带where就可以。

    其中parameterType不能写:List<Integer> 会报:columnNumber: 53; 与元素类型 "select" 相关联的 "parameterType" 属性值不能包含 '<' 字符 所以传入对象。

    vo类:

     1 package jd.com.vodemo;
     2 import jd.com.mybaitstest.account;
     3 
     4 import java.util.List;
     5 
     6 public class vodemo {
     7     private List<Integer> ids;
     8 
     9     private account ac;
    10 
    11     public void setAc(account ac) {
    12         this.ac = ac;
    13     }
    14 
    15     public account getAc() {
    16         return ac;
    17     }
    18 
    19     public void setIds(List<Integer> ids) {
    20         this.ids = ids;
    21     }
    22 
    23     public List<Integer> getIds() {
    24         return ids;
    25     }
    26 }

    接口:

    1 package jd.com.vodemo;
    2 import  jd.com.mybaitstest.account;
    3 import java.util.List;
    4 
    5 public interface voMapper {
    6 
    7     List<account> findAccByIdAndName(vodemo vo);
    8     List<account> findAccByIdList(vodemo vo);
    9  }

    mapper类:

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE mapper
     3         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     4         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     5 <mapper namespace="jd.com.vodemo.voMapper" >
     6     <sql id="useMangCon" >
     7         <where>
     8             <if test="ac.name!=null and ac.name!=''">
     9                 NAME LIKE '%${ac.name}%'
    10             </if>
    11             <if test="ac.id!=null and ac.id!=''">
    12                 And id >#{ac.id}
    13             </if>
    14         </where>
    15     </sql>
    16     <select id="findAccByIdAndName" resultType="jd.com.mybaitstest.account" parameterType="jd.com.vodemo.vodemo" >
    17 
    18         SELECT    * FROM t_account
    19     <include refid="useMangCon" />
    20 
    21     </select>
    22     <select id="findAccByIdList" parameterType="List<Integer>" resultType="jd.com.mybaitstest.account" >
    23         SELECT * FROM t_account
    24         <!--<where>-->
    25             <foreach collection="ids" item="xx" open="where id IN (" close=")" separator="," >
    26                 #{xx}
    27             </foreach>
    28         <!--</where>-->
    29 
    30 
    31     </select>
    32 </mapper>
  • 相关阅读:
    机器学习之--数据构造,函数图显示
    python 用xlwt包把数据导出到excel表中
    python实现Hbase
    Hbase命令
    scrapy Formrequest用法(豆瓣登录案例)
    scrapy meta不用pipe用命令-o
    scrapy之Crawspider 腾讯招聘实战案例
    scrapy选择器归纳
    scrapy response.xpath可以提取包含字符XX的标签
    初涉.....编码__列表__字典
  • 原文地址:https://www.cnblogs.com/evilliu/p/8946367.html
Copyright © 2020-2023  润新知