2012-02-09 348 views
4

第一个问题: 我试图返回一个OUT参数,而不是带注释的结果集。首先,这有可能吗?如果是这样,一个人会怎么做?带有OUT参数的Java MyBatis存储过程调用

的MyBatis:3.0.6

数据库:SQL Server 2008中

这是在我的UserDAO方法调用的语法的例子:

@Select(value= "{ CALL saveUser(" 
     + "#{userId, mode=IN, jdbcType=INTEGER}," 
     + "#{firstname, mode=IN, jdbcType=VARCHAR}," 
     + "#{lastname, mode=IN, jdbcType=VARCHAR}," 
     + "#{message, mode=OUT, jdbcType=VARCHAR}" 
     + ")}") 
@Options(statementType=StatementType.CALLABLE) 
public String saveUser(
     @Param("userId") int userId, 
     @Param("firstname") String firstname, 
     @Param("lastname") String lastname); 

我从返回的消息所有我的“保存”程序,所以我可以返回一个响应给用户:“用户保存成功”,“保存用户错误”,“你没有权限保存这个用户”等。我知道返回结果设置将解决问题,它只是我不想改变我的所有程序!

第二个问题:是否可以返回由多个OUT参数填充的“SaveProcedureResponse”?例如:

@Select(value= "{ CALL saveUser(" 
     + "#{userId, mode=IN, jdbcType=INTEGER}," 
     + "#{firstname, mode=IN, jdbcType=VARCHAR}," 
     + "#{lastname, mode=IN, jdbcType=VARCHAR}," 
     + "#{message, mode=OUT, jdbcType=VARCHAR}," 
     + "#{status, mode=OUT, jdbcType=VARCHAR}," 
     + "#{returnCode, mode=OUT, jdbcType=INTEGER}" 
     + ")}") 
@Options(statementType=StatementType.CALLABLE) 
public SaveProcedureResponse saveUser(
     @Param("userId") int userId, 
     @Param("firstname") String firstname, 
     @Param("lastname") String lastname); 

凡豆看起来是这样的:

public class SaveProcedureResponse { 
    private String message; 
    private String status; 
    private int returnCode; 

    public SaveProcedureResponse(String message, String status, int returnCode) { 
     this.message = message; 
     this.status = status; 
     this.returnCode = returnCode; 
    } 
} 

谢谢!

回答

7

第一个问题:我试图返回一个OUT参数,而不是一个 结果与标注设置。首先,这有可能吗?如果是这样, 会怎么做?

err,sorta。 Mapper不会输出参数return,但是您可以让Mybatis将它们设置到参数对象上,或者将它们放到像this这样的地图中。

所以给了一个简单的java对象与所有领域的getters和setter。在调用映射器之后,输出参数将被设置到对象上。

<update id="someProcedure" statementType="CALLABLE"> 
    {call some procedure(
      #{someInParamA, mode=IN}, 
      #{someInParamB, jdbcType=ARRAY, mode=IN}, 
      #{someOutParamA, javaType=Boolean, jdbcType=NUMERIC, mode=OUT }, 
      #{someOutParamB, javaType=Object, jdbcType=ARRAY, jdbcTypeName=SOMEJDBCTYPE, mode=OUT})} 
</update> 

因此,要获取出参数,它会看起来像这样。

mapper.getSomeProcedure(someBean); 
//out params populated on the object passed to the mapper :) 
String outA = bean.getSomeOutParamA(); 

这有点难以解释,这有道理吗?

+0

感谢您的答复!是的,我明白你如何用XML映射器来做到这一点,然而,我很好奇是否可以用纯注释做同样的事情? – snoozy 2012-02-10 05:28:38

+0

同样应该使用注释。我只是复制了一些代码并更改了名称,我不想将它转换为注释选择。 – Andy 2012-02-10 13:42:08

5

使用MyBatis-Spring注释,写下你的代码。

public interface ProductMapper 
{ 
    @Select("exec Pup_ProductSearch_Sel #{searchString}, #{pageNum}, #{pageSize}, #{totalRows,mode=OUT,jdbcType=NUMERIC}") 
    @Options(statementType = StatementType.CALLABLE) 
    public List<Map<String, Object>> productSearch(ProductSearchParameters params); 


    public class ProductSearchParameters 
    { 
     private String searchString = null; 
     private Integer pageNum = 1; 
     private Integer pageSize = 5; 
     private Integer totalRows = -1; 

     // Accessors go here... 
    } 
} 

IN参数由我们在调用代码中填充。 OUT参数由数据访问层填充,并在调用映射器后出现在params对象中。

@Service 
public class TestService 
{ 
    @Resource 
    private ProductMapper mapper; 


    public void run() 
    { 
     final ProductMapper.ProductSearchParameters params = new ProductMapper.ProductSearchParameters(); 
     params.setSearchString("book"); // IN parameter 
     final List<Map<String, Object>> results = mapper.productSearch(params); 

     for(final Map<String, Object> product : results) 
     { 
      System.out.println(product.get("title")); 
     } 

     System.out.println("Total results: " + params.getTotalRows()); // OUT parameter 
    } 
} 

通过这个帖子的启发:http://ibatis.10938.n7.nabble.com/IBatis-3-0-beta-10-annotations-stored-procedures-td7806.html

相关问题