Comment implémenter des opérations par lots avec MyBatis / Spring?
Je me demande comment mettre en œuvre des opérations de traitement par lots avec mes états d'insertion à l'aide de MyBatis 3 & le Printemps 3?
Par exemple, voici ce qui se fait actuellement:
spring.xml:
<bean id="jndiTemplateDatasource" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">${context.factory}</prop>
</props>
</property>
</bean>
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref="jndiTemplateDatasource"/>
<property name="jndiName" value="${connectionpool.jndi}"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.test" />
</bean>
MyService.xml:
<insert id="insertMyRecord" parameterType="com.test.MyRecord" >
insert into ... //code removed
</insert>
MyService.java:
public interface MyService {
public void insertMyRecord (MyRecord);
}
MyController.java:
@Controller
public class MyController {
@Autowired
private MyService myService;
@Transactional
@RequestMapping( .... )
public void bulkUpload (@RequestBody List<MyRecord> myRecords) {
for (MyRecord record : myRecords) {
myService.insertMyRecord(record);
}
}
}
Avertissement: C'est juste le pseudo-code pour les besoins de la démonstration
Alors, que puis-je faire pour le transformer en un processus de traitement par lots?
Idéalement, je veux être en mesure de le faire avec moins "intrusion" dans le code, c'est à dire utiliser des annotations plus préféré, mais si pas possible, quelle est la prochaine meilleure chose?
Aussi, ce doit être configuré pour un service, pas pour tout le projet.
source d'informationauteur Trant
Vous devez vous connecter pour publier un commentaire.
C'est en cours d'exécution et testé exemple ...
Mettre à jour plusieurs lignes à l'aide de commandes (ibatis + java )
Dans ce ex. Je mets à jour assister à compter à partir de la table avec de partyid.
Modèle de classe où la variable est définie :
party.xml code
De la requête réelle des lots, exécuter
Le code de l'Interface ici
Ici est mon lot code de session
Accepté la réponse ci-dessus n'est pas vous mode batch pour MyBatis. Vous devez choisir le bon Exécuteur via ExecutorType.LOT. Qui est passé en paramètre à SqlSession.openSession dans la norme MyBatis API ou, si l'utilisation de MyBatis-Printemps, comme une option pour le SqlSessionTemplate. Ce qui est fait par l'intermédiaire de:
Il n'y a rien d'autre à faire.
Je ne suis pas sûr de comprendre la question tout à fait correcte, mais je vais essayer de vous donner mes pensées.
Pour faire le service unique que je recommanderais à generify l'interface de service:
Ensuite, vous pouvez vérifier le type de l'objet et l'appel de la propper mappeur de référentiel.
Alors vous pouvez generify plus par la création d'une interface commune:
et de la prolonger votre mapper interface:
Maintenant l'étape la plus compliquée: vous obtenez l'objet d'un type particulier, voir ce exact mappeur met en œuvre le Créateur de l'interface de cette classe (à l'aide de java API reflection) et appeler la méthode particulière.
Maintenant je vous donne le code que j'utilise dans un de mes projets:
Avertissement! Cette approche peut avoir des mauvaises performances de l'impact afin de l'utiliser dans la non-performance-actions critiques
Si vous voulez bulk insert je vous recommande d'utiliser mybatis foreach pour l'insertion en bloc comme décrit ici.
Si vous pensez que vous ne voulez pas écrire de sql pour chaque type d'objets que vous mieux utiliser Hibernate ou toute autre ORM. MyBatis est juste un SQL interface de cartographie.