具体报错信息如下:
### 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.xml文件 sql语句的格式(重点注意select):
<?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>