MyBatis Cartographie de plusieurs colonnes d'un tableau
Je suis en train de travailler avec un (ancien) application java et DB et j'ai besoin de la carte avec MyBatis plusieurs colonnes d'une Matrice unique de la propriété
Ma requête est quelque chose comme
select price1, price2, price3, qty1, qty2,qty3 ... from table where ....
et le pojo est
public class Price{
double[] prices = new double[3]
int[] quantity = new int[3]
public double[] getPrices(){}
public void setPrices(double[] prices){...}
public int[] getQty(){...}
public void setQty(int[] quantities){...}
....
}
Malheureusement je ne peux pas modifier ni la requête ni de l'objet java
N'importe quel bout?
OriginalL'auteur pbanfi | 2012-08-03
Vous devez vous connecter pour publier un commentaire.
aussi, vous pouvez mettre en œuvre la BaseTypeHandler de l'interface et dans getNullableResult méthode de l'objet ResultSet variable est disponible pour vous. Donc, vous pouvez facilement obtenir toutes les colonnes dont vous avez besoin et de les mettre dans le Tableau.
OriginalL'auteur Mike
Vous dites que vous ne pouvez pas modifier la requête si cela signifie que vous ne pouvez pas modifier le SQL, mais vous pouvez changer votre MyBatis la cartographie, alors je vous recommande d'utiliser le MyBatis ObjectFactory. Vous définissez une sous-classe de
DefaultObjectFactory
et remplacer lecreate
méthode. Le ObjectFactory reçoit les arguments que vous avez spécifié comme "constructeur args" dans votre MyBatis ResultMap.Votre MyBatis cartographie précise maintenant que le prix des champs sont des arguments du constructeur, même si elles ne sont pas vraiment. C'est juste un moyen pratique pour passer des données brutes à votre propre gestionnaire/usine.
Vous remplacer MyBatis' par défaut ObjectFactory, en mettant dans votre mybatis config.xml:
Et puis PriceObjectFactory va ressembler à quelque chose comme ceci:
Si vous aussi vous voulez/besoin d'avoir des arguments supplémentaires au Prix constructeur (comme une pièce d'identité), puis spécifiez ceux de la
<constructor>
section de la cartographie et de la il sera également passé dans votre PriceObjectFactory.J'ai précisé ma question 🙂
J'ai travaillé sur d'autres options et ne pouvait pas trouver un moyen facile. Ce n'est pas un problème dans MyBatis " sweet spot, aussi loin que je puisse savoir comment l'utiliser. J'ai une autre option ci-dessous, mais dans l'ensemble je préfère la réponse ici, car vous pouvez utiliser un Mappeur de la classe, pas juste du xml. Et vous ajoutez ce que vous avez besoin de la
<constructor>
section de votre XML. Il est de "commentaires" que vous avez à gérer tout cela directement, un peu comme si vous faisiez pur JDBC, mais vous pouvez encapsuler le tout dans un seul endroit (l'usine ou ResultHandler ci-dessous) et le reste du code n'ont pas à traiter avec elle.OriginalL'auteur quux00
Une autre option est de créer un ResultHandler, qui est un MyBatis interface que vous pouvez passer à la
SqlSession#select
méthode pour gérer les données de retour à partir de votre requête.Voici comment vous pouvez l'utiliser pour résoudre votre problème.
D'abord définir un PriceResultHandler, quelque chose comme ceci:
La raison pour laquelle le ResultHandler reçoit une HashMap est parce que vous devez définir votre cartographie comme ceci:
Puis vous l'appelez dans votre code Java comme suit:
Ce modèle est à peu près la même quantité de travail que l'autre option que j'ai donné dans l'autre réponse. MyBatis est tout simplement la cartographie de la JDBC ResultSet dans une Carte pour vous et ensuite vous apporter les objets de domaine avec elle que vous voyez l'ajustement.
Un inconvénient de cette méthode est que vous avez à traiter avec le cas de sensibilité à la question des noms de colonne sur les cartes. Vous ne pouvez pas contrôler ce via MyBatis. Cela dépend du comportement de la sous-jacentes pilote JDBC: https://stackoverflow.com/a/11732674/871012
OriginalL'auteur quux00