-
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">为什么要加<![CDATA[?</div> <br /> <br />其实这跟<![CDATA[? 没有任何关系, <br />因为这个标签只是告诉编译器,里面的数据原样解析,而且如果没有这个标签,则如果里面有一些特殊符号,比如小于好<,可能就会有问题。 <br /> <br />当然,在例子中的<![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的时候的,没有看到用<sql/>定义的东西,但是应用里确有: <br />下面是我debug的信息: <br /> SqlSession session = null; <br />session.configuration.statementNodesToParse对象里的数据如下: <br /><pre name="code" class="java">
{UserInfo=[
<insert parameterType="com.cqt.demo.userinfo.model.UserInfo" id="insert"></insert>,
<update parameterType="com.cqt.demo.userinfo.model.UserInfo" id="update">
<set>
<if test="username != null">username = #{username} ,</if>
<if test="password != null">password = #{password}</if>
</set>
</update>,
<delete parameterType="com.cqt.demo.userinfo.model.UserInfo" id="delete"></delete>,
<delete parameterType="string" id="deleteById"></delete>,
<select resultMap="UserInfoResult" parameterType="string" id="findById">
<include refid="commonColumns"/>
</select>,
<select resultMap="UserInfoResult" parameterType="com.cqt.framework.page.PageContext" id="findPage">
<include refid="commonColumns"/>
</select>
]
}
</pre> <br />
问题补充:注意,不用考虑userInfo类的路径问题,呵呵 <br />因为一不小心,忘记更改报名了,以为发问题帖和发行帖一样,可以时候修改的,结果发现不能修改。呵呵2011年5月10日 16:22
6个答案 按时间排序 按投票排序
-
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
-
这个有点纠结啊,运行时错误?
直接Debug好了,看看UserInfo.commonColumns这个东东到底有没加载
没用过ibatis3,仅供参考啦。2011年5月12日 21:26
相关推荐
根据MyBatis或iBatis的SQLMapper文件解析生成数据库表,通常是指通过解析MyBatis或iBatis的SQLMapper文件中的SQL语句,然后根据这些SQL语句来生成对应的数据库表结构。这样的需求可能源于需要将已有的SQLMapper文件...
这些方法的命名和参数应与XML映射文件中的SQL语句相对应,以便Mybatis能正确地将调用映射到相应的SQL执行。 2. **Mapper XML配置**:在资源文件夹下,创建对应的Mapper XML文件,这是存放SQL语句的地方。每个方法...
在不使用Mapper接口的情况下,我们需要在SQL映射文件中编写SQL语句。这个文件通常以`.xml`为扩展名,例如`UserMapper.xml`。在这个文件中,我们可以定义一个查询用户的信息的SQL语句: ```xml <mapper namespace=...
在XML文件中,标签通常被嵌套在其他标签内,如、和等标签内,用于控制生成的SQL语句的结构和内容。 标签通常包含一个test属性,该属性被用于指定条件表达式。如果表达式的结果为true,则标签内的内容会被包含在生成...
同时,它还会生成对应的XML映射文件,定义SQL语句和结果映射。这样,开发者只需要在业务逻辑中调用Mapper接口,而无需手动编写SQL。 5. **自定义插件** MBG支持自定义插件,可以扩展其功能,例如添加更多的注释、...
XML文件在MyBatis中扮演着SQL语句配置的角色。每个Mapper接口通常对应一个XML配置文件,其中包含了接口方法的SQL语句、参数映射和结果映射。例如,在UserMapper的XML文件中,`selectUserById`方法会有一个对应的 `...
然后,在`resources`目录下的`mybatis`子目录中创建`UserMapper.xml`文件,定义与接口方法对应的SQL语句。例如,对于`getUserById`方法: ```xml <mapper namespace="com.example.demo.mapper.UserMapper"> ...
1. **Mapper接口**:Mapper接口是业务逻辑的入口,开发者定义的方法与SQL语句一一对应。通过MyBatis的注解或XML配置文件,可以将这些方法与数据库操作关联起来。 2. **Bean(实体类)**:Bean是Java对象,通常代表...
首先,SQLMapper是MyBatis的核心组成部分,它定义了与数据库交互的SQL语句和映射规则。通过自动生成这些映射文件,开发者可以避免手动编写繁琐的SQL代码,同时保持代码的整洁和可维护性。 1. **配置Generator**: ...
在SSM项目中,MyBatis的Mapper文件是关键组成部分,它定义了SQL语句和Java方法之间的映射关系。实体类则对应数据库中的表,用于存储和传递数据。而SQL语句则负责数据的查询、插入、更新和删除等操作。这个工具能够...
Mybatis的Mapper接口允许我们定义SQL查询,这些查询通过XML配置文件或注解与接口方法相对应。当执行Mapper方法时,Mybatis会自动处理SQL的执行和结果映射。这种方式提高了代码的可读性和可维护性。 Elasticsearch的...
在执行过程中,MyBatis会先加载Mapper配置文件,然后通过SqlSession对象执行相应的SQL语句。SqlSession提供了事务管理,确保数据库操作的原子性。在调用完Mapper方法后,通常需要调用`SqlSession.commit()`来提交...
每个Mapper文件对应一个Java接口,提供了一种将SQL语句与Java代码解耦的方式。Mapper XML文件中的主要元素包括: 1. **namespace**:与对应的Java接口全限定名一致,用于标识Mapper。 2. **select**:定义查询语句...
StaticSqlSource是MyBatis框架中的一种SqlSource实现,支持在SQL中使用#{param}方式的参数,但是不支持、等标签。 最后,通用Mapper通过Java反射机制和MyBatis框架的特点,实现了动态生成XML风格的SQL代码。这种...
2. **Mapper接口和XML映射文件**:在MyBatis中,Mapper接口定义了数据库操作的方法,而Mapper XML文件则包含了具体的SQL语句。二者通过MyBatis的配置进行绑定,实现了方法调用与SQL执行的关联。 3. **实体类(Bean...
Mapper.xml文件是Mybatis的核心组件,它包含了数据库操作的SQL语句和映射规则。 在处理字符串形式的多选参数时,我们通常会先在服务层将这些参数转换为Java集合,如List或Set。例如,如果用户选择的标签以逗号分隔...
在IT行业中,数据库是存储和管理数据的核心工具,而建表SQL和Mapper文件则是开发过程中不可或缺的部分,尤其在使用Spring、SpringMVC和MyBatis框架的Java Web应用中。本资源提供了“users.sql”和“UserMapper.xml”...
生成的文件包括Java模型类、Mapper接口以及对应的Mapper XML文件,其中XML文件包含了基于数据库表结构的SQL映射语句。 5. **整合到项目**: 最后,将生成的文件引入到你的项目中,更新相应的包结构,并在MyBatis的...
它可能首先寻找`<insert>`、`<update>`、`<select>`和`<delete>`等标签,这些是MyBatis/iBatis中定义SQL语句的地方。接着,它会分析`<resultMap>`和`<parameterMap>`来获取字段信息和参数映射,以确定数据库表的列名...
Mybatis 提供了一个基于注解的方式来执行 SQL 语句,我们可以在接口中使用@Select 注解来定义 SQL 语句。例如: ```java public interface UserMapper { @Select("SELECT * FROM table01 WHERE id = #{id}") User ...