一、存储过程的使用:
1. 给参数赋值就可以了,一定要注意 #后的属性和赋值的属性保持:
<insert id="insert" statementType="CALLABLE" parameterType="com.chinanetcenter.service.itop.mybatis.entry.Employee" >
<![CDATA[
{call idc_oemp.prws_employee_add(
#{code,mode=IN,jdbcType=VARCHAR},
#{name,mode=IN,jdbcType=VARCHAR},
#{sex,mode=IN,jdbcType=VARCHAR},
#{status,mode=IN,jdbcType=VARCHAR},
#{post,mode=IN,jdbcType=VARCHAR},
#{birthdate,mode=IN,jdbcType=TIMESTAMP},
#{idcardno,mode=IN,jdbcType=VARCHAR},
#{path,mode=IN,jdbcType=VARCHAR},
#{phone,mode=IN,jdbcType=VARCHAR},
#{qq,mode=IN,jdbcType=VARCHAR},
#{wechataccount,mode=IN,jdbcType=VARCHAR},
#{email,mode=IN,jdbcType=VARCHAR},
#{departmentid,mode=IN,jdbcType=INTEGER},
#{virtualteamid,mode=IN,jdbcType=VARCHAR},
#{createtime,mode=IN,jdbcType=TIMESTAMP},
#{loginname,mode=IN,jdbcType=VARCHAR},
#{password,mode=IN,jdbcType=VARCHAR},
#{returnCode,mode=OUT,jdbcType=INTEGER},
#{returnMsg,mode=OUT,jdbcType=VARCHAR}
)}
]]>
</insert>
2.实体类的属性一定要跟存储过程输出的字段一样,用于接收处理结果。
3. 这个类的属性可以映射到另外一个表的字段。这个过程不需要我处理。
4. 输入参数的时候一定要考虑为空的情况。
二、 存储过程的传参方式有两种:Map和实体类。
1. Map:参数比较少,且参数不属于类的属性;
public PageInfo<Employee> selectByTeamIDDepartId(int teamid_departid, int flag, int pageNum, int pageSize){
Map param = new HashMap();
param.put("teamid_departid", teamid_departid);
param.put("flag", flag);
param.put("pageNum", pageNum);
param.put("pageSize", pageSize);
List<Employee> list = employeeMapper.selectByTeamIDDepartId(param);
。。。
return page;
}
2. 实体类:参数比较多,且参数属于类的属性。
public void updateById(Employee record, int id){
record.setId(id);
employeeMapper.updateByPrimaryKey(record);
}
三、 操作数据库的时候报错:
自己先把参数输入测试一下是否是存储过程的问题,特别注意空字符串' '改成null,特别注意每个字段的输入类型。
CALL idc_oemp.prws_employee_add('20161207143588','son','male', 'internship', '运维', '2016-11-20', '454480003388', 'F:\\test\\tt', '13821322488', '1503780117', 'lews1102', '4284425@qq.com', 12, ' ', '2016-12-05 11:38:19', 'gpssd888', 'wangsu@123', @returnCode, @returnMsg);
要求输入: varchar(1000) 没数据时 为 null,不能为' ' 。报一些奇怪的错,可能是参数的问题。