精华内容
下载资源
问答
  • 在实际开发过程中,我们往往需要编写复杂的SQL语句,拼接稍有不注意就会导致错误,Mybatis给开发者提供了动态SQL,大大降低了拼接SQL导致的错误。 动态标签 if标签 if标签通常用那个胡where语句,update语句,insert...
  • 主要介绍了MyBatis动态SQL foreach标签实现批量插入的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • mybatis动态SQL语句

    2018-04-28 10:40:17
    if 、where、set、trim、choose 、foreach等在mybatis中的具体用法,有具体实例可供参考,玩转mybatis
  • 大家对mybatis执行任意sql语句都了解,那么MyBatis执行动态SQL语句呢?下面脚本之家小编给大家解答下mybatis执行动态sql语句的方法,非常不错,感兴趣的朋友参考下吧
  • MyBatis动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis动态sql,需要的朋友可以参考下
  • Mybatis动态SQL的实现

    万次阅读 多人点赞 2019-02-27 19:28:42
    Mybatis提供了动态SQL,也就是可以根据用户提供的参数,动态决定查询语句依赖的查询条件或SQL语句的内容。 动态SQL标签 if 和 where 标签 <!--动态Sql : where / if--> <select ...

    场景

    在实际应用开发过程中,我们往往需要写复杂的 SQL 语句,需要拼接,而拼接SQL语句又稍微不注意,由于引号,空格等缺失可能都会导致错误。
    Mybatis提供了动态SQL,也就是可以根据用户提供的参数,动态决定查询语句依赖的查询条件或SQL语句的内容。

    动态SQL标签

    if 和 where 标签

      <!--动态Sql : where / if-->
        <select id="dynamicSql"  resultType="com.lks.domain.User">
            select <include refid="tableAllkey"/> from users
            <where>
                <if test="id != null and id != 0">
                    AND id = #{id}
                </if>
                <if test="name != null and name != ''">
                    AND name = #{name}
                </if>
                <if test="county != null and county != ''">
                    AND county = #{county}
                </if>
            </where>
        </select>
    

    一般开发列表业务的查询条件时,如果有多个查询条件,通常会使用 标签来进行控制。 标签可以自动的将第一个条件前面的逻辑运算符 (or ,and) 去掉,正如代码中写的,id 查询条件前面是有“and”关键字的,但是在打印出来的 SQL 中却没有,这就是 的作用。打印SQL语句的使用可以在mybatis-config文件中添加setting标签:

    <settings>
            <!-- 打印查询语句 -->
            <setting name="logImpl" value="STDOUT_LOGGING" />
        </settings>
    

    choose、when、otherwise 标签

    这三个标签需要组合在一起使用,类似于 Java 中的 switch、case、default。只有一个条件生效,也就是只执行满足的条件 when,没有满足的条件就执行 otherwise,表示默认条件。

     <!--动态Sql: choose、when、otherwise 标签-->
        <select id="dynamicSql2" resultType="com.lks.domain.User">
            select * from users
            <where>
                <choose>
                    <when test="name != null and name != ''">
                        AND name = #{name}
                    </when>
                    <when test="county != null and county != ''">
                        AND county = #{county}
                    </when>
                    <otherwise>
                        AND id = #{id}
                    </otherwise>
                </choose>
            </where>
        </select>
    

    在测试类中,即使同时添加name和county的值,最终的sql也只会添加第一个属性值。

    set 标签

    使用set标签可以将动态的配置 SET 关键字,并剔除追加到条件末尾的任何不相关的逗号。使用 if+set 标签修改后,在进行表单更新的操作中,哪个字段中有值才去更新,如果某项为 null 则不进行更新,而是保持数据库原值。

    <!--动态Sql: set 标签-->
        <update id="updateSet" parameterType="com.lks.domain.User">
            update users
            <set>
                <if test="name != null and name != ''">
                    name = #{name},
                </if>
                <if test="county != null and county != ''">
                    county = #{county},
                </if>
            </set>
            where id = #{id}
        </update>
    

    trim 标签

    trim 是一个格式化标签,可以完成< set > 或者是 < where > 标记的功能。主要有4个参数:
    ① prefix:前缀

    ② prefixOverrides:去掉第一个and或者是or

    ③ suffix:后缀

    ④ suffixOverrides:去掉最后一个逗号,也可以是其他的标记

    <!--动态Sql: trim 标签-->
        <select id="dynamicSqlTrim" resultType="com.lks.domain.User">
            select * from users
            <trim prefix="where" suffix="order by age" prefixOverrides="and | or" suffixOverrides=",">
                <if test="name != null and name != ''">
                    AND name = #{name}
                </if>
                <if test="county != null and county != ''">
                    AND county = #{county}
                </if>
            </trim>
        </select>
    

    foreach 标签

    foreach标签主要有以下参数:
    item :循环体中的具体对象。支持属性的点路径访问,如item.age,item.info.details,在list和数组中是其中的对象,在map中是value。
    index :在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。
    open :表示该语句以什么开始
    close :表示该语句以什么结束
    separator :表示元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。

    list批量插入
        <!--动态Sql: foreach标签, 批量插入-->
            <insert id="dynamicSqlInsertList" useGeneratedKeys="true" keyProperty="id">
                insert into users (name, age, county, date)
                values
                <foreach collection="list" item="user" separator="," >
                    (#{user.name}, #{user.age}, #{user.county}, #{user.date})
                </foreach>
            </insert>
    

    在这里插入图片描述
    从结果可以看出,我们一下插入了两条数据,每条数据之间使用“,”进行分割,separator="," 的作用就是如此。其中< foreach >标签内部的属性务必加上item.

    list集合参数
      <!--动态Sql: foreach标签, list参数查询-->
        <select id="dynamicSqlSelectList" resultType="com.lks.domain.User">
            SELECT * from users WHERE id in
            <foreach collection="list" item="id" open="(" close=")" separator="," >
                #{id}
            </foreach>
        </select>
    

    在这里插入图片描述
    可以看出我们的 SQL 语句新增了:( ? , ? ) ,前后的括号由 open="(" close=")" 进行控制,用“?”占位符占位,并通过separator以:“,”隔开,内部两个循环遍历出的元素。array 集合与 list 的做法也是类似的:

    <!--动态Sql: foreach标签, array参数查询-->
        <select id="dynamicSqlSelectArray" resultType="com.lks.domain.User">
            select * from users WHERE id in
            <foreach collection="array" item="id" open="(" close=")" separator=",">
                #{id}
            </foreach>
        </select>
    
    map参数

    < map> 标签需要结合MyBatis的参数注解 @Param()来使用,需要告诉Mybatis配置文件中的collection="map"里的map是一个参数:

    <!--动态Sql: foreach标签, map参数查询-->
        <select id="dynamicSqlSelectMap" resultType="com.lks.bean.User">
            select * from users WHERE
            <foreach collection="map" index="key" item="value"  separator="=">
                ${key} = #{value}
            </foreach>
        </select>
    

    需要主要${}和#{}的使用。

    展开全文
  • MyBatis动态SQL,解决了SQL字符串拼接的痛苦。下文分步骤给大家详细介绍了MyBatis 动态拼接Sql字符串的问题,非常不错,感兴趣的朋友一起看下吧
  • Mybatis动态SQL进行order by

    千次阅读 2020-10-28 16:50:57
    SQL 修改后 感谢:https://www.cnblogs.com/sxdcgaq8080/p/9848016.html

    将#{} 改为${}

    请求参数:在这里插入图片描述
    在这里插入图片描述

    原SQL
    在这里插入图片描述
    运行结果:
    在这里插入图片描述

    修改后:
    在这里插入图片描述
    成功:
    在这里插入图片描述
    #{}和${}区别:

    1#{}表示一个占位符,能够实现PreparedStatement向占位符中设置值,自动进行java类型和jdbc类型的转换,防止SQL注入。
    2、接收简单数据类型的数据或者pojo属性值(javabean)
    3、使用#{}作为占位符时,如果接收的实参是基本数据类型,可以使用任意名称来接收,包括使用value名称接收
    
    1、${}表示拼接SQL字符串,将PreparedStatement传入的数据拼接到SQL语句中,不会进行jdbc类型转换,
    2、接收简单数据类型的数据或者pojo属性值(javabean)
    3、当使用${}作为字符串连接时,当前接收实参的变量名称只能使用value,${value}
    

    感谢:https://www.cnblogs.com/sxdcgaq8080/p/9848016.html

    展开全文
  • Mybatis动态sql的作用: 动态sql就是(在进行sql操作的时候)动态的根据属性值(所匹配的条件)来拼接数据库执行的sql语句,也就是多次查询或变更操作,根据传入的属性值不同,动态拼接出不同的可执行sql。包含...

    Mybatis动态sql的作用

    动态sql就是(在进行sql操作的时候)动态的根据属性值(所匹配的条件)来拼接数据库执行的sql语句,也就是多次查询或变更操作,根据传入的属性值不同,动态拼接出不同的可执行sql。包含判断为空、循环等;

     

    Mybatis动态sql(有哪些)标签:

    1、<if>: 

    if是为了判断传入的值是否符合某种规则,比如是否不为空;

     

    2、<where>:

     where标签可以用来做动态拼接查询条件,当和if标签配合的时候,不用显示的声明类似where 1=1这种无用的条件;

     

    3、<choose><when><otherwise>:

    这是一组组合标签,他们的作用类似于 Java 中的 switch、case、default。只有一个条件生效,也就是只执行满足的条件 when,没有满足的条件就执行 otherwise,表示默认条件;

     

    4、<foreach>:

    foreach标签可以把传入的集合对象进行遍历,然后把每一项的内容作为参数传到sql语句中,里面涉及到 item(具体的每一个对象), index(序号), open(开始符), close(结束符), separator(分隔符);

     

    5、<include>:

    include可以把大量重复的代码整理起来,当使用的时候直接include即可,减少重复代码的编写

     

    6、<set>:

    适用于更新中,当匹配某个条件后,才会对该字段进行更新操作

     

    7、<trim>:

    是一个格式化标签,主要有4个参数:

        prefix(前缀);

        prefixOverrides(去掉第一个标记);

        suffix(后缀);

        suffixOverrides(去掉最后一个标记);

     

    动态sql的执行原理

    第一部分:在启动加载解析xml配置文件的时候进行解析,根据关键标签封装成对应的handler处理对象,封装成sqlSource对象存在mappedStatement。

    调用流程:

    I、SqlSessionFactoryBuilder对builder对象的时候,调用XMLConfigBuilder解析sqlMapConfig.xml配置文件,在解析过程中使用到了私有的mapperElement(XNode parent)方法

    II、上面方法中通过构建XMLMapperBuilder,获取到所有的配置mapper配置,

    在调用private void configurationElement(XNode context)方法进行解析mapper.xml,通过void buildStatementFromContext(List<XNode> list, String requiredDatabaseId)方法解析mapper.xml内的每一个标签

    III、循环中构建XMLStatementBuilder对象,调用parseStatementNode()方法来封装mappedStatment对象,

    IIII、在过程中需要构建sqlSource对象,通过XMLLanguageDriver对象进行处理,在XMLLanguageDriver中构建解析动态标签对象XMLScriptBuilder

    第二部分:在执行过程中获取sqlSource中获取bondSql对象时,执行相应的标签handler

    调用查询执行到BaseExecutor的query方法时候会去getBoundSql并且将参数传进去,

    在sqlSource接口DynamicSqlSource实现类中,调用getBoundSql方法执行过程共创建DynamicContext对象进行判定解析封装成SqlSource对象返回。

     

    展开全文
  • MyBatis动态SQL

    千次阅读 2021-01-12 13:50:20
    在讲MyBatis动态SQL之前,先教大家怎么通过MyBatis插件自动生成mapper对应的文件和对应的bean文件。使用起来非常简单。第一步,在pom.xml文件里面添加plugin。这里要注意configurationFile部分这个字段指明...

    在讲MyBatis动态SQL之前,先教大家怎么通过MyBatis插件自动生成mapper对应的文件和对应的bean文件。使用起来非常简单。

    第一步,在pom.xml文件里面添加plugin。这里要注意configurationFile部分这个字段指明generatorConfig.xml文件的位置。generatorConfig.xml在第二步会教大家怎么配置。这里我们指定的目录是resources/generator文件夹下面,大家根据自己的实际情况来指定。

    org.mybatis.generator

    mybatis-generator-maven-plugin

    1.3.2

    mysql

    mysql-connector-java

    5.1.35

    ${basedir}/src/main/resources/generatorConfig.xml

    true

    第二步,generatorConfig.xml文件的配置,主要改的地方就是jdbcConnection字段里面数据库相关的信息。以及javaModelGenerator,sqlMapGenerator,javaClientGenerator字段目标文件的位置。和table字段里面改成自己的表格。关于这些东西generatorConfig.xml文件里面咱们也注释的很清楚。

    /p>

    PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"

    "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

    connectionURL="jdbc:mysql://192.168.13.98/dcim" userId="root" password="123456">

    targetProject="src/main/java">

    targetProject="src/main/resources">

    targetPackage="com.pilot.dcim.alarmmanage.mapper"

    implementationPackage="com.pilot.dcim.alarmmanage.service.impl"

    targetProject="src/main/java">

    enableCountByExample="false" enableUpdateByExample="false"

    enableDeleteByExample="false" enableSelectByExample="false"

    selectByExampleQueryId="false">

    enableCountByExample="false" enableUpdateByExample="false"

    enableDeleteByExample="false" enableSelectByExample="false"

    selectByExampleQueryId="false">

    enableCountByExample="false" enableUpdateByExample="false"

    enableDeleteByExample="false" enableSelectByExample="false"

    selectByExampleQueryId="false">

    enableCountByExample="false" enableUpdateByExample="false"

    enableDeleteByExample="false" enableSelectByExample="false"

    selectByExampleQueryId="false">

    第三步,上面两部都配置好之后,执行命令 mvn mybatis-generator:generate 就会在对应的目录下生成我们想要的文件。

    MyBatis的动态SQL是基于OGNL的表达式的。它对SQL语句进行灵活的操作。通过表达式判断来实现对SQL的灵活拼接、组装。我们着重讲说MyBatis动态SQL里面一些元素的使用。

    一、MyBatis动态SQL标签的学习

    1.1、if 条件判断标签

    if标签通用用于通过判断参数值来决定是否使用某个查询条件。

    1.1.1、if 判断数字

    if 判断数字,大部分都是判断等于或者不等于某个数字。

    ...

    1.1.2、if 判断字符串

    大部分情况下都是去判断传递过来的字符串是否为空。当然咱们也是可以添加别的条件限制的,比如以啥字符串开头,以啥字符串结尾。

    1.1.2.1、判断字符串是否为空,或者字符串等于某个值

    select * from user

    and name = #{user.name}

    1.1.2.2、判断字符串是否包含

    select * from user

    and name = #{user.name}

    1.1.2.3、判断是否以字符串开头

    select * from user

    and name = #{user.name}

    1.1.3、判断列表

    经常判断列表是否为null,或者列表是否为空。列表判断也是很简单的直接 就搞定了。

    一个简单的实例,通过用户名(list)查询用户

    List selectUserByName(@Param("nameList") List nameList);

    select * from user

    #{i}

    1.2、choose,when,otherwise标签(switch case)

    choose,when,otherwise标签的作用类似与咱们java里面的switch case的作用。

    #{item.name,jdbcType=VARCHAR},

    null,

    1.3、foreach循环标签

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。大部分都是对一个list进行循环。

    foreach元素的属性主要有 item,index,collection,open,separator,close。

    foreach元素

    解释

    collection

    迭代的对象

    item

    迭代过程中的每个元素

    index

    迭代过程中的位置

    open

    语句以什么开始

    separator

    语句以什么作为分隔符

    close

    语句以什么结束

    在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

    如果传入的是单参数且参数类型是一个List的时候,collection属性值为list。

    如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array。

    如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以。

    一个简单的实例

    select * from t_blog where id in

    #{item}

    array

    select * from t_blog where id in

    #{item}

    map

    select * from t_blog where title like "%"#{title}"%" and id in

    #{item}

    上面说的都是没有指定@Param的情况,如果指定了@Param则collection的属性值是@Param指定的名字。

    1.4、trim标签

    trim标记是一个格式化的标记,可以完成set或者是where标记的功能。

    trim属性

    描述

    prefix

    给sql语句拼接的前缀

    suffix

    给sql语句拼接的后缀

    prefixesToOverride

    去除sql语句前面的关键字或者字符,该关键字或者字符由prefixesToOverride属性指定,假设该属性指定为”AND”,当sql语句的开头为”AND”,trim标签将会去除该”AND

    suffixesToOverride

    去除sql语句后面的关键字或者字符,该关键字或者字符由suffixesToOverride属性指定

    state = #{state}

    AND title like #{title}

    AND author_name like #{author.name}

    1.5、where标签

    where标签是非常有用的,他有两个作用:

    当where标签里面元素的元素都不满足条件的时候,不会插入where语句。

    where标签里面若语句的开头为“AND”或“OR”,where 元素也会将它们去除。

    有这么一个例子,我呢有一个user表(pkid, name, phone, password),现在根据我们传入的条件来查询user信息。

    select * from user

    pkid = #{user.pkid}

    and name = #{user.name}

    and phone = #{user.phone}

    and password = #{user.password}

    1.6、set标签

    set标签和where标签一样。会自动加上set关键字,并且去掉不必要的一些字符。

    AND A.userId = #{userId,jdbcType=CHAR}

    AND A.userName = #{userName,jdbcType=CHAR}

    1.7、bind标签

    bind 标签可以使用 OGNL 表达式创建一个变量井将其绑定到上下文中。咱就可以简单的认为是声明了一个变量。

    这个例子里面,我纯粹的是把user.name替换成了user.name了。

    select * from user

    and name = #{userName}

    这例子里面咱用bind标签声明了一个模糊查询的变量

    select * from user

    and name like #{patternName}

    二、MyBatis动态SQL实例

    最后我们根据今天所学到的内容,给出两个比较复杂的MyBats动态SQL。

    2.1、批量插入并且更新主键

    insert into user (name, password, phone)

    values

    #{item.name,jdbcType=VARCHAR},

    null,

    #{item.password,jdbcType=VARCHAR},

    null,

    #{item.phone,jdbcType=VARCHAR},

    null,

    2.2、批量更新

    update user

    when pkid=#{i.pkid} then #{i.name}

    when pkid=#{i.pkid} then #{i.password}

    when pkid=#{i.pkid} then #{i.phone}

    where

    pkid=#{i.pkid}

    展开全文
  • Mybatis 动态 sql 可以在 Xml 映射文件内,以标签的形式编写动态 sql,执行原理是根据表达式的值 完成逻辑判断并动态拼接 sql 的功能。 Mybatis 提供了 9 种动态 sql 标签:trim | where | set | foreach | if | ...
  • MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架,MyBatis越来越受大家的喜爱了。下面给大家分享MyBatis使用动态SQL标签的小陷阱,感兴趣的朋友一起看看吧
  • Mybatis动态SQL习题练习

    千次阅读 2020-04-09 23:14:15
    Mybatis动态SQL习题练习 选择题 1.SQL语句中,where后直接跟and,这在运行时肯定会报()错误。 A.SQL语法 B.无效字符 C.参数异常 D.MySQL版本 答案:A 2.当有多个选择的情况是,值需要从多个选项中选择一个去执行...
  • mybatis动态sql,常用元素介绍

    千次阅读 2019-02-28 17:42:15
    mybatis动态sqlif元素choose、when、otherwiseforeach元素bing元素 if元素 choose、when、otherwise foreach元素 bing元素
  • mybatis动态SQL防止SQL注入

    万次阅读 2018-07-03 12:04:32
    IvrNodeTreeMapper.java如下:package com.example.springbootannotationmybatis.mapper; import ... import com.example.springbootannotationmybatis.sql...
  • MyBatis动态sql语句使用

    千次阅读 2019-07-02 16:43:32
    一、MyBatis动态语句分为4种元素: 元素 作用 描述 if 条件判断 单条件判断 choose(when、otherwise) 条件选择,相当Java when 多条件分支判断 ...二、Mybatis动态sql语句使用方式、例子 ...
  • 主要介绍了Mybatis4 之Mybatis动态sql的实现代码,本文给大家提到了静态sql动态sql有什么区别,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
  • mybatis动态sql使用方法(完整版)

    千次阅读 2019-03-01 11:51:04
    批量插入 insert into student(name, sex, age) values (#{item.name}, #{item.sex}, #{item.age}) 官方文档:http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html 如有遗漏,欢迎留言补充,谢谢
  • MyBatis动态SQL中Map参数处理

    万次阅读 2019-06-25 18:30:28
    MyBatis中,如果我们需要传递两个参数,有一种方式是通过Map作为传入参数,在动态SQL中,我们需要对传入的Map参数中的值进行判断,然后进行动态SQL的条件拼接处理。 假设我们有传入参数map如下: map.put("name",...
  • 主要介绍了Mybatis入门教程(四)之mybatis动态sql的相关资料,涉及到动态sql动态sql的作用知识,本文介绍的非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • spring-boot+mybatis动态sql

    千次阅读 2017-11-29 16:32:46
    spring-boot+mybatis动态sql 标签: mybatissqlspringboot 2016-07-27 15:28 4400人阅读 评论(0) 收藏 举报 分类: Spring Boot(5) 作者同类文章X mybatis(3) 作者同类文章X 版权...
  • MYSQL Mybatis 动态sql条件查询、判断空值和空字符串 @Select("<script>" + "SELECT * FROM table_name WHERE 1=1" + "<if test='templateCode!=null'>" + "and template_code...
  • MyBatis动态sql_choose分支选择

    千次阅读 2017-11-25 18:47:40
    MyBatis动态sql_choose分支选择 EmployeeMapperDynamicSQL.java package com.cn.mybatis.dao; import java.util.List; import com.cn.zhu.bean.Employee; public interface EmployeeMapperDynamicSQL { // ...
  • 今天小编就为大家分享一篇关于MyBatis执行动态SQL的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • mybatis动态sql上传

    2013-11-25 12:30:32
    mybatis动态sql批量增删改查,增强了mybatis的认识。
  • MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号...
  • MyBatis动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。这篇文章主要介绍了Mybatis动态SQL,if,where,foreach的使用教程,需要的朋友可以参考下
  • Mybatis动态SQL之where标签

    万次阅读 2018-06-08 15:26:41
    Mybatis会把次SQL语句拼接成: SELECT prod_id prodId, vend_id vendId, prod_name prodName, prod_desc prodDesc FROM Products WHERE prod_id = ? AND prod_name = ? AND where无法去除掉...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 312,412
精华内容 124,964
关键字:

mybatis动态sql

友情链接: PLC.rar