Partage de technologie

[MyBatis] Théorie MyBatis 40 questions (2)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Théorie MyBatis 40 questions》Contient les 2 articles suivants :


Théorie MyBatis 40 questions (2)

21. Comment obtenir la clé primaire générée ?

Ajouter une nouvelle balise :keyProperty=“ID” C'est ça.

<insert id="insert" useGeneratedKeys="true" keyProperty="userId" >
	insert into user(user_name, user_password, create_time)
	values(#{userName}, #{userPassword} , #{createTime, jdbcType=TIMESTAMP})
</insert>
  • 1
  • 2
  • 3
  • 4

22.QuandClasse d'entitéQue dois-je faire si les noms d’attributs sont différents des noms de champs du tableau ?

(1) En interrogeant SQL Définissez l'alias du nom du champ dans l'instruction pour rendre l'alias du nom du champ cohérent avec le nom de l'attribut de la classe d'entité.

<select id="getOrder" parameterType="int" resultType="com.jourwon.pojo.Order">
	select order_id id, order_no orderno, order_price price form orders
	where order_id=#{id};
</select>
  • 1
  • 2
  • 3
  • 4

(2) Passer <resultMap> Pour mapper la correspondance biunivoque entre les noms de champs et les noms d'attributs de classe d'entité.

<select id="getOrder" parameterType="int" resultMap="orderResultMap">
	select * from orders where order_id=#{id}
</select>

<resultMap type="com.jourwon.pojo.Order" id="orderResultMap">
	<!-- 用id属性来映射主键字段 -->
	<id property="id" column="order_id">
	<!-- 用result属性来映射非主键字段,property为实体类属性名,column为数据库表中的属性 -->
	<result property="orderno" column="order_no" />
	<result property="price" column="order_price" />
</reslutMap>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

23.Quelles sont les manières d'écrire Mapper ?

(1) Héritage de classe d'implémentation d'interface SqlSessionDaoSupport: Pour utiliser cette méthode, vous devez écrire mapper interface,mapper Classe d'implémentation d'interface,mapper.xml document.

  • exister sqlMapConfig.xml Configuration moyennemapper.xml la position.
<mappers>
	<mapper resource="mapper.xml 文件的地址" />
	<mapper resource="mapper.xml 文件的地址" />
</mappers>
  • 1
  • 2
  • 3
  • 4
  • définition mapper interface.
  • Implémenter l’intégration de classes SqlSessionDaoSupportmapper Peut être utilisé dans les méthodesthis.getSqlSession() Effectuer l'ajout, la suppression, la modification et la vérification des données.
  • spring configuration.
<bean id=" " class="mapper 接口的实现">
	<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
  • 1
  • 2
  • 3

(2) Utilisation org.mybatis.spring.mapper.MapperFactoryBean

  • exister sqlMapConfig.xml Configuration moyennemapper.xml poste simapper.xml etmapper Les interfaces portent le même nom et se trouvent dans le même répertoire, aucune configuration n'est donc requise ici.
  • définition mapper interface.
<mappers>
	<mapper resource="mapper.xml 文件的地址" />
	<mapper resource="mapper.xml 文件的地址" />
</mappers>
  • 1
  • 2
  • 3
  • 4
  • mapper.xml milieunamespace pourmapper L'adresse de l'interface.
  • mapper Le nom de la méthode dans l'interface etmapper.xml défini dansstatement deid être cohérent.
  • Spring défini dans.
<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
	<property name="mapperInterface" value="mapper 接口地址" />
	<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
  • 1
  • 2
  • 3
  • 4

(3) Utiliser mapper scanner.

  • mapper.xml Rédaction de documents.
    • mapper.xml milieunamespace pourmapper L'adresse de l'interface ;
    • mapper Le nom de la méthode dans l'interface etmapper.xml défini dansstatement deid être cohérent;
    • Si mapper.xml etmapper Si le nom de l'interface reste cohérent, il n'est pas nécessaire desqlMapConfig.xml Configurez dans .
  • définition mapper interface.Avismapper.xml nom du fichier etmapper Les noms d'interface doivent être cohérents et placés dans le même répertoire.
  • Configuration mapper scanner.
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="mapper 接口包地址"></property>
	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
  • 1
  • 2
  • 3
  • 4
  • Après avoir utilisé le scanner depuis spring Extraire du conteneurmapper objet d’implémentation.

24.Qu'est-ce que MonBatis liaison d'interface? Quelles sont les modalités de mise en œuvre ?

La liaison d'interface consiste à définir arbitrairement une interface dans MyBatis, puis à combiner les méthodes de l'interface avec SQL déclarationLiaison, on peut appeler directement la méthode d'interface, donc par rapport à l'original SqlSession Les méthodes fournies nous permettent d'avoir des choix et des paramètres plus flexibles.

Il existe deux manières d'implémenter la liaison d'interface :

  • Lier via des annotations consiste à ajouter @Select@Update Attendez les annotations contenant des instructions SQL à lier ;
  • passer xml Écrivez du SQL à l'intérieur pour lier. Dans ce cas, vous devez spécifier.xml dans le fichier de mappagenamespace Doit être le chemin d'accès complet de l'interface.Lorsque l'instruction SQL est relativement simple, utilisez la liaison d'annotation. Lorsque l'instruction SQL est relativement complexe, utilisez.xml Reliure, usage généralxml Il y a plus de liaisons.

25. Quelles sont les conditions requises pour appeler à l’aide de l’interface du mappeur MyBatis ?

  • Nom de la méthode de l'interface du mappeur et mapper.xml de chaque SQL défini dansid même.
  • Les types de paramètres d'entrée des méthodes d'interface Mapper et mapper.xml de chaque SQL défini dansparameterType du même type.
  • Les types de paramètres de sortie des méthodes d'interface Mapper et mapper.xml de chaque SQL défini dansresultType du même type.
  • Mapper.xml dans le fichiernamespace C'est le chemin de classe de l'interface Mapper.

26. Comment fonctionne cette interface Dao ? Si la méthode dans l’interface Dao a des paramètres différents, la méthode peut-elle être surchargée ?

  • Le principe de fonctionnement de l'interface Dao est le proxy dynamique JDK. MyBatis utilisera le proxy dynamique JDK pour générer un proxy pour l'interface Dao lors de son exécution. proxy objet, objet proxyproxy Les méthodes d'interface seront interceptées et exécutées à la placeMappedStatement représente le SQL, puis renvoie les résultats de l'exécution SQL.
  • Les méthodes de l'interface Dao ne peuvent pas être surchargées car Nom complet + nom de la méthode Sauvegarder et trouver des stratégies.

27. Dans le fichier de mappage XML de MyBatis, l'identifiant peut-il être répété dans différents fichiers de mappage XML ?

  • Différents fichiers de mappage XML, si configurés namespace,Donc id Peut être répété s’il n’est pas configuré ;namespace,Donc id ne peut pas être répété après tout ;namespace Pas obligatoire, juste une bonne pratique.
  • La raison est namespace + id est tel que M ap &lt; S string , Énoncé M apped &gt; M ap<String, MappedStatement>Munp<Stldansg,MunppetttdStuntetttmetttnt> La clé à utiliser, si aucunenamespace, seulement le reste id,Donc,id La duplication peut entraîner l'écrasement des données.J'ai comprisnamespace,nature id Vous pouvez le répéter,namespace différent,namespace + id Naturellement, c'est différent.

28. Décrivez brièvement la relation de mappage entre le fichier de mappage XML de MyBatis et la structure de données interne de MyBatis ?

MyBatis encapsule toutes les informations de configuration XML dans des objets lourds tout-en-un Configuration interne. Dans le fichier de mappage XML,<parameterMap> La balise sera analysée commeParameterMap objet, chacun de ses éléments enfants sera analysé commeParameterMapping objet.<resultMap> La balise sera analysée commeResultMap objet, chacun de ses éléments enfants sera analysé commeResultMapping objet.Chaque<select><insert><update><delete> Les balises seront analysées commeMappedStatement Objet, le SQL dans la balise sera analysé commeBoundSql objet.

29.Comment MyBatis encapsule-t-il les résultats de l'exécution SQL dans des objets cibles et les renvoie-t-il ? Quels sont les formulaires de cartographie ?

  • La première consiste à utiliser <resultMap> Les balises définissent la relation de mappage entre les noms de colonnes et les noms d'attributs d'objet, un par un.
  • La seconde consiste à utiliser la fonction d'alias de colonne SQL et à écrire l'alias de colonne comme nom d'attribut d'objet, tel que T_NAME AS NAME, le nom de l'attribut de l'objet est généralement name, en minuscules, mais les noms de colonnes ne sont pas sensibles à la casse. MyBatis ignorera la casse des noms de colonnes et trouvera intelligemment les noms d'attributs d'objet correspondants. Vous pouvez même écrire. T_NAME AS NaMe, MyBatis peut toujours fonctionner normalement.

Après avoir établi la relation de mappage entre les noms de colonnes et les noms d'attributs, MyBatis crée des objets par réflexion et utilise la réflexion pour attribuer des valeurs une par une aux propriétés de l'objet et les renvoyer pour les propriétés qui ne trouvent pas la relation de mappage. , le devoir ne peut pas être terminé.

30.En plus des balises select | insert | update | delete communes, quelles autres balises y a-t-il dans le fichier de mappage XML ?

Il existe de nombreuses autres balises, <resultMap><parameterMap><sql><include><selectKey>, plus SQL dynamique 9 9 9 Mots clés:trimwheresetforeachifchoosewhenotherwisebind attendez.dans<sql> Pour les balises de fragment SQL, transmettez<include> Les balises introduisent des fragments SQL,<selectKey> Générez des étiquettes de stratégie pour les clés primaires qui ne prennent pas en charge l'incrémentation automatique.

31. Dans le fichier de mappage MyBatis, si la balise A fait référence au contenu de la balise B via include, la balise B peut-elle être définie après la balise A, ou doit-elle être définie devant la balise A ?

Bien que MyBatis analyse le fichier de mappage XML dans l'ordre, la balise B référencée peut toujours être définie n'importe où et MyBatis peut l'identifier correctement.

Le principe est que MyBatis analyse la balise A et constate que la balise A fait référence à la balise B, mais que la balise B n'a pas été analysée et n'existe pas encore. À ce stade, MyBatis marquera la balise A comme non résolue, puis continuera. pour analyser les balises restantes, y compris les balises B., une fois toutes les balises analysées, MyBatis réanalysera les balises marquées comme non résolues. Lors de l'analyse de la balise A, la balise B existe déjà et la balise A peut être analysée normalement.

32. MyBatis peut-il effectuer des requêtes de contact un-à-plusieurs et un-à-un ? Quelles sont les méthodes de mise en œuvre ?

Peut, non seulement peut Un à plusieurs, un à un,Bien assez Plusieurs-à-plusieurs, plusieurs-à-un . Ceci est obtenu comme suit:

  • Envoyez un code SQL distinct pour interroger l'objet associé, affectez-le à l'objet principal, puis renvoyez l'objet principal.
  • En utilisant des requêtes imbriquées, similaires aux requêtes JOIN, une partie est la valeur d'attribut de l'objet A et l'autre partie est la valeur d'attribut de l'objet associé B. L'avantage est que tant qu'une valeur d'attribut est envoyée, l'objet principal et le l'objet associé peut être trouvé.
  • sous-requête

33.MyBatis peut-il mapper la classe d'énumération Enum ?

MyBatis peut mapper des classes d'énumération. Non seulement il peut mapper des classes d'énumération, mais MyBatis peut mapper n'importe quel objet à une colonne du tableau.La méthode de cartographie est personnaliséeTypeHandler,accomplir TypeHandler desetParameter() etgetResult() méthodes d'interface.

TypeHandler Il a deux fonctions, l'une est de compléter lejavaType àjdbcType La conversion, la seconde est terminéejdbcType àjavaType La conversion se reflète commesetParameter() etgetResult() Les deux méthodes représentent respectivement la définition des paramètres d'espace réservé du point d'interrogation SQL et l'obtention des résultats de la requête de colonne.

34.Que fait le SQL dynamique MyBatis ? Quels types de SQL dynamique existe-t-il ? Pouvez-vous décrire brièvement le principe d'exécution du SQL dynamique ?

MyBatis Dynamic SQL nous permet d'écrire du SQL dynamique sous forme de balises dans le fichier de mappage XML pour compléter les fonctions de jugement logique et d'épissage dynamique de SQL fournies par MyBatis. 9 9 9 Balises SQL dynamiques :trimwheresetforeachifchoosewhenotherwisebind

Son principe d'exécution est d'utiliser OGNL Calculez la valeur de l'expression à partir de l'objet paramètre SQL et épissez dynamiquement SQL en fonction de la valeur de l'expression pour compléter la fonction de SQL dynamique.

35.Comment MyBatis effectue-t-il la pagination ? Quel est le principe du plug-in de pagination ?

MyBatis utilise RowBounds L'objet est paginé, c'est pourResultSet La pagination de mémoire effectuée par le jeu de résultats n'est pas une pagination physique. Vous pouvez écrire directement des paramètres avec une pagination physique dans SQL pour compléter la fonction de pagination physique, ou vous pouvez utiliser un plug-in de pagination pour effectuer une pagination physique.

Le principe de base du plug-in de pagination est d'utiliser l'interface de plug-in fournie par MyBatis pour implémenter un plug-in personnalisé, d'intercepter le SQL à exécuter dans la méthode d'interception du plug-in, puis de réécrire le SQL en fonction à dialect Dialecte, ajoutez les instructions de pagination physique correspondantes et les paramètres de pagination physique.

Exemple:

select * from student
  • 1

Après avoir intercepté le SQL, réécrivez-le comme :

select t.* from (select * from student) t limit 0, 10
  • 1

36. Décrivez brièvement le principe de fonctionnement du plug-in MyBatis et comment écrire un plug-in ?

MyBatis ne peut écrire que pour ParameterHandlerResultSetHandlerStatementHandlerExecutor ce 4 4 4 Sorte de plug-in d'interface, MyBatis utilise le proxy dynamique du JDK pour générer des objets proxy pour les interfaces qui doivent être interceptées pour implémenter la fonction d'interception de la méthode d'interface. Chaque fois que celle-ci est exécutée, 4 4 4 méthode d'un objet d'interface, il entrera dans la méthode d'interception, plus précisémentInvocationHandler deinvoke() Bien entendu, les méthodes n’intercepteront que les méthodes que vous spécifiez comme intercepter.

Implémenter MyBatis Interceptor Interface et remplacementintercept() Méthode, puis écrivez des annotations pour le plug-in et spécifiez les méthodes de quelle interface vous souhaitez intercepter. N'oubliez pas de configurer le plug-in que vous avez écrit dans le fichier de configuration.

37. Cache de premier et deuxième niveaux de MyBatis

  • Cache de niveau 1 : basé sur PerpetualCache Cache local HashMap, sa portée de stockage est Session, lorsque Sessionflush ouclose Après cela, tous les caches de la session seront effacés et le cache de premier niveau sera activé par défaut.
  • Le cache de deuxième niveau a le même mécanisme que le cache de premier niveau et est également utilisé par défaut. PerpetualCache, Stockage HashMap, la différence est que sa portée de stockage est MapperNamespace), et la source de stockage peut être personnalisée, telle que Ehcache .Le cache de deuxième niveau n'est pas activé par défaut. Pour activer le cache de deuxième niveau, la classe d'attributs de cache de deuxième niveau doit être implémentée.Serializable Interface de sérialisation (peut être utilisée pour sauvegarder l'état d'un objet), configurable dans son fichier de mappage<cache/>
  • Pour le mécanisme de mise à jour des données du cache, lorsqu'une certaine portée (session de cache de premier niveau / espace de noms de cache de deuxième niveau) est C / U / D Après l'opération, par défaut tous les fichiers de cette portéeselect Le cache seraclear