精华内容
下载资源
问答
  • mybatis的常用动态sql标签

    万次阅读 多人点赞 2019-03-24 17:29:17
    定义 sql 语句 select 标签 属性介绍: id :唯一的标识符. parameterType:传给此语句的参数的全路径名或别名 例:com.test.poso.User 或 user resultType :语句返回值类型或别名。注意,如果是集合,那么这里填写的...

    一. 定义 sql 语句

    select 标签

    属性介绍:

    • id :唯一的标识符.
    • parameterType:传给此语句的参数的全路径名或别名 例:com.test.poso.User 或 user
    • resultType :语句返回值类型或别名。注意,如果是集合,那么这里填写的是集合的泛型,而不是集合本身(resultType 与 resultMap 不能并用)
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="Object">
        select * from student where id=#{id}
    </select>
    

    insert 标签

    属性介绍:

    • id :唯一的标识符
    • parameterType:传给此语句的参数的全路径名或别名 例:com.test.poso.User
    <insert id="insert" parameterType="Object">
        insert into student
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="name != null"> NAME, </if>
        </trim>
        <trim prefix="values(" suffix=")" suffixOverrides=",">
            <if test="name != null"> #{name}, </if>
         </trim>
    </insert>
    

    delete 标签

    属性同 insert

    <delete id="deleteByPrimaryKey" parameterType="Object">
        delete from student where id=#{id}
    </delete>
    

    update 标签

    属性同 insert

    二. 配置 JAVA 对象属性与查询结果集中列名对应关系

    resultMap 标签的使用
    基本作用:

    • 建立 SQL 查询结果字段与实体属性的映射关系信息
    • 查询的结果集转换为 java 对象,方便进一步操作。
    • 将结果集中的列与 java 对象中的属性对应起来并将值填充进去

    !注意:与 java 对象对应的列不是数据库中表的列名,而是查询后结果集的列名

    <resultMap id="BaseResultMap" type="com.online.charge.platform.student.model.Student">
        <id property="id" column="id" />
        <result column="NAME" property="name" />
        <result column="HOBBY" property="hobby" />
        <result column="MAJOR" property="major" />
        <result column="BIRTHDAY" property="birthday" />
        <result column="AGE" property="age" />
    </resultMap>
    
    <!--查询时resultMap引用该resultMap -->
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="Object">
        select id,name,hobby,major,birthday,age from student where id=#{id}
    </select>
    

    标签说明:

    主标签:

    • id:该 resultMap 的标志
    • type:返回值的类名,此例中返回 Studnet 类

    子标签:

    • id:用于设置主键字段与领域模型属性的映射关系,此处主键为 ID,对应 id。
    • result:用于设置普通字段与领域模型属性的映射关系

    三. 动态 sql 拼接

    if 标签

    if 标签通常用于 WHERE 语句、UPDATE 语句、INSERT 语句中,通过判断参数值来决定是否使用某个查询条件、判断是否更新某一个字段、判断是否插入某个字段的值。

    <if test="name != null and name != ''">
        and NAME = #{name}
    </if>
    

    foreach 标签

    foreach 标签主要用于构建 in 条件,可在 sql 中对集合进行迭代。也常用到批量删除、添加等操作中。

    <!-- in查询所有,不分页 -->
    <select id="selectIn" resultMap="BaseResultMap">
        select name,hobby from student where id in
        <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
            #{item}
        </foreach>
    </select>
    

    属性介绍:

    • collection:collection 属性的值有三个分别是 list、array、map 三种,分别对应的参数类型为:List、数组、map 集合。
    • item :表示在迭代过程中每一个元素的别名
    • index :表示在迭代过程中每次迭代到的位置(下标)
    • open :前缀
    • close :后缀
    • separator :分隔符,表示迭代时每个元素之间以什么分隔

    choose 标签

    有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。MyBatis 提供了 choose 元素,按顺序判断 when 中的条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when
    的条件都不满则时,则执行 otherwise 中的 sql。类似于 Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。

    if 是与(and)的关系,而 choose 是或(or)的关系。

    <select id="getStudentListChoose" parameterType="Student" resultMap="BaseResultMap">
        SELECT * from STUDENT WHERE 1=1
        <where>
            <choose>
                <when test="Name!=null and student!='' ">
                    AND name LIKE CONCAT(CONCAT('%', #{student}),'%')
                </when>
                <when test="hobby!= null and hobby!= '' ">
                    AND hobby = #{hobby}
                </when>
                <otherwise>
                    AND AGE = 15
                </otherwise>
            </choose>
        </where>
    </select>
    

    四. 格式化输出

    where 标签

    当 if 标签较多时,这样的组合可能会导致错误。 如下:

    <select id="getStudentListWhere" parameterType="Object" resultMap="BaseResultMap">
        SELECT * from STUDENT WHERE
        <if test="name!=null and name!='' ">
            NAME LIKE CONCAT(CONCAT('%', #{name}),'%')
        </if>
        <if test="hobby!= null and hobby!= '' ">
            AND hobby = #{hobby}
        </if>
    </select>
    

    当 name 值为 null 时,查询语句会出现 “WHERE AND” 的情况,解决该情况除了将"WHERE"改为“WHERE 1=1”之外,还可以利用 where
    标签。这个“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以 AND 或 OR 开头的,则它会剔除掉。

    <select id="getStudentListWhere" parameterType="Object" resultMap="BaseResultMap">
        SELECT * from STUDENT
        <where>
            <if test="name!=null and name!='' ">
                NAME LIKE CONCAT(CONCAT('%', #{name}),'%')
            </if>
            <if test="hobby!= null and hobby!= '' ">
                AND hobby = #{hobby}
            </if>
        </where>
    </select>
    

    set 标签

    没有使用 if 标签时,如果有一个参数为 null,都会导致错误。当在 update 语句中使用 if 标签时,如果最后的 if 没有执行,则或导致逗号多余错误。使用 set 标签可以将动态的配置 set
    关键字,和剔除追加到条件末尾的任何不相关的逗号。

    <update id="updateStudent" parameterType="Object">
        UPDATE STUDENT
        SET NAME = #{name},
        MAJOR = #{major},
        HOBBY = #{hobby}
        WHERE ID = #{id};
    </update>
    
    <update id="updateStudent" parameterType="Object">
        UPDATE STUDENT SET
        <if test="name!=null and name!='' ">
            NAME = #{name},
        </if>
        <if test="hobby!=null and hobby!='' ">
            MAJOR = #{major},
        </if>
        <if test="hobby!=null and hobby!='' ">
            HOBBY = #{hobby}
        </if>
        WHERE ID = #{id};
    </update>
    

    使用 set+if 标签修改后,如果某项为 null 则不进行更新,而是保持数据库原值。

    <update id="updateStudent" parameterType="Object">
        UPDATE STUDENT
        <set>
            <if test="name!=null and name!='' ">
                NAME = #{name},
            </if>
            <if test="hobby!=null and hobby!='' ">
                MAJOR = #{major},
            </if>
            <if test="hobby!=null and hobby!='' ">
                HOBBY = #{hobby}
            </if>
        </set>
        WHERE ID = #{id};
    </update>
    

    trim 标签

    格式化输出,也可以通过 trim 标签设定或忽略前后缀来实现,_详见我的另一博客_

    五. 配置关联关系

    5.1 collection 标签

    5.2 association 标签

    _关于关联映射关系,详细参考我的这篇博客_

    六. 定义常量及引用

    sql 标签

    当多种类型的查询语句的查询字段或者查询条件相同时,可以将其定义为常量,方便调用。为求 <select> 结构清晰也可将 sql 语句分解。

    ```
    <!-- 查询字段 -->
    <sql id="Base_Column_List">
        ID,MAJOR,BIRTHDAY,AGE,NAME,HOBBY
    </sql>
    
    <!-- 查询条件 -->
    <sql id="Example_Where_Clause">
        where 1=1
        <trim suffixOverrides=",">
            <if test="id != null and id !=''">
                and id = #{id}
            </if>
            <if test="major != null and major != ''">
                and MAJOR = #{major}
            </if>
            <if test="birthday != null ">
                and BIRTHDAY = #{birthday}
            </if>
            <if test="age != null ">
                and AGE = #{age}
            </if>
            <if test="name != null and name != ''">
                and NAME = #{name}
            </if>
            <if test="hobby != null and hobby != ''">
                and HOBBY = #{hobby}
            </if>
            <if test="sorting != null">
                order by #{sorting}
            </if>
            <if test="sort!= null and sort != ''">
                order by ${sort} ${order}
            </if>
        </trim>
    </sql>
    ```
    

    include 标签

    用于引用定义的常量

    <!-- 查询所有,不分页 -->
    <select id="selectAll" resultMap="BaseResultMap">
        SELECT
        <include refid="Base_Column_List" />
        FROM student
        <include refid="Example_Where_Clause" />
    </select>
    
    
    <!-- 分页查询 -->
    <select id="select" resultMap="BaseResultMap">
        select * from (
            select tt.*,rownum as rowno from
            (
                SELECT
                <include refid="Base_Column_List" />
                FROM student
                <include refid="Example_Where_Clause" />
                ) tt
                <where>
                    <if test="pageNum != null and rows != null">
                        and rownum
                        <![CDATA[<=]]>#{page}*#{rows}
                    </if>
                </where>
            ) table_alias
        where table_alias.rowno>#{pageNum}
    </select>
    
    
    <!-- 根据条件删除 -->
    <delete id="deleteByEntity" parameterType="java.util.Map">
        DELETE FROM student
        <include refid="Example_Where_Clause" />
    </delete>
    
    展开全文
  • mybatis常用动态sql标签

    千次阅读 2020-08-14 16:30:14
    mybatis常用动态sql标签主要有以下几种: 标签 作用 if 单条件分支,相当于判断语句 choose、when、otherwise 多条件分支,相当于Java中的switch语句 set、where、trim 辅助条件判断,用于拼接语句 ...

    动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

    背景: 我们在编写一些sql查询的过程时,根据条件进行sql的拼接是很麻烦而且容易出错。而mybatis动态sql标签,正好可以解决这个烦人的问题。

    mybatis常用的动态sql标签主要有以下几种:

    标签作用
    if单条件分支,相当于判断语句
    choose、when、otherwise多条件分支,相当于Java中的switch语句
    set、where、trim辅助条件判断,用于拼接语句
    foreach集合进行遍历(尤其是在构建 IN 条件语句的时候)
    bind创建一个变量,并将其绑定到当前的上下文

    1.if

    if 标签最常见情景是根据条件包含 where 子句的一部分,通过判断参数值来决定是否使用某个条件。

    <select id="findUser" resultType="User">
      SELECT * FROM user
      WHERE class = '160801'
      <if test="age != null">
        AND age > #{age}
      </if>
    </select>
    

    2.choose、when、otherwise

    有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。choose执行过程中按顺序判断 when 中的条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when的条件都不满则时,则执行 otherwise 中的 sql。

    <select id="getUser" resultMap="User">
        SELECT * from STUDENT WHERE 1=1
        <where>
            <choose>
    		    <when test="name!= null">
    		      AND name like #{name}
    		    </when>
    		    <when test="phone != null and address != null">
    		      AND age > #{age}
    		    </when>
    		    <otherwise>
    		      AND featured = 1
    		    </otherwise>
      		</choose>
        </where>
    </select>
    

    3. set、where、trim

    3.1 set

    在 update 语句中使用 if 标签时,如果最后的 if 没有执行,会导致逗号多余错误。使用 set 标签可以动态地在行首插入set关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)。

    
    #如果最后的if没有执行,会导致逗号多余错误。
    
    <update id="updateUser">
      update User SET
          <if test="name != null">
          	name =#{name},
          </if>
          <if test="age != null">
          	age=#{age},
          </if>
          <if test="phone != null">
          	phone =#{phone},
          </if>
          <if test="class != null">
          	class=#{class}
          </if>
      where id=#{id}
    </update>
    
    #set标签除掉条件末尾的逗号
    <update id="updateUser">
      update User 
          <if test="name != null">
          	name=#{name},
          </if>
          <if test="age != null">
          	age=#{age},
          </if>
          <if test="phone != null">
          	phone=#{phone},
          </if>
          <if test="class != null">
          	adress=#{adress}
          </if>
      where class=#{class}
    </update>
    

    3.2 where

    where 标签只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。这样我们就不用在where后面加一个1=1了

    <select id="findUser" resultType="User">
      SELECT * FROM user
    	<where>
    	    <if test="class != null">
    	         AND class = #{class}
    	    </if>
    	    <if test="phone != null and adress != null">
    	        AND age > #{age}
    	    </if>
      </where>
    </select>
    

    3.3 trim

    set 和 where 其实都是 trim 标签的一种类型, 该两种功能都可以使用 trim 标签进行实现。如果你不满足于where和set实现的功能你就可以使用trim来自定义实现。其中trim有四个主要的属性,分别是:

    • prefix:在sql语句加上前缀
    • suffix:在sql语句加上后缀
    • prefixOverrides:去除指定的前缀内容,比如:prefixOverrides=“AND | OR”,去除sql语句多余的前缀"AND"或者"OR"。
    • suffixOverrides:去除指定的后缀内容,比如:suffixOverrides=",",去除sql语句多余的逗号。

    自定义实现3.1的set,去除update语句后缀多余的逗号

    <update id="updateUser" resultType="User">
    	update user set 
    	<trim  suffixOverrides=",">
    		<if test="class != null">
    	         class = #{class},
    	    </if>
    	    <if test="phone != null and adress != null">
    	        age > #{age},
    	    </if>
    	</trim> 
    	where class=#{class}
    </update>
    

    自定义实现3.2的where,去除where子句前缀多余的AND

    <select id="findUser" resultType="User">
    	select * from user
    	<trim prefix="WHERE" prefixOverrides="AND | OR">
    		<if test="class != null">
    	        AND class = #{class}
    	    </if>
    	    <if test="phone != null and adress != null">
    	        AND age > #{age}
    	    </if>
    	</trim>
    </select>
    

    4.foreach

    在进行批量操作的时候,使用比较多的一个场景就是对集合进行遍历,尤其是在构建 IN 条件语句的时候。

    <select id="findUser" resultType="User">
      SELECT * FROM user
    	where class in
        <foreach item="item" index="index" collection="classList" open="(" separator="," close=")">
            #{item}
        </foreach>
    </select>
    

    foreach中的属性:

    • collection:通常有三种可选的值,List、数组、map 集合,其中list最为常用
    • item :集合项,也就是集合里面的值
    • index :遍历时的索引变量,也就是下标
    • open :前缀
    • close :后缀
    • separator :分隔符,每个值之间用什么分隔符来分割

    5.bind

    bind标签表示在表达式以外创建一个变量,并将其绑定到当前的上下文。

    <select id="queryUser" resultType="User">
      <bind name="pattern" value="'%' + name + '%'" />
      SELECT * FROM user
      WHERE name LIKE #{name}
    </select>
    

    参考文章:mybatis官网文档

    展开全文
  • Mybatis的动态sql标签

    2017-07-05 17:04:02
    常用动态SQL标签有:if、where、foreach; If标签:作为判断入参来使用的,如果符合条件,则把if标签体内的SQL拼接上。 注意:用if进行判断是否为空时,不仅要判断null,也要判断空字符串‘’; Where标签:会去掉...

    动态SQL

    通过Mybatis提供的各种动态标签实现动态拼接sql,使得mapper映射文件在编写SQL时更加灵活,方便。常用动态SQL标签有:if、where、foreach;

    1. If标签:作为判断入参来使用的,如果符合条件,则把if标签体内的SQL拼接上。
      注意:用if进行判断是否为空时,不仅要判断null,也要判断空字符串‘’;
      Where标签:会去掉条件中的第一个and符号。
    2. Foreach
      向sql传递数组或List时,mybatis使用foreach解析数组里的参数并拼接到SQL中。3
    3. SQL片段
      Mybatis提供了SQL片段的功能,可以提高SQL的可重用性。
    展开全文
  • Mybatis常用动态SQL标签有哪些

    千次阅读 2019-08-31 20:31:11
    适用于动态的包含where字句的一部分 if的特点是 当if的判断条件满足时,添加if标签中的字句 当if的判断条件不满足时,什么都不添加 choose: 适用于: 当判断的条件为true时,执行一个语句 当判断的条件为false时,...

    if:
    适用于动态的包含where字句的一部分
    if的特点是
    当if的判断条件满足时,添加if标签中的字句
    当if的判断条件不满足时,什么都不添加
    choose:
    适用于:
    当判断的条件为true时,执行一个语句
    当判断的条件为false时,执行另一个语句
    where和set:
    where的作用:
    1、当where标签中的语句不为空时,会在语句之前拼接上“where”关键字
    2、假如where标签中的语句是以“and”或者“or”开头,那么这个“and”或者“or”会被省略掉
    set的作用:
    1、假如set标签中的语句不为空,那么会在开头拼接“set”关键字
    2、假如set标签中的语句是以“,”结尾,那么这个“,”会被去掉
    Trim:
    prefix:前缀,在赶回的字符串之前添加什么内容
    suffix:后缀,在返回的字符串之后添加什么内容
    prefixoverrides:当字符串以其中的内容开头时,该内容会被覆盖
    suffixoverrides:当字符串以其中的内容结尾时,该内容会被覆盖
    Foreach:
    注意:当接口中方法的参数为数组或者集合时,mybatis会自动的把该参数封装成一个map
    map的key为参数类型,首字母小写
    默认:数组的key为“array”,集合的key为“list”,map的key为“map”
    collection:参数在封装成的map中的key值
    open:表示字符串以什么开始
    close:表示字符串以什么结束
    item:给集合中的每一个元素起的别名
    separator:集合中元素的分隔符

    展开全文
  • sql常用动态标签有哪些

    千次阅读 2018-09-21 08:30:04
    动态sql常用标签 If choose when otherwise trim where set foreach bind
  • Mybatis 动态SQL常用标签(模糊查询)

    千次阅读 2018-11-19 22:41:53
    动态 SQL MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一...
  • MyBatis学习之动态SQL标签

    千次阅读 2016-12-28 22:32:55
    在实际开发中,往往有一些复杂的SQL语句,MyBatis中就需要写一些动态的SQL语句,这时就需要借助于MyBatis中的OGNL表达式,这样可以很方便的实现一些复杂的逻辑,MyBatis中的动态SQL标签主要有以下几种: 1.if标签...
  • Mybatis动态SQL常用标签有:if标签、choose(when、otherwise)标签、trim(where、set)标签、foreach标签。以下展开介绍: if标签 if是常用的判断语句,常与test属性连用,或者与concat属性连用。 < select ...
  • 主要介绍了JSP中操作数据库的常用SQL标签用法总结,SQL标签封装了数据库访问的通用逻辑,可以简化数据库操作,需要的朋友可以参考下
  • Mybatis之动态sql标签

    万次阅读 多人点赞 2018-03-24 18:08:45
    1.Mybatis动态sql MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表...
  • 用mybatis 一个很爽的地方就是可以实现动态sql,构建动态sql我们需要了解一些标签 1. 判断 2 添加 where,如果where 后面紧跟“AND” 或者 “OR” 则 剔除掉 3. 添加set,如果有多余的逗号则剔除掉 4. 更...
  • mybatis中动态sql常用标签

    万次阅读 2017-05-05 16:56:36
    用来循环容器的标签forEach,查看例子 //mapper中我们要为这个方法传递的是一个容器,将容器中的元素一个一个的 //拼接到xml的方法中就要使用这个forEach这个标签了 public List queryById(List userids); //对应的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 81,653
精华内容 32,661
关键字:

常用动态sql标签