zoukankan      html  css  js  c++  java
  • mybatis_mybatis写mapper文件注意事项

    xml中某些特殊符号作为内容信息时需要做转义,否则会对文件的合法性和使用造成影响

    Html代码  收藏代码
    1. &lt; <   
    2. &gt; >   
    3. &amp; &   
    4. &apos; '   
    5. &quot; "  

    在mapper文件中写sql语句时,为避免不必要的麻烦(如<等),建议使用<![CDATA[ ]]>来标记不应由xml解析器进行解析的文本数据,由<![CDATA[  ]]>包裹的所有的内容都会被解析器忽略 <![CDATA[ sql语句 ]]> 

    Xml代码  收藏代码
    1. <select id="getAccountsByBranch" resultType="Account" parameterType="string">  
    2.     <![CDATA[SELECT * FROM t_acctreg_accounts where acctno < #{acctno}]]>  
    3. </select>  

     将整个sql语句用<![CDATA[   ]]>标记来避免冲突,在一般情况下都是可行的,但是如果这样写

    Xml代码  收藏代码
    1. <select id="getAccountErrorCount" resultType="int" parameterType="map">  
    2.     <![CDATA[ 
    3.     select count(*) from t_acctreg_accounterror 
    4.     <where> 
    5.         <if test="enddate != null and enddate != ''"> 
    6.             createdate <= #{enddate} 
    7.         </if> 
    8.         <if test="acctno != null and acctno != ''"> 
    9.             AND acctno LIKE '%'||#{acctno}||'%' 
    10.         </if> 
    11.     </where> 
    12.     ]]>  
    13. </select>  

     就会收到错误信息:

        org.springframework.jdbc.UncategorizedSQLException: Error setting null parameter. Most JDBC drivers require that the JdbcType must be specified for all nullable parameters. Cause: java.sql.SQLException: 无效的列类型: 1111 ; uncategorized SQLException for SQL []; SQL state [99999]; error code [17004]; 无效的列类型: 1111; nested exception is java.sql.SQLException: 无效的列类型: 1111

        这是由于该sql配置中有动态语句(where,if),where,if 条件不能放在<![CDATA[ ]]>中,否则将导致无法识别动态判断部分,导致整个sql语句非法.应该缩小范围,只对有字符冲突部分进行合法性调整

    Xml代码  收藏代码
    1. <select id="getAccountErrorCount" resultType="int" parameterType="map">  
    2.     select count(*) from t_acctreg_accounterror  
    3.     <where>  
    4.         <if test="enddate != null and enddate != ''">  
    5.             <![CDATA[createdate <= #{enddate}]]>  
    6.         </if>  
    7.         <if test="acctno != null and acctno != ''">  
    8.             <![CDATA[AND acctno LIKE '%'||#{acctno}||'%']]>  
    9.         </if>  
    10.     </where>  
    11. </select>  

    还有在向oracle插入数据时,mybatis3报Error setting null parameter. Most JDBC drivers require that the JdbcType must be specified for all nullable parameters,是由于参数出现了null值,对于Mybatis,如果进行操作的时候,没有指定jdbcType类型的参数,mybatis默认jdbcType.OTHER导致,给参数加上jdbcType可解决(注意大小写)

    http://code.google.com/p/mybatis/issues/detail?id=224&q=Error%20setting%20null%20parameter&colspec=ID

    Xml代码  收藏代码
    1. <insert id="insertAccountError" statementType="PREPARED"  
    2.     parameterType="AccountError">  
    3.     INSERT INTO t_acctreg_accounterror(createdate,acctno, errorinfo)  
    4.     VALUES(#{createdate,jdbcType=DATE},#{acctno,jdbcType=VARCHAR},#{errorinfo,jdbcType=VARCHAR})  
    5. </insert>  
  • 相关阅读:
    27. Remove Element
    列表变成字典
    1. Two Sum
    CVPR2019:What and How Well You Performed? A Multitask Learning Approach to Action Quality Assessment
    959. Regions Cut By Slashes
    118. Pascal's Triangle
    loj3117 IOI2017 接线 wiring 题解
    题解 NOI2019 序列
    题解 省选联考2020 组合数问题
    题解 Educational Codeforces Round 90 (Rated for Div. 2) (CF1373)
  • 原文地址:https://www.cnblogs.com/gisblogs/p/4359917.html
Copyright © 2011-2022 走看看