zoukankan      html  css  js  c++  java
  • MyBatis动态传入表名,字段名参数的解决办法---statementType用法

    statementType="STATEMENT"

    要实现动态传入表名、列名,需要做如下修改

    • 添加属性statementType="STATEMENT"
    • 同时sql里的属有变量取值都改成${xxxx},而不是#{xxx}
    <delete id="deleteTableData" parameterType="java.util.Map" statementType="STATEMENT">  
        <![CDATA[ 
            delete from ${table} where 
            ${col} < ${date}]]>  
    </delete>

    1. statementType:STATEMENT(非预编译),PREPARED(预编译)或CALLABLE中的任意一个,这就告诉 MyBatis 分别使用Statement,PreparedStatement或者CallableStatement。

    默认:PREPARED。这里显然不能使用预编译,要改成非预编译。

    2. ${xxxx}:$将传入的数据直接显示生成在sql中,对于字符串数据,需要手动加上引号。

    String dateStr = DateFormatUtils.format(date.getTime(), "yyyy-MM-dd HH:mm:ss");  
    dateStr = "'" + dateStr + "'"; 

    说明:

    statementType:这个属性的作用是告诉mybatis我们写的这个sql到底是预编译(PRESTATEMENT)还是非预编译(STATEMENT)的。有什么区别呢?如果是预编译的,那么系统在初始化时就会读取这段sql代码,将指定的实体类中的字段替换了类似#{}这样的语句,就是形成了类似这样的语句:

    "select * from tableName where code=?" 这个时候你在系统运行时再想向这句sql中替换tableName或者code,结果可想而知。如果是非预编译呢,结果刚好相反,他会在系统运行时才会去生成这样类似的语句。此时就可以去替换这些动态的字段或者表名之类。

    或者

    SELECT  * FROM `sim_bill_${month}` where phone=#{sim}

    statementType="CALLABLE"

    存储过程:

    use base_passport
    Go
    create proc yhj_test
        @input_a int,
        @input_b int,
        @output_c int out
    as
    
    begin
        select * from config.city;
        set @output_c = @input_a*@input_b;
        return @input_a+@input_b;
    end

    Mybats配置: 

    <resultMap type="Java.util.HashMap" id="resultMap">
           <result column="city_key" property="cityKey"javaType="java.lang.Integer" jdbcType="INTEGER"/>
           <result column="province_key" property="provinceKey"javaType="java.lang.Integer" jdbcType="INTEGER"/>
           <result column="city_name" property="cityName"javaType="java.lang.String" jdbcType="VARCHAR"/>
        </resultMap>
      
        <select id="testByProc" statementType="CALLABLE" parameterType="java.util.HashMap" resultMap="resultMap">
           <![CDATA[
               {#{d,mode=OUT,jdbcType=INTEGER}=call dbo.yhj_test(
                  #{a,mode=IN,jdbcType=INTEGER},
                  #{b,mode=IN,jdbcType=INTEGER},
                  #{c,mode=OUT,jdbcType=INTEGER}
               )}    
           ]]>
        </select>

    Java代码

    Map<String, Object> paramMap = new HashMap<String, Object>();
           paramMap.put("a", 2);
           paramMap.put("b", 3);
           List<City> citys = (List<City>) getTemplate().selectList(getNameSpaceAndMethod("testByProc"), paramMap);
           return citys;

    通过以上代码我们即可获取对应的结果集,return参数和output参数。其中return参数和output参数放在传入的paramMap中,运行结果如下: 

    c是存储过程的output参数,而d为return参数。

    需要注意的事项:

    1、  存储过程的参数和名称无关,只和顺序有关系

    2、  存储过程的output参数,只能通过传入的map获取

    3、  存储过程返回的结果集可直接用返回的map接收

    4、  存储过程的return结果需要使用?=call procName(?,?)的第一个参数接收,需要指定对应的mode为OUT类型

    5、  存储过程对应的数据类型为枚举类型,需要使用大写,如VARCHAR

  • 相关阅读:
    利用dockerfile定制镜像
    发布Docker 镜像到dockerhub
    Docker 停止容器
    133. Clone Graph
    132. Palindrome Partitioning II
    131. Palindrome Partitioning
    130. Surrounded Regions
    129. Sum Root to Leaf Numbers
    128. Longest Consecutive Sequence
    127. Word Ladder
  • 原文地址:https://www.cnblogs.com/duanxz/p/5013326.html
Copyright © 2011-2022 走看看