Préface
Lorsque nous faisons du développement de services back-end, en particulier lorsque les mégadonnées sont insérées par lots, les cadres ORM ordinaires (MyBatis, Hibernate, JPA) ne peuvent pas répondre aux exigences de performance du programme. Bien sûr, il nous est impossible d'utiliser JDBC natif pour fonctionner, de sorte que bien que l'efficacité soit élevée, la complexité augmentera.
Compte tenu de compensation, nous utilisons JDBCTemplate à Spring et nommé ParameterJDBCTemplate pour effectuer des opérations par lots.
Avant la transformation
Avant de commencer l'explication, voyons d'abord comment JPA a fonctionné par lots.
Utilisateur de l'entité:
classe publique AppStudent {ID entier privé; Classid entier privé; nom de chaîne privé; Âge entier privé; // pseudocode, constructions omises et get, définir des méthodes}DynamicQuery Pseudocode:
@RepositoryPublic Class DynamicQueryIMPL implémente DynamicQuery {@PersistenceContext EntityManager EM; EntityManager publique GetEntityManager () {return EM; } // En fait, c'est juste pour Loop et utiliser la méthode persistante d'EtityManager pour enregistrer @Override public <T> void Savelist (list <t> resultList) {for (int i = 0; i <resultList.size (); i ++) {t t = resultList.get (i); Em.Sersiste (T); }}}Après la transformation
JdbcTemplate
Les principales méthodes fournies par JDBCTemplate:
Nous avons juste besoin d'utiliser @Autowired pour l'injection dans la classe JDBCTemplate:
@AutowiredPrivate JDBCTemplate JDBCTemplate;
Fonctionnement de l'insertion par lots:
public void batchsave () {list <object []> batchargs = new ArrayList <objet []> (); Batchargs.add (nouvel objet [] {1, "xiao ming", 21}); Batchargs.add (nouvel objet [] {2, "xiaohong", 22}); BatchArgs.Add (nouvel objet [] {3, "Lucy", 23}); String sql = "Insérer dans l'utilisateur (nom d'utilisateur, mot de passe) (?,?)"; JDBCTemplate.BatchUpDate (SQL, Batchargs);}Ce qui précède implémente essentiellement la fonction d'insert par lots, mais lorsqu'il existe de nombreux champs de base de données, il n'est peut-être pas si bon de le coder sous la forme d'un espace réservé. Ici, Spring fournit également SimpleJDBCTemplate (Spring3.1 + est marqué comme étant obsolète plus tard, mais il est complètement supprimé au printemps 4.3. Ce dernier peut entièrement répondre aux besoins) et nommé PARAMETERJDBCTEmplate moteur.
NamedParameterjdbCTemplate
Je crois que les étudiants qui ont utilisé l'hibernate savent qu'il peut être utilisé à HQL? Ou: * Pour configurer les paramètres de requête en externe. Dans le cadre JDBC Spring, un moyen de lier les paramètres SQL est également fourni, en utilisant des paramètres nommés.
Nous avons juste besoin d'utiliser @Autowired pour l'injection dans la classe NamedParameterJDBCTemplate:
@AutowiredPrivate NamedParameterJDBCTemplate NamedParameterJDBCTemplate;
Fonctionnement de l'insertion par lots:
public void batchsave () {list <serv> list = new ArrayList <Serser> (); // Ajouter une nouvelle liste d'utilisateurs.add (new AppStudent (1, "Zhang San", 21)); list.add (nouveau appstudent (1, "li si", 22)); list.add (nouveau appstudent (1, "Wang Ermazi", 23)); // Batch to Array SqlParameTeterSource [] beansources = sqlparametersourceutils.createbatch (list.toArray ()); String sql = "Insérer dans App_student (class_id, nom, âge) VALEURS (: Classid ,: name ,: Âge)"; NamedParameterJDBCTemplate.BatchUpdate (SQL, BeanSources);}Enfin, nous utilisons System.CurrentTimemillis () pour comparer et imprimer le temps d'exécution avant et après la transformation spécifique.
Long start = System.currentTimemillis (); // Remodeler le code avant et après, et le compléter vous-même longueur = System.Currenttimemillis (); System.out.println ("Second Time:" + (End-Start));Fast est vraiment rapide. Quant à la vitesse à laquelle il est, il doit faire une comparaison pertinente en fonction du volume de données et de la configuration de la machine.
Code source du projet: https://gitee.com/52itstyle/spring-data-jpa
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.