最近在做一个项目,使用的框架是Spring MVC,ORM是Mybatis,数据库是oracle11g。本人是第一次使用Mybatis,在使用过程中遇到了一些问题,现将问题总结一下。
1.Mybatis向数据库插入单个对象:
开始我的SQL语句如下,由于主键id字段从webservice接口获取,所以没有用序列自增。在向数据库插值过程中,由于有些字段为空而报错。
<insert id = "addDepartment" parameterType="Department" >
insert into T_SYS_DEPT(ID,DEPT_CODE,DEPT_NAME,DEPT_TYPE,PARENT_ID,KEY_WORD,FULL_NAME,DEPT_LEADER)
values(#{id},
#{deptCode},
#{deptName},
#{deptType},
#{parentId},
#{keyWord},
#{fullName},
#{leaderId})
</insert>
后修改如下,即为每个字段指明类型。另外需要注意,当数据类型为NUMBER时,应当指定jdbcType类型为NUMERIC,即jdbcType=NUMERIC,不要写成NUMBER。
<insert id = "addDepartment" parameterType="Department" >
insert into T_SYS_DEPT(ID,DEPT_CODE,DEPT_NAME,DEPT_TYPE,PARENT_ID,KEY_WORD,FULL_NAME,DEPT_LEADER)
values(#{id,jdbcType=NUMERIC},
#{deptCode,jdbcType=VARCHAR},
#{deptName,jdbcType=VARCHAR},
#{deptType,jdbcType=VARCHAR},
#{parentId,jdbcType=NUMERIC},
#{keyWord,jdbcType=VARCHAR},
#{fullName,jdbcType=VARCHAR},
#{leaderId,jdbcType=NUMERIC})
</insert>
2.批量插值
最初的SQL语句,这里两个id组成了联合主键,两者的值也是从webservice获取,所以未采用序列,而是直接赋值。
<insert id="addDepartmentUserBatch" parameterType="java.util.List">
insert into T_SYS_DEPT_USER(DEPT_ID,USER_ID,DEPT_CODE,IS_LEADER,IS_DEFAULT,SORT_NO)
values
<foreach collection="list" item="item" index="index" separator=",">
( #{item.departmentId,jdbcType=NUMERIC},
#{item.userId,jdbcType=NUMERIC},
#{item.deptCode,jdbcType=VARCHAR},
#{item.isLeader,jdbcType=VARCHAR},
#{item.isDefault,jdbcType=NUMERIC},
#{item.sortNo,jdbcType=NUMERIC})
</foreach>
</insert>
在执行时报SQL未正确结束错误。百度了一下说这是MySql的语法格式,是不是我也不知道,没有在MySql数据库上尝试,但在oracle肯定不行,修改成了以下:
<insert id="addDepartmentUserBatch" parameterType="java.util.List">begin
<foreach collection="list" item="item" index="index" separator=";">
insert into T_SYS_DEPT_USER(DEPT_ID,USER_ID,DEPT_CODE,IS_LEADER,IS_DEFAULT,SORT_NO)
values
( #{item.departmentId,jdbcType=NUMERIC},
#{item.userId,jdbcType=NUMERIC},
#{item.deptCode,jdbcType=VARCHAR},
#{item.isLeader,jdbcType=VARCHAR},
#{item.isDefault,jdbcType=NUMERIC},
#{item.sortNo,jdbcType=NUMERIC})
</foreach>
;end;
</insert> 在orqcle11g 上实测通过。