精华内容
下载资源
问答
  • MyBatis动态SQL中Map参数处理

    万次阅读 2019-06-25 18:30:28
    在MyBatis中,如果我们需要传递两个参数,有一种方式是通过Map作为传入参数,在动态SQL中,我们需要对传入的Map参数中的值进行判断,然后进行动态SQL的条件拼接处理。 假设我们有传入参数map如下: map.put("name",...

    在MyBatis中,如果我们需要传递两个参数,有一种方式是通过Map作为传入参数,在动态SQL中,我们需要对传入的Map参数中的值进行判断,然后进行动态SQL的条件拼接处理。

    假设我们有传入参数map如下:

    map.put("name",name);
    map.put("level",level);
    

    对应的,我们有配置文件如下,可以看到,在test表达式中,我们不用再通过 #,$ 取值符,直接通过键值就可以取到Map中key所对应的值,如下所示:

    <select id="findSomethings"  parameterType="hashmap"   resultType="hashmap">
      select name,age,id from user
      where 1 = 1
      <if test="name != null and name!='' "> and name = #{name}</if>
      <if test="level != null and level!='' "> and level= #{level}</if>
    </select>
    
    展开全文
  • ibatis动态获取执行SQL和参数

    千次阅读 2016-05-19 17:14:28
    动态SQL的最好做法是在日志中记录一下执行的SQL,如下为在执行过程中获取SQL和参数的方案 /** * 查询总条数 */ public int queryCountByScriptSQL(Map, String> parmMap) throws LasBusinessException { try {

    动态SQL的最好做法是在日志中记录一下执行的SQL,如下为在执行过程中获取SQL和参数的方案

        /**
         * 查询总条数
         */
        public int queryCountByScriptSQL(Map<String, String> parmMap)
                throws LasBusinessException {
            try {
                // debug("queryCountByScriptSQL in");
                List res = getSqlMapClientTemplate().queryForList(
                        "valAdded.queryCountByScriptSQL", parmMap);
                SqlMapExecutorDelegate delegate = ((ExtendedSqlMapClient) (getSqlMapClientTemplate()
                        .getSqlMapClient())).getDelegate();
                MappedStatement ms = delegate
                        .getMappedStatement("valAdded.queryCountByScriptSQL");
                Sql sql = ms.getSql();
                RequestScope requestScope = new RequestScope();
                requestScope.setStatement(ms);
                String sqlStr = sql.getSql(requestScope, parmMap);
                // ParameterMap p = sql.getParameterMap(requestScope, parmMap);
                Object[] sqlParam = sql.getParameterMap(requestScope, parmMap)
                        .getParameterObjectValues(requestScope, parmMap);
                System.out.println("----------->" + sqlStr);
                for (int i = 0; i < sqlParam.length; i++) {
                    System.out.println("----参数[" + (i + 1) + "]------->" + sqlParam[i]);
                }
                // System.out.println("----------->"+p.toString());
                return Integer.parseInt(res.get(0).toString());
            } catch (DataAccessException e) {
                if (e.getErrorCode().equals(DB_LOCK_NOWAIT_CODE)) {
                    throw new LasBusinessException(DB_LOCK_NOWAIT_MESSAGE, e);
                } else {
                    throw new LasAppException("ElisLas系统异常", e);
                }
            } catch (Exception e) {
                throw new LasAppException("ElisLas系统异常", e);
            }
        }
    展开全文
  • MyBatis 动态SQL String 参数为空

    千次阅读 2015-09-08 17:38:50
    mybatis 参数为String,if test读取该参数代码:  SELECT MAX(DEPART_ID) FROM T_P_DEPART       AND DEPART_PID = #{departId,jdbcType=VARCHAR}     

    mybatis 参数为String,if test读取该参数代码:

    <select id="getMaxDepartId" parameterType="java.lang.String" resultType="java.lang.String">
            SELECT MAX(DEPART_ID) FROM T_P_DEPART 
            <where>
                <if test="_parameter!=null and _parameter!=''">  
                    AND DEPART_PID = #{departId,jdbcType=VARCHAR} 
                </if>
                <if test="_parameter==null or _parameter==''">  
                    AND DEPART_PID IS NULL
                </if>
            </where>
        </select>

    展开全文
  • MyBatis拦截器分页与动态修改SQL及其参数值 提取SQL Like 字段
  • mybatis 动态sql参数传递

    千次阅读 2020-03-15 09:27:50
    目录 使用场景 动态标签 if标签 where标签 choose、when、otherwise 标签 set标签 trim标签 forEach标签 参数传递 单个参数传递 多个参数传递 传入单个实体(JavaBean/Map) 传入多个实体 传入集合 使用场景 在实际...

    目录

    使用场景

    动态标签

    if标签

    where标签

    choose、when、otherwise 标签

    set标签

    trim标签

    forEach标签

    参数传递

    单个参数传递

    多个参数传递

    传入单个实体(JavaBean/Map)

    传入多个实体

    传入集合


    使用场景

    在实际开发过程中,我们往往需要编写复杂的SQL语句,拼接稍有不注意就会导致错误,Mybatis给开发者提供了动态SQL,大大降低了拼接SQL导致的错误。

    动态标签

    if标签

    if标签通常用那个胡where语句,update语句,insert语句中,通过判断参数值来决定是否使用某个查询条件,判断是否更新某一个字段或插入某个字段

    <if test="orderNum != null">
        #{orderNum,jdbcType=VARCHAR},
    </if>

    where标签

    where标签通常与if标签配合使用,当if标签数量很多时可能会导致组合错误

      <select id="selectByParam" resultMap="BaseResultMap">
        select * from order_pri
        where
          <if test="id !=null">
            id = #{id, jdbcType =INTEGER}
          </if>
          <if test="orderNum !=null and orderNum !=''">
            and order_num = #{orderNum, jdbcType = VARCHAR}
          </if>
      </select>

    当id=null 会 出现如下的sql拼写错误,

    除了用where 1=1 and xxx 这样的方式外还可以使用<where>标签,<where>标签能够将开头(结尾的不行)多余的and/or去掉,同时<where>标签还能根据包含内容是否为空,决定where关键字的显示或隐藏。

    正例:

    反例:

    choose、when、otherwise 标签

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

    set标签

    采用update语句时,如果同时使用了<if>标签,如果某一行没有执行则会导致多余逗号,如果采用<set>标签则能够去掉结尾多余的逗号

    反例:

    加<set>标签后

    注意:这里的set标签只能去掉语句最后一个逗号,其他的标点去不掉 多余的逗号也去不掉

    trim标签

    trim标签比较强大,可完成<set>或者<where>标记的功能,主要包含四个参数

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

    <trim>替代<set>

      <!--使用trim代替<set>标签-->
      <update id="updateFieldV2" >
      update order_pri
        <!--开头用set 结尾去掉“,”逗号-->
        <trim prefix="set" suffixOverrides=",">
            <if test="orderNum !=null">
              order_num = #{orderNum, jdbcType = VARCHAR},
            </if>
            <if test="isDel !=null">
              is_del = #{isDel, jdbcType = INTEGER},
            </if>
        </trim>
      where
      id = #{id, jdbcType = VARCHAR }
      </update>

    <trim>替代<where>

      <!--trim 代替<where>-->
      <select id="selectByFieldV2" resultMap="BaseResultMap">
        select * from
        order_pri
        <!--前缀加where 前缀如果有and去掉and,trim识别内容为空时自动解析为空-->
        <trim prefix="where" prefixOverrides="and">
          <if test="id !=null">
            and id = #{id, jdbcType =INTEGER}
          </if>
          <if test="orderNum !=null and orderNum !=''">
            and order_num = #{orderNum, jdbcType = VARCHAR}
          </if>
        </trim>
      </select>

    当<trim>识别标签为空时,自动将内容处理为空,不添加where关键字。

    forEach标签

    foreach标签主要有以下参数:

    • collection配置的是传递进来的参数名称
    • item配置的是循环中当前的元素。
    • index配置的是当前元素在集合的位置下标。
    • open和 close配置的是以什么符号将这些集合元素包装起来。
    • separator是各个元素的间隔符。
    <select id="selectBatchList" resultMap="BaseResultMap">
        select * from
        order_pri
        where id in
        <foreach collection="list" item="index" separator="," open="(" close=")">
          #{index}
        </foreach>
    </select>

    参数传递

    单个参数传递

    单参数可以直接进行传递Dao无需添加@Param注解

      <!-- Mapper -->
      List<OrderPri> selectById(String orderNum);
    
      <!-- xml -->
      <select id="selectById" resultMap="BaseResultMap">
        select * from order_pri
        where order_num = #{orderNum, jdbcType = VARCHAR}
      </select>

    多个参数传递

    多参数传递时xml无法识别key,需要用@Param标识一下进行传递

    反例:

    正例:

        <!--入参需要@Param-->
        List<OrderPri> selectByFieldV2(@Param("id") Integer id, @Param("orderNum") 
                                       String orderNum);
        <!--xml-->
        <select id="selectByField" resultMap="BaseResultMap">
        select * from
        order_pri
         <where>
          <if test="id !=null">
            and id = #{id, jdbcType =INTEGER}
          </if>
          <if test="orderNum !=null and orderNum !=''">
            and order_num like concat('%', #{orderNum, jdbcType = VARCHAR}, '%')
          </if>
         </where>
       </select>

    传入单个实体(JavaBean/Map)

    当参数<5 时建议多值传递,当参数>5时建议采用实体的方式

    采用实体方式(不加@Param标识):

    <!--Mapper-->
    List<OrderPri> selectListParam(OrderPri orderPri);
        
    <!--xml-->    
    <select id="selectListParam" parameterType="com.wuxin.entity.OrderPri" 
                                 resultMap="BaseResultMap">
        select
            <include refid="Base_Column_List"/>
        from  order_pri
        <where>
          <if test="id !=null">
            and id = #{id, jdbcType = INTEGER }
          </if>
          <if test="orderNum !=null ">
            and order_num  = #{orderNum, jdbcType = VARCHAR}
          </if>
          <if test="isDel !=null">
            and is_del = #{isDel, jdbcType = INTEGER}
          </if>
         </where>
    </select>
        

    如果加@Param注解则,xml中需要跟进@Param配置的名称进行实体中属性的读取

    List<OrderPri> selectListParam(@Param("orderPri") OrderPri orderPri);
    
    
    <select id="selectListParam" parameterType="com.wuxin.entity.OrderPri" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from  order_pri
        <where>
          <if test="orderPri.id !=null">
            and id = #{orderPri.id, jdbcType = INTEGER }
          </if>
          <if test="orderPri.orderNum !=null ">
            and order_num  = #{orderPri.orderNum, jdbcType = VARCHAR}
          </if>
          <if test="orderPri.isDel !=null">
            and is_del = #{orderPri.isDel, jdbcType = INTEGER}
          </if>
        </where>
      </select>

    当参数为map时同JavaBean,这里不再赘述。

    传入多个实体

    多实体传参时也要加@Param,否则会读不出来实体的属性

    List<OrderPri> selectListByMulEntity(@Param("pri") OrderPri pri, @Param("dtl") 
                                          OrderDtl dtl);
    
    
    <select id="selectListByMulEntity" resultMap="BaseResultMap">
        select
        p.id
        from  order_pri p left join
        order_dtl d on p.order_num = d.order_num
        <where>
          <if test="pri.id !=null">
            and p.id = #{pri.id, jdbcType = INTEGER }
          </if>
          <if test="pri.orderNum !=null ">
            and p.order_num  = #{pri.orderNum, jdbcType = VARCHAR}
          </if>
          <if test="pri.isDel !=null">
            and p.is_del = #{pri.isDel, jdbcType = INTEGER}
          </if>
          <if test="dtl.proId !=null">
            and d.pro_id = #{dtl.proId, jdbcType = INTEGER}
          </if>
        </where>
    </select>

    传入集合

    1.当参数为Collection接口,转换为Map,Map的key为collection
    2.当参数类型为List接口,除了collection的值外,list作为key
    3.当参数为数组,也会转换为Map,Map的key为array

    • 传入数组时collection用array接:
      --Mapper
      List<OrderPri> selectBatch(int[] arr);  
    
      <!--数组-->
      <select id="selectBatch" resultMap="BaseResultMap">
        select * from
        order_pri
        where id in
        <foreach collection="array" index="item" open="(" close=")" separator=",">
           #{item}
        </foreach>
      </select>
    • 传入集合时用list接口
      --Mapper
      List<OrderPri> selectBatchList(List<Integer> iidList);
      
      --xml
      <!--动态集合-->
      <select id="selectBatchList" resultMap="BaseResultMap">
        select * from
        order_pri
        where id in
        <foreach collection="list" item="index" separator="," open="(" close=")">
          #{index}
        </foreach>
      </select>
    • 传入多个集合时
    --Mapper
    List<OrderPri> selectBatchListV2(@Param("idList") List<Integer> idList, 
                                         @Param("orders")List<String> orders);
    
    
    
    <!--多个动态集合-->
      <select id="selectBatchListV2" resultMap="BaseResultMap">
        select * from
        order_pri
        where id in
        <foreach collection="idList" item="index" separator="," open="(" close=")">
          #{index}
        </foreach>
        and
        order_num in
        <foreach collection="orders" item="it" separator="," open="(" close=")">
          #{it}
        </foreach>
      </select>

     

    展开全文
  • springboot mybatis整合: mapper定义的是数据库的操作方法: @Mapper public interface UserMapper {} 单参数的处理: @Select("select * from t_user") @Results({ @Result(property = "...
  • 动态SQL 静态SQL 的 区别

    千次阅读 2018-08-20 11:24:57
    所谓SQL的静态和动态,是指SQL语句在何时被编译执行,二者都是用在SQL嵌入式编程中的,这里所说的嵌入式是指将SQL语句嵌入在高级语言中,而不是针对于单片机的那种嵌入式编程。 二者区别 : 静态SQL 动态SQL ...
  • mybatis打印sql和参数

    千次阅读 2017-09-30 17:09:59
    mybatis打印sql和参数
  • 1. 工具类方法 ... * 替换sql中的占位参数 */ public static String getSql(String indexImpl, LinkedHashMap<String, String> params) { //匹配#{*}格式的占位参数 // Pattern pattern = Pattern....
  • Mybatis 动态SQL之传字段名做参数

    千次阅读 2018-09-21 16:09:00
    动态SQL是mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理。   在动态sql解析过程,#{} 与 ${} 的效果是不一样的: 1. ...
  • 动态传递参数的时候,需要用到OGNL表达式,不懂的童鞋可以下去百度,这里制作一个简要的介绍 在向XML文件传递参数的时候,需要用到sqlSession.selectList("Message.queryMessageList",message); message就是你...
  • oracle 执行动态sql,using动态参数

    千次阅读 2017-12-07 16:45:28
    动态sql,当变量个数不确定时。如果直接open vCursor for piSQL using 变量1,变量2 ,真是一个体力活。 发现居然可用 DBMS_SQL.TO_REFCURSOR()转换为 可返回的cursor; create or replace procedure test_...
  • 从离职的同事那里接手了一个项目开始改bug,然后就接触到了ibatis。...咳咳,下面讲如何获取ibatis运行时的动态SQL以及其参数。 假设我想获得这段调了ibatis接口的java代码所执行的sql语句以及其参数: n =
  • 一个是使用Execute函数执行方式为Execute(@sql)来动态执行一个SQL语句,但是这里的SQL语句无法得到里面的返回结果,下面来介绍另一种方法使用存储过程 sp_ExecuteSql使用该存储过程,则可将动态语句中的参数返回来。
  • 动态SQL

    万次阅读 多人点赞 2017-10-17 11:54:40
    1 动态SQL 那么,问题来了: 什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误。Mybatis的动态SQL功能正是...
  • 1.静态SQLSQL动态SQL Oracle编译PL/SQL程序块分为两个种: 其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型; 另外一种是后期联编(late binding),即...
  • 静态SQL和动态SQL

    万次阅读 2012-11-05 15:36:17
    标准的 SQL 语言一般包括三类,即 DDL (Data Definition Language, 数据描述语言 ) 、DML (Data Manipulation Language, 数据操纵语言 ) DCL(Data Control Language,数据控制语言 )。通过这些标准
  • 动态SQL是mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理。 在动态sql解析过程,#{} 与 ${} 的效果是不一样的: 1. #{...
  • Mybatis动态SQL之判断参数

    千次阅读 2017-07-13 16:32:52
    问题需求: 下拉列表共有3个选择项,“标题”、“内容”、“关键字”,使用Spring MVC + Mybatis框架,动态SQL构想: p.pro_title like concat(concat('%', #{content}),'%') p.pro_content like concat...
  • 动态SQL和动态PLSQL

    千次阅读 2016-09-09 21:31:26
    动态SQL 是指在执行时才构建 SQL 语句, 相对于静态 sql 的编译时就已经构建. 动态PLSQL 是指整个PL/SQL代码块都是动态构建, 然后再编译执行的. 作用: 1. 可以支持 DDL 语句, 静态 sql 只能支持 DML 语句. ...
  • springboot jpa输出sql和参数

    万次阅读 2019-03-15 15:44:50
    显示出Hibernate查询语句的绑定参数值 spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace
  • JDBC动态参数,动态sql示例

    千次阅读 2017-09-27 15:56:03
    log.info("图书借阅sql语句:{}", sql.toString()); preparedStatement = connection.prepareStatement(sql.toString()); setParameter(params, preparedStatement); resultSet = preparedStatement....
  • 静态SQL和动态SQL的区别测试实例

    千次阅读 2015-11-09 16:19:21
    由于近期工作比较悠闲,所以就继续学习了数据库SQL的使用,实际工作中...所谓SQL动态和静态,是指SQL语句在何时被编译和执行,二者都是用在SQL嵌入式编程中的。 静态SQL:在高级语言中,如果嵌入了SQL语句,而这个
  • mybatis 动态sql之Map参数

    万次阅读 2016-03-25 11:56:57
    后台传递到mybatis的map参数,不要深究函数含义,知道下面这个map最终是传递到mybatis中的parameterType就够了 public Map,String> parseMap(HttpServletRequest req){ Map,String> map=new HashMap,String>...
  • sqlserver 动态sql的执行,有两个方法execute sp_executesql.其中第一个方法execute可以简写为exec. execute方法适合执行没有返回值的动态sql,sp_executesql可以获取到动态sql的返回值.二者比较起来,前者写起来简单...
  • 当需要根据外部输入的参数来决定要执行的SQL语句时,常常需要动态来构造SQL查询语句,个人觉得用得比较多的地方就是分页存储过程执行搜索查询的SQL语句。一个比较通用的分页存储过程,可能需要传入表名,字段,...
  • mybatis动态sql和resultMap关联查询

    万次阅读 2019-11-19 16:10:45
    动态Sql ifwhere 动态sql parameterType的类型必须是 实体类 test 中判断的属性必须是 实体类的属性 <select id="findAllOrBy" parameterType=...
  • sql参数 问号占位符 命名参数

    千次阅读 2016-12-19 11:19:13
    sql参数 问号占位符 命名参数Q: 在写的过程有时候会疑惑,尤其是hibernate的时候有疑惑,什么时候能用named parameter什么时候不能用?A: 从原本来说,jdbc不支持命名参数。所以在hibernate创建的criteria中使用...
  • Mybatis动态sql中用到if条件判断,使用service中传入的参数作为判断条件的写法。 service层中传入role值为2作为参数进行判断,role为String类型。 Mapper中使用以下方式进行判断。 更多具体情况操作内容移步:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,092,376
精华内容 436,950
关键字:

动态sql和参数