-
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
相关推荐
在XML文件中,标签通常被嵌套在其他标签内,如、和等标签内,用于控制生成的SQL语句的结构和内容。 标签通常包含一个test属性,该属性被用于指定条件表达式。如果表达式的结果为true,则标签内的内容会被包含在生成...
Mapper用于映射SQL语句,可以说是MyBatis操作数据库的核心特性之一,这里我们来讨论Java的MyBatis框架中Mapper映射配置的使用及原理解析,包括对mapper的xml配置文件的读取流程解读.
根据MyBatis或iBatis的SQLMapper文件解析生成数据库表,通常是指通过解析MyBatis或iBatis的SQLMapper文件中的SQL语句,然后根据这些SQL语句来生成对应的数据库表结构。这样的需求可能源于需要将已有的SQLMapper文件...
Mybatis的Mapper方式整合elasticsearch的DSL调用,之前的AOP进行了改进,使用cglib动态代理生成代理类,基于接口和代理生成bean注入的方式进行调用
基于eclipse上,ssm项目,可根据数据库表自动生成SQL、实体类、mapper文件工具
MyBatis 真正的强大在于映射语句,专注于SQL,功能强大,SQL映射的配置却是相当简单 SQL映射文件的几个顶级元素(按照定义的顺序) 1.mapper - namespace 2.cache - 配置给定命名空间的缓存 3.cache-ref – 从其他...
(代码)SpringCloud第03讲:整合MyBatis通用Mapper
XML查询语句转换成SQL语句的实现.pdf
压缩包中含有word文档教程,简单设置后双击批处理即可生成对应文件,复制到项目中即可。简单方便,生成的mapper.xml已包含大部分简单的sql操作语句,mybatis开发者必备工具。
目前通用mapper只支持对单表的操作,对单表的增删改查,无需在mapper.xml写对应的sql语句,只需要我们调用相应的接口,对于快速开发极为方便,感兴趣的小伙伴们可以参考一下
mysql 搜索 会员中心 消息 历史 创作中心 ...因为采用的是Mapper代理方式开发,我们可以通过xml来实现我们的sql语句,动态SQL再这里体现的淋漓尽致,下面我们看一下我们平常用到的xml配置,如下所示:
映射器文件(Mapper XML)定义了SQL语句和映射规则。每个映射器文件对应一个数据访问接口。 映射器文件中定义了SQL语句、参数映射、结果映射等。 4. SQL语句映射: MyBatis支持静态SQL和动态SQL。使用、、、等元素...
MyBatis SQL 映射器框架使关系数据库与面向对象的应用程序更容易使用。MyBatis 使用 XML 描述符或注解将对象与存储过程或 SQL 语句耦合在一起。简单性是 MyBatis 数据映射器相对于对象关系映射工具的最大优势。
映射器文件(Mapper XML)定义了SQL语句和映射规则。每个映射器文件对应一个数据访问接口。 映射器文件中定义了SQL语句、参数映射、结果映射等。 4. SQL语句映射: MyBatis支持静态SQL和动态SQL。使用、、、等元素...
mapper.xml中的sql标签
Settings: 导航跳转开关,配置不想要输出的SQL语句 Format: 输出格式化过的SQL语句 Rerun: 重启插件 Stop: 停止插件 日志示例 MyBatis Log Test: DEBUG sql1 - ==> Preparing: select * from t_table where name = ?...
2. MyBatis采用目前流行的通用Mapper方式进行DAO开发,避免单表在xml写sql语句 3、采用PageHelper分页插件 4、spring boot包含 dev、prod两个环境配置文件 5、集成 swagger-ui,方便Controller层接口展示和调试 6、...
mybatis是需要自己在mapper文件中编写sql,这样一来,如果表特别多的话,那么我们需要自己建很多类(pojo,mapper文件,sql语句等),会非常麻烦。为了解决这个问题,mybatis官方提供逆向工程 可以针对单表自动生成...
在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致 编码 通过 SqlSession 的 getMapper方法获取 Mapper接口的代理对象 调用对应方法完成sql的执行
3. 映射文件解析: 映射文件(Mapper XML文件)定义了SQL语句、参数映射关系、结果集映射关系等。MyBatis使用XML解析器解析映射文件,将SQL语句和数据库操作转化为Java对象。 4. SQL执行: 当执行SQL操作时,...