- Použil jsem připojení k databázi Sybase v které jsem volal proceduru. Na vstupu procedury byl parametr typu int. Mapování v xml vypadalo následovně:
psc bylo typu Integer. Mapoval jsem tedy java.lang.Integer z javy na int z databáze. Výsledkem byla následující chyba:<select id="getPostOffice" statementType="CALLABLE" parameterType="biz.prodejna.pasport.PostRequest" resultType="java.lang.Integer"> {call search_post (#{psc})} </select>
Řešením je explicitní uvedení databázového typu pomocí jdbcType:Cause: java.sql.SQLException: JZ006: Caught IOException: java.io.IOException: JZ0SL: Unsupported SQL type 1111. ; SQL []; JZ006: Caught IOException: java.io.IOException: JZ0SL: Unsupported SQL type 1111.; nested exception is java.sql.SQLException: JZ006: Caught IOException: java.io.IOException: JZ0SL: Unsupported SQL type 1111.
<select id="
getPostOffice
" statementType="CALLABLE" parameterType="biz.prodejna.pasport.PostRequest" resultType="java.lang.Integer"> {call search_post (#{psc,jdbcType=INTEGER})} </select>
Pozor na přebytečné mezery. Pokud budou mezery např. kolem znaku "=" nebo za čárkou, vznikne chybaorg.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}
- Často se volá procedura/select, jejíž výsledek je třeba namapovat na třídu. Názvy členských proměnných třídy se však vždy neshodují s názvy sloupců jež jsou výstupem z databáze. K tomu účelu je v MyBatis anotace @Results. Zde je ukázka použití, kde místo předchozího mapování v xml je použita anotace v rozhranní mapperu:
@Select("{call psc_detail_post (#{psc})}") @Results(value = { @Result(property = "psc"), @Result(property = "premisesName", column = "nazev_provozovny"), @Result(property = "municipality", column = "obec"), @Result(property = "municipalityPart", column = "cast_obce"), @Result(property = "street", column = "ulice"), @Result(property = "descriptiveNumber", column = "cislo_popisne"), @Result(property = "descriptiveCharacter", column = "cislo_popisne_znak"), @Result(property = "landmarkNumber", column = "cislo_orientacni"), @Result(property = "landmarkCharacter", column = "cislo_orientacni_znak"), @Result(property = "email"), @Result(property = "phone", column = "telefon")}) biz.prodejna.pasport.PostResponse getDetailPost(Integer psc);
Zde stojí za povšimnutí parametry psc a email. Jelikož se shodují názvy členských proměnných a výstupních sloupců, není třeba uvádět parametr column.
pátek 16. listopadu 2012
Několik tipů pro MyBatis 3
Ač je uživatelská příručka MyBatis 3 napsaná přehledně, lze se setkat s některými problémy či možnostmi, které jsou v ní uvedeny pouze okrajově nebo vůbec.
Přihlásit se k odběru:
Příspěvky (Atom)