Utilisez un TypeHandler implicite basé sur resultType pour select dans MyBatis
Je suis en train de sélectionner un timestamp dans MyBatis et de le retourner comme un LocalDateTime (à partir de joda-time).
Ma configuration fonctionne très bien si je tente de retourner le résultat en java.sql.Timestamp
. J'ai prouvé mon type de gestionnaire fonctionne très bien: si j'utilise un emballage de classe avec un LocalDateTime
comme seul champ et un resultMap dans le MyBatis mappeur de fichier, j'obtiens des résultats corrects.
Cependant, quand j'ai essayer de préciser la org.joda.time.LocalDateTime
comme resultType
pour cette sélection, j'ai toujours null
comme si le type de gestionnaire est ignoré.
C'est ma compréhension que MyBatis utilise une valeur par défaut typeHandler dans le cas que j'ai resultType="java.sql.Timestamp"
. En conséquence, je m'attendais à utiliser l'un des typeHandlers j'ai configuré lors de la réunion resultType="org.joda.time.LocalDateTime"
.
Ai-je raté quelque chose? Est-il un moyen de faire usage de mes typeHandler ou suis-je obligé de faire un wrapper de classe et resultMap? C'est mon secours à une solution, mais je voudrais éviter si possible.
Toute aide appréciée. Merci.
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeHandlers>
<typeHandler javaType="org.joda.time.LocalDate" jdbcType="DATE" handler="...LocalDateTypeHandler"/>
<typeHandler javaType="org.joda.time.LocalDateTime" jdbcType="TIMESTAMP" handler="...LocalDateTimeTypeHandler"/>
</typeHandlers>
</configuration>
NotifMailDao.java
import org.joda.time.LocalDateTime;
public interface NotifMailDao {
LocalDateTime getLastNotifTime(String userId);
}
NotifMailDao.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="lu.bgl.notif.mail.dao.NotifMailDao">
<select id="getLastNotifTime" resultType="org.joda.time.LocalDateTime">
SELECT current_timestamp
AS last_time
FROM DUAL
</select>
</mapper>
source d'informationauteur Chop
Vous devez vous connecter pour publier un commentaire.
D'utiliser le TypeHandler de configuration, MyBatis besoins de connaître à la fois le type Java de l'objet et le type SQL de la colonne source.
Ici, nous utilisons une
resultType
dans le<select />
donc MyBatis connaît le type Java, mais il ne peut pas savoir le type SQL si nous ne le définit pas. Le seul moyen est d'utiliser un<resultMap />
.La solution
Vous avez besoin pour créer un Haricot avec un seul champ contenant l'objet que vous souhaitez retourner (nous allons l'appeler ce domaine
time
) et l'utilisation d'un<resultMap />
:Si vous souhaitez épargner à la création de haricots, vous pouvez également utiliser l'attribut
type=hashmap
sur votre<resultMap />
comme suggéré par Shobit.Variante: définissez la propriété sur le
LocalDateTime
Un solution a été proposé sur des Groupes de Google, qui règle directement les informations sur le
LocalDateTime
.Ma compréhension de celui-ci (s'il vous plaît commentaire si je me trompe), c'est qu'il définit une propriété de la
LocalDateTime
. Je ne vais pas se porter garant pour elle que je n'ai pas trouver le correspondant dans le Doc API (et je ne l'ai pas testé) mais n'hésitez pas à l'utiliser si vous le jugez mieux.Pourquoi il fonctionne avec
java.sql.Timestamp
Timestamp
est une norme de type Java, SQL, avec une valeur par défaut JDBC mise en œuvre (jeu de résultats.méthode gettimestamp(int/String)
). Le gestionnaire par défaut pour MyBatis utilise cette getter1 et ne nécessite donc pas de TypeHandler de cartographie. J'espère que cela se produit chaque fois que vous utilisez l'un des gestionnaires par défaut.1: C'est une intuition. Citation nécessaire!
Cette réponse n'attend que d'être remplacé par quelque chose de mieux. Merci de contribuer!