关于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>
时间: 2024-08-02 15:04:22

关于mybatis写mapper文件注意事项的相关文章

自动生成Mybatis的Mapper文件

自动生成Mybatis的Mapper文件 工作中使用mybatis时我们需要根据数据表字段创建pojo类.mapper文件以及dao类,并且需要配置它们之间的依赖关系,这样的工作很琐碎和重复,mybatis官方也发现了这个问题,因此给我们提供了mybatis generator工具来帮我们自动创建pojo类.mapper文件以及dao类并且会帮我们配置好它们的依赖关系. 实际上,最非常流行MyBatis-Plus中内置了代码生成器:采用代码或者 Maven 插件可快速生成 Mapper . Mo

MyBatis的Mapper文件的foreach标签详解

MyBatis的Mapper文件的foreach标签用来迭代用户传递过来的Lise或者Array,让后根据迭代来拼凑或者批量处理数据.如:使用foreach来拼接in子语句. 在学习MyBatis Mapper文件的foreach标签时我们先看看DTD是如何定义的?DTD代码如下: 1 2 3 4 5 6 7 8 9 10 <!-- 定义foreach元素 --> <!ELEMENT foreach (#PCDATA | include | trim | where | set | fo

关于Mybatis的mapper文件中${}和#{}的区别和注意事项

#{}占位符 可以有效防止sql注入,使用时不需要关注参数的类型,mybatis会自动进行java类型和jdbc类型的转换:#{}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,#{}括号中可以是value或者其他名称. ${}和#{}不同,通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换,${}可以接收简单类型值或者pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value,如果

spring配置扫描mybatis的mapper文件注意:

一般会将不业务的mapper文件放到不同的包中: spring配置扫描就需要配置下面的方式(两个*): <!-- mybatis文件配置,扫描所有mapper文件 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" p:dataSource-ref="dataSource" p:configLocation="

关于mybatis中mapper文件resultMap中collection的使用

collection的使用有两种resultMap和select,必须手动指定一种 1. 实体类: 1 package com.mrlu.mybatis.domain; 2 3 import java.util.List; 4 5 /** 6 * Created by stefan on 15-12-31. 7 */ 8 public class User { 9 private Integer id; 10 private String name; 11 private List<Accoun

Mybatis的mapper文件中#和$的区别 以及 resultType和resultMap的区别

一般#{}用于传递查询的参数,一般用于从dao层传递一个string或者其他的参数过来,mybatis对这个参数会进行加引号的操作,将参数转变为一个字符串. SELECT * FROM employee WHERE name="jack" 而$则不同,我们一般用于ORDER BY的后面. SELECT * FROM employee ORDER BY salary MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,

mybatis的mapper文件内容回顾

当这个对象有关联到其他对象时,用resultType是查不出来的 此时就得用resultMap  

mybatis实现mapper配置文件热部署

工作用到mybatis,同事说每次修改sql后,都要重启,因为mybatis的mapper文件默认只在启动时加载到缓存,改动后不会自动加载,于是研究了下mybatis文件的加载,分享如下: 实现思路:使用定时器定时扫描mapper文件的改动,如果有改动则调用mapper文件的加载方法XMLMapperBuilder.parse(). 一.写一个重新加载mapper文件的java类  首先需要构建一个sqlSessionFactory对象,并指定mybatis的Configuration.xml配

mybatis mapper文件sql语句传入hashmap参数

1.怎样在mybatis mapper文件sql语句传入hashmap参数? 答:直接这样写map就可以 <select id="selectTeacher" parameterType="Map" resultType="com.myapp.domain.Teacher"> select * from Teacher where c_id=#{id} and sex=#{sex} </select>