我是mybatis的新手。我的班级里有一个java BigInteger属性。相关的mysql字段类型是BigInt。当我要使用xml配置文件向数据库插入记录时,它会给出'There was no TypeHandler found for parameter id'
之类的异常。
我的xml插入查询是,
INSERT INTO xX_ (
id, date, name, connection)
VALUES (
#{id}, #{date}, #{name}, #{connection}
)
请帮助我解决此问题,而无需更改DTO课程的类型。
答案 0 :(得分:1)
请看这里:http://mybatis.github.io/mybatis-3/configuration.html#typeHandlers
要使用BigInteger和BigInt,您必须编写自定义typeHandler,如下所示:
// ExampleTypeHandler.java
@MappedTypes(BigInteger.class)
public class BigIntegerTypeHandler extends BaseTypeHandler<BigInteger> {
//implement all methods
}
像这样配置你的config.xml:
<!-- mybatis-config.xml -->
<typeHandlers>
<typeHandler handler="your.packadge.BigIntegerTypeHandler"/>
</typeHandlers>
一定有帮助。
答案 1 :(得分:0)
试试这种方式
@Options(useGeneratedKeys = true, keyProperty = "id")
void createDetail(myDetail md);
<insert id="createDetail" parameterType="myDetail">
INSERT INTO xX_
( id,
`date`,
`name`,
`connection`)
VALUES ( #{id, javaType=BigInteger, jdbcType=BIGINT},
#{date},
#{name},
#{connection} )
<selectKey keyProperty="id" resultType="java.math.BigInteger">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
尝试使用不同的javaType,resultType和jdbcType。例如,javaType = java.math.BigInteger javaType = Long,javaType = java.lang.Long,jdbcType = NUMERIC,jdbcType = DECIMAL,resultType =“java.lang.Long”。
parameterType =“myDetail”必须等于类名,但不能等于类实例的名称。如果您的类名是com.yourcompany.MyDetail,实例名是myDetail,请尝试使用parameterType =“MyDetail”或parameterType =“com.yourcompany.MyDetail”
另见"Table 5.2 MySQL Types to Java Types for ResultSet.getObject()"。
MySQL Type Name: BIGINT[(M)] [UNSIGNED]
Returned as Java Class: java.lang.Long, if UNSIGNED java.math.BigInteger
答案 2 :(得分:0)
我以前在工作的地方使用MyBatis和Spring。
我们以前做过如下声明 注意我们设置为jdbcType = VARCHAR的userId,然后DB驱动程序正确地转换为BigInt或我们正在使用的任何东西。
我认为我们在系统中的对象中使用了Long。
<delete id="deleteJob" parameterType="com.beans.JobDetailVO">
UPDATE JOBS.JOB
SET
DO_NOT_USE=#{doNotUse}
WHERE
JOB_ID=#{postedJobID} and USER_ID=#{userID,jdbcType=VARCHAR}
</delete>
至于插入,我们做了以下
<insert id="insertJobDetail" parameterType="com.beans.JobDetailVO">
INSERT INTO JOBS.JOB
(
JOB_ID,
RECRUITER_TYPE_ID,
USER_DETAIL_ID,
HIDE_RECRUITER_INFO,
TITLE, ....
)
VALUES (
#{jobID,jdbcType=VARCHAR},
#{recruiterTypeID ,jdbcType=VARCHAR},
#{userDetailID ,jdbcType=VARCHAR},
#{hideRecruiterInfo ,jdbcType=VARCHAR},
#{jobTitle ,jdbcType=VARCHAR},
.....
)
<selectKey resultType="java.lang.Long" statementType="STATEMENT" keyProperty="JobID" order="BEFORE">SELECT
JOBS.S_JOB.NEXTVAL AS JOBID FROM DUAL
</selectKey>
</insert>