- 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.
Zobrazují se příspěvky se štítkemMyBatis. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemMyBatis. Zobrazit všechny příspěvky
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.
čtvrtek 8. března 2012
EJB jar včetně závislostí
Potřeboval jsem vytvořit EJB jar v němž měly být obsaženy také všechny závislosti. V mém případě MyBatis a Spring Framework. Pro buildování používám maven. Do výsledného jaru samozřejmě nelze zabalit přímo další jary, je třeba je nejprv rozbalit. To vyřešil mavenovský plugin maven-dependency-plugin přidaný do pom.xml. Zajímavá je v tomto místě především jeho část execution:
<execution>
<id>unpack-dependencies</id>
<phase>process-classes</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<!--Definuji co se ma rozbalit do vysledneho jaru-->
<includeGroupIds>org.springframework,org.mybatis</includeGroupIds>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
</configuration>
</execution>
Aby byly přibalené závislosti také v classpath, vypadala definice pluginu maven-ejb-plugin následovně: <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ejb-plugin</artifactId>
<version>2.3</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
<ejbVersion>3.1</ejbVersion>
</configuration>
</plugin>
Výsledkem celého snažení ovšem byla nicneříkající chyba:Caused by: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 9 in XML document from URL [file:.../META-INF/applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'.
Naštěstí jsem narazil na blogspot, který tento problém řeší následovně: "stačí" ze všech použitých springových jarů vybrat soubory META-INF/spring.handlers a META-INF/spring.schemas a sloučit je pouze do dvou. Tyto dva dát do adresáře META-INF a celé to zabalit do jaru. Výsledný jar, pak umístit do lib aplikačního serveru. V případě použití novější verze springu může být třeba tyto soubory doeditovat.
Přihlásit se k odběru:
Příspěvky (Atom)