2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
《Théorie MyBatis 40 questions》Contient les 2 articles suivants :
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) 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>
(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) 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.
sqlMapConfig.xml
Configuration moyennemapper.xml
la position.<mappers>
<mapper resource="mapper.xml 文件的地址" />
<mapper resource="mapper.xml 文件的地址" />
</mappers>
mapper
interface.SqlSessionDaoSupport
。mapper
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>
(2) Utilisation org.mybatis.spring.mapper.MapperFactoryBean
。
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.mapper
interface.<mappers>
<mapper resource="mapper.xml 文件的地址" />
<mapper resource="mapper.xml 文件的地址" />
</mappers>
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>
(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;mapper.xml
etmapper
Si le nom de l'interface reste cohérent, il n'est pas nécessaire desqlMapConfig.xml
Configurez dans .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.mapper
scanner.<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="mapper 接口包地址"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
spring
Extraire du conteneurmapper
objet d’implémentation.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 :
@Select
、@Update
Attendez les annotations contenant des instructions SQL à lier ;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.mapper.xml
de chaque SQL défini dansid
même.mapper.xml
de chaque SQL défini dansparameterType
du même type.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.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.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.namespace + id
est tel que M ap < S string , Énoncé M apped > 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.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.
<resultMap>
Les balises définissent la relation de mappage entre les noms de colonnes et les noms d'attributs d'objet, un par un.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é.
Il existe de nombreuses autres balises, <resultMap>
、<parameterMap>
、<sql>
、<include>
、<selectKey>
, plus SQL dynamique
9
9
9 Mots clés:trim
、where
、set
、foreach
、if
、choose
、when
、otherwise
、bind
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.
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.
Peut, non seulement peut Un à plusieurs, un à un,Bien assez Plusieurs-à-plusieurs, plusieurs-à-un . Ceci est obtenu comme suit:
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.
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 :trim
、where
、set
、foreach
、if
、choose
、when
、otherwise
、bind
。
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.
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
Après avoir intercepté le SQL, réécrivez-le comme :
select t.* from (select * from student) t limit 0, 10
MyBatis ne peut écrire que pour ParameterHandler
、ResultSetHandler
、StatementHandler
、Executor
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.
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.PerpetualCache
, Stockage HashMap, la différence est que sa portée de stockage est Mapper
(Namespace
), 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/>
。C
/ U
/ D
Après l'opération, par défaut tous les fichiers de cette portéeselect
Le cache seraclear
。