0 0

mybatis的mapper文件不能使用sql标签定义的语句10

Struts2 + spring2.5 + Mabatis3.04
很奇怪,程序里面用了<sql/>标签定义的公共语句<commonColumns 和 dynamicWhere>,不能应用,只要引用就报找不到,而用实际的代码替换,即不用引入方式,就正确.按mybatis的官方说法,是可以使用的啊.

备注:--这个错误不是因为commonColumns 或 dynamicWhere中些的有问题引起的,


错误信息如下:
### Error updating database.  Cause: java.lang.IllegalArgumentException: XML fragments parsed from previous mappers does not contain value for UserInfo.commonColumns
### The error may exist in D:\DevEnv\IDE\eclipse-jee-galileo-SR2-win32\WorkSpaces\Test_App\WebRoot\WEB-INF\classes\com\demo\userinfo\model\mapper\UserInfoMapper.xml
### Cause: java.lang.IllegalArgumentException: XML fragments parsed from previous mappers does not contain value for UserInfo.commonColumns
	at com.demo.exception.Exceptions.createAppException(Exceptions.java:65)
	at com.demo.ibatis3.SqlSessionTemplate.execute(SqlSessionTemplate.java:62)
	at com.demo.ibatis3.SqlSessionTemplate.insert(SqlSessionTemplate.java:182)
	at com.demo.ibatis3.IBatis3Dao.insert(IBatis3Dao.java:105)
	at com.demo.service.ServiceBase.insert(EntityServiceBase.java:70)
	at com.demo.dao.impl.UserInfoServiceTest.test(UserInfoServiceTest.java:34)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.test.context.junit4.SpringTestMethod.invoke(SpringTestMethod.java:160)
	at org.springframework.test.context.junit4.SpringMethodRoadie.runTestMethod(SpringMethodRoadie.java:233)
	at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:333)
	at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217)
	at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197)
	at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160)
	at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
	at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
	at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
	at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
	at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: java.lang.IllegalArgumentException: XML fragments parsed from previous mappers does not contain value for UserInfo.commonColumns
### The error may exist in D:\DevEnv\IDE\eclipse-jee-galileo-SR2-win32\WorkSpaces\Test_App\WebRoot\WEB-INF\classes\com\demo\userinfo\model\mapper\UserInfoMapper.xml
### Cause: java.lang.IllegalArgumentException: XML fragments parsed from previous mappers does not contain value for UserInfo.commonColumns
	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:8)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:120)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:107)
	at com.cqt.framework.orm.ibatis3.SqlSessionTemplate$10.doInSession(SqlSessionTemplate.java:186)
	at com.cqt.framework.orm.ibatis3.SqlSessionTemplate.execute(SqlSessionTemplate.java:57)
	... 27 more
Caused by: java.lang.IllegalArgumentException: XML fragments parsed from previous mappers does not contain value for UserInfo.commonColumns
	at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:593)
	at org.apache.ibatis.builder.xml.XMLStatementBuilder$IncludeNodeHandler.handleNode(XMLStatementBuilder.java:155)
	at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseDynamicTags(XMLStatementBuilder.java:85)
	at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:43)
	at org.apache.ibatis.session.Configuration.parseStatementNodes(Configuration.java:513)
	at org.apache.ibatis.session.Configuration.buildStatementsForNamespace(Configuration.java:502)
	at org.apache.ibatis.session.Configuration.buildStatementsFromId(Configuration.java:467)
	at org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:391)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:117)
	... 30 more




myBatis的sql映射文件:
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="UserInfo">
   <resultMap id="UserInfoResult" type="com.demo.userinfo.model.UserInfo">
      <result column="user_id" jdbcType="VARCHAR" property="userId" />
      <result column="username" jdbcType="VARCHAR" property="username" />
      <result column="password" jdbcType="VARCHAR" property="password" />
   </resultMap>
  
   <!-- 语句中不能通过<include refid="xx" />方式引用 commonColumns 和 dynamicWhere-->
   <sql id="commonColumns">
      <![CDATA[ user_id, username, password ]]>
   </sql>

   <sql id="dynamicWhere">
      <where>
	 <if test="@O@isNotEmpty(id)">
	     AND ID = #{id}
	 </if>
	 <if test="@O@isNotEmpty(userName)">
	     AND userName = #{userName}
	 </if>
	 <if test="@O@isNotEmpty(password)">
	    AND password = #{password}
	 </if>
       </where>
   </sql>

   <update id="update" parameterType="com.demo.userinfo.model.UserInfo"> UPDATE user_info
	<set>
	    <if test="username != null">username = #{username} ,</if>
	    <if test="password != null">password = #{password}</if>
	</set>
        WHERE
	user_id = #{userId}
   </update>

    <!-- 错误***** 只要采用Include方式引用公共的commonColumns和dynamicWhere就报错 ****** -->
    <select id="findById" parameterType="string" resultMap="UserInfoResult">
	select
	<include refid="commonColumns" />
        <![CDATA[ from user_info where user_id = #{userId} ]]>
    </select>


    <!-- 正确***** 只要采用Include方式引用公共的commonColumns和dynamicWhere就报错 ****** -->
    <select id="findById" parameterType="string" resultMap="UserInfoResult">
	select
	user_id, username, password
        <![CDATA[ from user_info where user_id = #{userId} ]]>
    </select>

    
    <!-- 错误***** 只要采用Include方式引用公共的commonColumns和dynamicWhere就报错 ****** -->
    <select id="findByConditions" resultMap="UserInfoResult" parameterType="com.demo.page">
	select
        <include refid="commonColumns" />
	from user_info
        where
        <include refid="dynamicWhere" />
    </select>

    <!-- 正确***** 只要不采用Include方式引用公共的commonColumns和dynamicWhere就正确 ****** -->
    <select id="findByConditions" resultMap="UserInfoResult" parameterType="com.demo.page">
	select
        user_id, username, password
	from user_info
        where 1= 1
      <where>
	 <if test="@O@isNotEmpty(id)">
	     AND ID = #{id}
	 </if>
	 <if test="@O@isNotEmpty(userName)">
	     AND userName = #{userName}
	 </if>
	 <if test="@O@isNotEmpty(password)">
	    AND password = #{password}
	 </if>
       </where>
    </select>
</mapper>

问题补充
而且,我debug跟踪进去,发现在内存中加载的mapper配置文件信息中,确实没有看到<sql/>标签定义的commonColumns和dynamicWhere,值看到了<update>,<select>等

问题补充:<div class="quote_title">hudingchen 写道</div><div class="quote_div">为什么要加&lt;![CDATA[?</div> <br /> <br />其实这跟&lt;![CDATA[? 没有任何关系, <br />因为这个标签只是告诉编译器,里面的数据原样解析,而且如果没有这个标签,则如果里面有一些特殊符号,比如小于好&lt;,可能就会有问题。 <br /> <br />当然,在例子中的&lt;![CDATA[标签,确实是多余,可以不用,因为里面不涉及到任何由歧义的计算符号或表示符,但是有没有不影响。 <br /> <br />不过还是谢谢你的回答!

问题补充:<div class="quote_title">shansun123 写道</div><div class="quote_div">这个有点纠结啊,运行时错误? <br />直接Debug好了,看看UserInfo.commonColumns这个东东到底有没加载 <br />没用过ibatis3,仅供参考啦。</div> <br /><div class="quote_title">shansun123 写道</div><div class="quote_div">这个有点纠结啊,运行时错误? <br />直接Debug好了,看看UserInfo.commonColumns这个东东到底有没加载 <br />没用过ibatis3,仅供参考啦。</div> <br /> <br /> <br />前面说了,debug的时候的,没有看到用&lt;sql/&gt;定义的东西,但是应用里确有: <br />下面是我debug的信息: <br /> SqlSession session = null; <br />session.configuration.statementNodesToParse对象里的数据如下: <br /><pre name="code" class="java">
{UserInfo=[
&lt;insert parameterType="com.cqt.demo.userinfo.model.UserInfo" id="insert"&gt;&lt;/insert&gt;,
&lt;update parameterType="com.cqt.demo.userinfo.model.UserInfo" id="update"&gt;
&lt;set&gt;
&lt;if test="username != null"&gt;username = #{username} ,&lt;/if&gt;
&lt;if test="password != null"&gt;password = #{password}&lt;/if&gt;
&lt;/set&gt;
&lt;/update&gt;,
&lt;delete parameterType="com.cqt.demo.userinfo.model.UserInfo" id="delete"&gt;&lt;/delete&gt;,
&lt;delete parameterType="string" id="deleteById"&gt;&lt;/delete&gt;,
&lt;select resultMap="UserInfoResult" parameterType="string" id="findById"&gt;
&lt;include refid="commonColumns"/&gt;
&lt;/select&gt;,
&lt;select resultMap="UserInfoResult" parameterType="com.cqt.framework.page.PageContext" id="findPage"&gt;
&lt;include refid="commonColumns"/&gt;
&lt;/select&gt;
  ]
}
</pre> <br />

问题补充:注意,不用考虑userInfo类的路径问题,呵呵 <br />因为一不小心,忘记更改报名了,以为发问题帖和发行帖一样,可以时候修改的,结果发现不能修改。呵呵
2011年5月10日 16:22

6个答案 按时间排序 按投票排序

0 0

jar升级就好了,升到mybatis-spring-1.1.1.jar mybatis-3.1.1.jar就可以了

2015年1月14日 18:50
0 0

这个问题有解决方案了吗?

2013年7月09日 23:41
0 0

namespace的值应该有问题。
include其他mapper文件的sql时,使用namespace全名

2012年5月28日 16:10
0 0

HI,我下午搭了个iBatis3的环境,用了下sql标签,是正常的啊

<sql id="commonColumns">  
  id, user_id, service_id, content, file_url, status, gmt_create, gmt_modified
</sql>  

<!-- 执行频率:10000次/天,作用:根据用户编号查询服务协议 -->
<select id="getProtocolByUserId" parameterType="Long"
	resultMap="ibatorgenerated_BaseResultMap">
	select <include refid="commonColumns"/>
	from test_protocol where user_id=#userId# and
	status = 1 order by
	gmt_create desc 
</select>

是不是问题出在别处了

2011年5月13日 15:51
0 0

这个有点纠结啊,运行时错误?
直接Debug好了,看看UserInfo.commonColumns这个东东到底有没加载
没用过ibatis3,仅供参考啦。

2011年5月12日 21:26
0 0

为什么要加<![CDATA[?

2011年5月10日 17:18

相关推荐

    根据MyBatis或iBatis的SQLMapper文件反向生成数据库表

    根据MyBatis或iBatis的SQLMapper文件解析生成数据库表,通常是指通过解析MyBatis或iBatis的SQLMapper文件中的SQL语句,然后根据这些SQL语句来生成对应的数据库表结构。这样的需求可能源于需要将已有的SQLMapper文件...

    Mybatis Mapper的使用

    这些方法的命名和参数应与XML映射文件中的SQL语句相对应,以便Mybatis能正确地将调用映射到相应的SQL执行。 2. **Mapper XML配置**:在资源文件夹下,创建对应的Mapper XML文件,这是存放SQL语句的地方。每个方法...

    MyBatis的helloworld(不使用Mapper接口实现MyBatis查询数据库).zip

    在不使用Mapper接口的情况下,我们需要在SQL映射文件中编写SQL语句。这个文件通常以`.xml`为扩展名,例如`UserMapper.xml`。在这个文件中,我们可以定义一个查询用户的信息的SQL语句: ```xml &lt;mapper namespace=...

    MyBatis SonarQube Plugin自定义规则用于检查 MyBatis Mapper 文件中的风险 SQL.zip

    在XML文件中,标签通常被嵌套在其他标签内,如、和等标签内,用于控制生成的SQL语句的结构和内容。 标签通常包含一个test属性,该属性被用于指定条件表达式。如果表达式的结果为true,则标签内的内容会被包含在生成...

    mybatis自动生成mapper文件

    同时,它还会生成对应的XML映射文件,定义SQL语句和结果映射。这样,开发者只需要在业务逻辑中调用Mapper接口,而无需手动编写SQL。 5. **自定义插件** MBG支持自定义插件,可以扩展其功能,例如添加更多的注释、...

    mybatis mapper 和xml文件生成

    XML文件在MyBatis中扮演着SQL语句配置的角色。每个Mapper接口通常对应一个XML配置文件,其中包含了接口方法的SQL语句、参数映射和结果映射。例如,在UserMapper的XML文件中,`selectUserById`方法会有一个对应的 `...

    springboot mybatis mapper.xml 配置

    然后,在`resources`目录下的`mybatis`子目录中创建`UserMapper.xml`文件,定义与接口方法对应的SQL语句。例如,对于`getUserById`方法: ```xml &lt;mapper namespace="com.example.demo.mapper.UserMapper"&gt; ...

    mybatis mapper自动生成

    1. **Mapper接口**:Mapper接口是业务逻辑的入口,开发者定义的方法与SQL语句一一对应。通过MyBatis的注解或XML配置文件,可以将这些方法与数据库操作关联起来。 2. **Bean(实体类)**:Bean是Java对象,通常代表...

    mybatis/ibatis自动生成SQLMapper脚本

    首先,SQLMapper是MyBatis的核心组成部分,它定义了与数据库交互的SQL语句和映射规则。通过自动生成这些映射文件,开发者可以避免手动编写繁琐的SQL代码,同时保持代码的整洁和可维护性。 1. **配置Generator**: ...

    mybatis根据数据库表自动生成SQL、实体类、mapper文件工具

    在SSM项目中,MyBatis的Mapper文件是关键组成部分,它定义了SQL语句和Java方法之间的映射关系。实体类则对应数据库中的表,用于存储和传递数据。而SQL语句则负责数据的查询、插入、更新和删除等操作。这个工具能够...

    Mybatis的Mapper方式整合elasticsearch的DSL调用,基于接口和代理生成bean注入的方式进行调用

    Mybatis的Mapper接口允许我们定义SQL查询,这些查询通过XML配置文件或注解与接口方法相对应。当执行Mapper方法时,Mybatis会自动处理SQL的执行和结果映射。这种方式提高了代码的可读性和可维护性。 Elasticsearch的...

    Java的MyBatis框架中Mapper映射配置的使用及原理解析

    在执行过程中,MyBatis会先加载Mapper配置文件,然后通过SqlSession对象执行相应的SQL语句。SqlSession提供了事务管理,确保数据库操作的原子性。在调用完Mapper方法后,通常需要调用`SqlSession.commit()`来提交...

    Mybatis的mapper+config的DTD文件

    每个Mapper文件对应一个Java接口,提供了一种将SQL语句与Java代码解耦的方式。Mapper XML文件中的主要元素包括: 1. **namespace**:与对应的Java接口全限定名一致,用于标识Mapper。 2. **select**:定义查询语句...

    浅谈MyBatis通用Mapper实现原理

    StaticSqlSource是MyBatis框架中的一种SqlSource实现,支持在SQL中使用#{param}方式的参数,但是不支持、等标签。 最后,通用Mapper通过Java反射机制和MyBatis框架的特点,实现了动态生成XML风格的SQL代码。这种...

    自动生成mybatis的mapper文件和bean

    2. **Mapper接口和XML映射文件**:在MyBatis中,Mapper接口定义了数据库操作的方法,而Mapper XML文件则包含了具体的SQL语句。二者通过MyBatis的配置进行绑定,实现了方法调用与SQL执行的关联。 3. **实体类(Bean...

    mybatis Mapper.xml中传参多选 字符串形式逗号分隔 AND中拼接OR.rar

    Mapper.xml文件是Mybatis的核心组件,它包含了数据库操作的SQL语句和映射规则。 在处理字符串形式的多选参数时,我们通常会先在服务层将这些参数转换为Java集合,如List或Set。例如,如果用户选择的标签以逗号分隔...

    数据库建表sql和mapper文件

    在IT行业中,数据库是存储和管理数据的核心工具,而建表SQL和Mapper文件则是开发过程中不可或缺的部分,尤其在使用Spring、SpringMVC和MyBatis框架的Java Web应用中。本资源提供了“users.sql”和“UserMapper.xml”...

    使用逆向工程生成mybatis的Mapper文件

    生成的文件包括Java模型类、Mapper接口以及对应的Mapper XML文件,其中XML文件包含了基于数据库表结构的SQL映射语句。 5. **整合到项目**: 最后,将生成的文件引入到你的项目中,更新相应的包结构,并在MyBatis的...

    根据mybatis/ibatis sqlmapper文件解析生成数据库表

    它可能首先寻找`&lt;insert&gt;`、`&lt;update&gt;`、`&lt;select&gt;`和`&lt;delete&gt;`等标签,这些是MyBatis/iBatis中定义SQL语句的地方。接着,它会分析`&lt;resultMap&gt;`和`&lt;parameterMap&gt;`来获取字段信息和参数映射,以确定数据库表的列名...

    Mybatis执行SQL语句的方式

    Mybatis 提供了一个基于注解的方式来执行 SQL 语句,我们可以在接口中使用@Select 注解来定义 SQL 语句。例如: ```java public interface UserMapper { @Select("SELECT * FROM table01 WHERE id = #{id}") User ...

Global site tag (gtag.js) - Google Analytics