【jpa】操作存储过程简单示例
使用mysql数据库
创建存储过程语句示例
test为数据库名称,item_conform 为存储过程名称,5个入参,一个出参, IN为入参,OUT为出参,
begin和end之间为存储过程的业务逻辑,sql语句,这里做简化处理
DROP PROCEDURE
IF
EXISTS test.item_confirm;
CREATE PROCEDURE
test.item_confirm
( IN p_pid VARCHAR(30), IN p_adviceid VARCHAR(30), IN p_item_id VARCHAR(30), IN p_empid VARCHAR(30), IN p_type VARCHAR(30), OUT p_ok int )
BEGIN
set p_ok = 1;
END
但是以上语句执行失败;
解决:把begin和end去掉就好了
调用存储过程
call test.item_confirm ("1","2","3","4","5",@p_ok); select @p_ok;
java代码,使用spring data jpa
1)建立对象实体,需要设置主键id,存储过程参数5个入参1个出参
@Entity @NamedStoredProcedureQuery( name="HisProcedureEntity.hisconfirm", 【自由定义,数据库并不要求有相应的表结构对应】 procedureName = "test.item_confirm", 【存储过程名称】 parameters= { @StoredProcedureParameter(mode= ParameterMode.IN, type=String.class, name="p_pid"), @StoredProcedureParameter(mode= ParameterMode.IN, type=String.class, name="p_adviceid"), @StoredProcedureParameter(mode= ParameterMode.IN, type=String.class, name="p_item_id"), @StoredProcedureParameter(mode= ParameterMode.IN, type=String.class, name="p_empid"), @StoredProcedureParameter(mode= ParameterMode.IN, type=String.class, name="p_type"), @StoredProcedureParameter(mode=ParameterMode.OUT, type=Integer.class, name="p_ok") } ) public class HisProcedureEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; }
2)建立dao层接口,即repository
public interface HisProcedure extends JpaRepository<HisProcedureEntity, Long> { /** * 储存过程 * * @param pPid * @param pAdviceid * @param pItemId * @param pEmpid * @param pType * @return */ @Transactional 【必加,不然报错(连接关闭)】 @Procedure(name = "HisProcedureEntity.hisconfirm") Integer proItemConfirm2(@Param("p_pid") String pPid, @Param("p_adviceid") String pAdviceid, @Param("p_item_id") String pItemId, @Param("p_empid") String pEmpid, @Param("p_type") String pType); }
3)业务方法调用
调用dao层接口方法 proItemConfirm2 即可