Une note sur les opérations de mise à jour batch mybatis


Deux jours avant le blog est à l'opération mise à jour batch écriture mybatis écriture aujourd'hui sur les mybatis considérations mises à jour par lots concernés

Tout d'abord, cet article utilise une méthode de temps, mais il est relativement fréquent,

les opérations par lots premiers à effectuer mybatis le premier à ouvrir le lot qui est couplé aux informations de connexion d'URL dans jdbc & allowMultiQueries = true

Cette méthode est dao

int updateAllList(List<Map<String, Object>> list);

Parce que fait ces derniers temps le travail des formes communes et des modules, donc je ne sais pas dans quel format les données pour mon sql donc écrit

  <update id="updateAllList" parameterType="java.util.List" >
  
  <foreach collection="list" item="maps"  separator=";">
  		update ${maps['tableName']} set
  			<foreach collection="maps.keys" item="k" separator=",">
  				<if test="k != 'tableName' and k != 'id' and k != 'createTime' and maps[k] != null">
  					${k} = #{maps[${k}]}
  				</if>
  			</foreach>
  		where id = ${maps['id']}
  
  </foreach>
  	
  </update>
Parce que mes données sont encapsulées dans la façon dont je traverse la carte dans la carte est écrit ci-dessus que je ne l'ai pas eu tort, mais cela !!
${k} = #{maps[${k}]}
manière Traversal dans l'opération de mise à jour batch échoue

Des informations spécifiques est donnée comme suit:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'maps' not found. Available parameters are [list, collection]
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
	at com.sun.proxy.$Proxy16.update(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:294)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:55)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)
	at com.sun.proxy.$Proxy17.updateAllList(Unknown Source)
	at com.yinsheng.service.impl.WorkServiceImpl.compute(WorkServiceImpl.java:1277)
	at com.yinsheng.controller.WorkController.compute(WorkController.java:965)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706)
	//后面的就省略了 也没啥用 

Je pensais que ce fut une erreur de voir ce mon problème, je l'ai écrit dans sql SQL imprimé sur la console après la découverte que le problème est pas alors je soupçonne que la raison est parce que je mène une double foreach du deuxième cycle des cartes n'a pas lu

Ensuite été testé et mon sql est pas un problème, mais parce que:

mybatis lors de l'opération de mise à jour de lot ne peut pas être utilisé lorsque sql # raison est parce que mybatis sql d'abord un bon moyen de raccordement quand une mise à jour de traitement par lots et exécuter directement dans la base de données en utilisant les mots #

L'équivalent d'un poste sont les opérateurs? Effet de sorte que la base de données ne reconnaît pas

Par conséquent couture sql à partir de $ {manière} pour

${k} = ${maps[k]}


Ceci est un point important

Ensuite, je l'ai changé sql après l'apparition de nouveaux problèmes


Unknown column '????°‘?–?' in 'field list'

M'a fait regarder la force ignorante, parce que je ne l'utilise souvent le $ {} pour sql épissure il est donc facile d'oublier le problème est que # {} retour à vous automatiquement extrémités de données plus « » entre guillemets simples - mais le $ {} est sortie comme il est de

Nous utilisons donc $ {} est temps d'ajouter les données aux deux extrémités


  <update id="updateAllList" parameterType="java.util.List" >
  
  <foreach collection="list" item="maps"  separator=";">
  		update ${maps['tableName']} set
  			<foreach collection="maps.keys" item="k" separator=",">
  				<if test="k != 'tableName' and k != 'id' and k != 'createTime' and maps[k] != null">
  					${k} = '${maps[k]}'
  				</if>
  			</foreach>
  		where id = ${maps['id']}
  
  </foreach>
  	
  </update>


Ce sont les paramètres de la façon dont l'opération de mise à jour batch mybatis la liste de carte imbriquée Bien sûr, cela est beaucoup de temps

Voici un article sur l'opération de mise à jour du lot mybatis optimisé]

https://my.oschina.net/ckanner/blog/338515

Vous pouvez consulter



Publié 16 articles originaux · louange gagné 21 · vues 30000 +

Je suppose que tu aimes

Origine blog.csdn.net/q690080900/article/details/77532796
conseillé
Classement