Condivisione della tecnologia

[MyBatis] Teoria MyBatis 40 domande (2)

2024-07-12

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

Teoria MyBatis 40 domande》Contiene i seguenti 2 articoli:


Teoria MyBatis 40 domande (2)

21. Come ottenere la chiave primaria generata?

Aggiungi un nuovo tag:keyProperty=“ID” Questo è tutto.

<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.QuandoClasse di entitàCosa devo fare se i nomi degli attributi sono diversi dai nomi dei campi nella tabella?

(1) Interrogando SQL Definire l'alias del nome del campo nell'istruzione per rendere l'alias del nome del campo coerente con il nome dell'attributo della classe di 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) Passaggio <resultMap> Per mappare la corrispondenza uno a uno tra i nomi dei campi e i nomi degli attributi della classe di 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.Quali sono i modi per scrivere Mapper?

(1) Ereditarietà della classe di implementazione dell'interfaccia SqlSessionDaoSupport: Per utilizzare questo metodo, è necessario scrivere mapper interfaccia,mapper Classe di implementazione dell'interfaccia,mapper.xml documento.

  • esistere sqlMapConfig.xml Configurazione mediamapper.xml posizione.
<mappers>
	<mapper resource="mapper.xml 文件的地址" />
	<mapper resource="mapper.xml 文件的地址" />
</mappers>
  • 1
  • 2
  • 3
  • 4
  • definizione mapper interfaccia.
  • Implementare l'integrazione delle classi SqlSessionDaoSupportmapper Può essere utilizzato nei metodithis.getSqlSession() Eseguire l'aggiunta, la cancellazione, la modifica e il controllo dei dati.
  • spring configurazione.
<bean id=" " class="mapper 接口的实现">
	<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
  • 1
  • 2
  • 3

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

  • esistere sqlMapConfig.xml Configurazione mediamapper.xml posizione semapper.xml Emapper Le interfacce hanno lo stesso nome e si trovano nella stessa directory, quindi qui non è necessaria alcuna configurazione.
  • definizione mapper interfaccia.
<mappers>
	<mapper resource="mapper.xml 文件的地址" />
	<mapper resource="mapper.xml 文件的地址" />
</mappers>
  • 1
  • 2
  • 3
  • 4
  • mapper.xml mezzonamespace permapper L'indirizzo dell'interfaccia.
  • mapper Il nome del metodo nell'interfaccia emapper.xml definito instatement Diid essere coerente.
  • Spring definito in.
<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
	<property name="mapperInterface" value="mapper 接口地址" />
	<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
  • 1
  • 2
  • 3
  • 4

(3) Utilizzo mapper scanner.

  • mapper.xml Scrittura di documenti.
    • mapper.xml mezzonamespace permapper L'indirizzo dell'interfaccia;
    • mapper Il nome del metodo nell'interfaccia emapper.xml definito instatement Diid essere coerente;
    • Se mapper.xml Emapper Se il nome dell'interfaccia rimane coerente, non è necessario farlosqlMapConfig.xml Configura in .
  • definizione mapper interfaccia.Avvisomapper.xml nome del file emapper I nomi delle interfacce devono essere coerenti e posizionati nella stessa directory.
  • Configurazione 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
  • Dopo aver utilizzato lo scanner da spring Prendi dal contenitoremapper oggetto di implementazione.

24.Che cos'è Il mio Batis associazione dell'interfaccia? Quali sono le modalità di attuazione?

L'associazione dell'interfaccia consiste nel definire un'interfaccia arbitrariamente in MyBatis e quindi combinare i metodi nell'interfaccia con SQL dichiarazioneAssociazione, possiamo chiamare direttamente il metodo dell'interfaccia, quindi rispetto all'originale SqlSession Le modalità fornite ci permettono di avere scelte e impostazioni più flessibili.

Esistono due modi per implementare l'associazione dell'interfaccia:

  • Legare attraverso le annotazioni significa aggiungere @Select@Update Attendi le annotazioni che contengono istruzioni SQL da associare;
  • passaggio xml Scrivi SQL all'interno per eseguire il bind. In questo caso, è necessario specificarexml nel file di mappaturanamespace Deve essere il percorso completo dell'interfaccia.Quando l'istruzione SQL è relativamente semplice, utilizzare l'associazione di annotazioni. Quando l'istruzione SQL è relativamente complessa, utilizzarexml Rilegatura, uso generalexml Ci sono più attacchi.

25. Quali sono i requisiti per chiamare utilizzando l'interfaccia del mapper di MyBatis?

  • Nome del metodo dell'interfaccia del mappatore e mapper.xml di ogni sql definito inid Stesso.
  • I tipi di parametri di input dei metodi dell'interfaccia Mapper e mapper.xml di ogni sql definito inparameterType dello stesso tipo.
  • I tipi di parametri di output dei metodi dell'interfaccia Mapper e mapper.xml di ogni sql definito inresultType dello stesso tipo.
  • Mapper.xml nel fascicolonamespace Questo è il percorso della classe dell'interfaccia Mapper.

26. Come funziona questa interfaccia Dao? Se il metodo nell'interfaccia Dao ha parametri diversi, è possibile sovraccaricare il metodo?

  • Il principio di funzionamento dell'interfaccia Dao è il proxy dinamico JDK. MyBatis utilizzerà il proxy dinamico JDK per generare un proxy per l'interfaccia Dao durante l'esecuzione. proxy oggetto, oggetto proxyproxy I metodi di interfaccia verranno invece intercettati ed eseguitiMappedStatement rappresenta l'SQL e quindi restituisce i risultati dell'esecuzione SQL.
  • I metodi nell'interfaccia Dao non possono essere sovraccaricati perché Nome completo + nome del metodo Risparmiare e trovare strategie.

27. Nel file di mappatura Xml di MyBatis, l'id può essere ripetuto in diversi file di mappatura Xml?

  • File di mappatura Xml diversi, se configurati namespace,COSÌ id Può essere ripetuto; se non configuratonamespace,COSÌ id non può essere ripetuto;namespace Non obbligatorio, solo best practice.
  • Il motivo è namespace + id é come M ap &lt; S string , M apped S tatement &gt; Mappa<String, MappedStatement>MUNP<SantoRInG,MUNppeDSantoUNTeMeNT> La chiave da utilizzare, se non presentenamespace, solo il restante id,COSÌ,id La duplicazione può causare la sovrascrittura reciproca dei dati.Fattonamespace,natura id Puoi ripeterlo,namespace diverso,namespace + id Naturalmente è diverso.

28. Descrivere brevemente la relazione di mappatura tra il file di mappatura Xml di MyBatis e la struttura dei dati interna di MyBatis?

MyBatis incapsula tutte le informazioni di configurazione Xml in oggetti pesanti All-In-One Configuration interno. Nel file di mappatura Xml,<parameterMap> Il tag verrà analizzato comeParameterMap oggetto, ciascuno dei suoi elementi figlio verrà analizzato comeParameterMapping oggetto.<resultMap> Il tag verrà analizzato comeResultMap oggetto, ciascuno dei suoi elementi figlio verrà analizzato comeResultMapping oggetto.Ogni<select><insert><update><delete> I tag verranno analizzati comeMappedStatement Oggetto, come verrà analizzato l'SQL nel tagBoundSql oggetto.

29.In che modo MyBatis incapsula i risultati dell'esecuzione SQL in oggetti di destinazione e li restituisce? Quali sono i moduli di mappatura?

  • Il primo è usare <resultMap> I tag definiscono la relazione di mappatura tra i nomi delle colonne e i nomi degli attributi dell'oggetto uno per uno.
  • Il secondo consiste nell'utilizzare la funzione alias della colonna SQL e scrivere l'alias della colonna come nome dell'attributo dell'oggetto, ad esempio T_NAME AS NAME, il nome dell'attributo dell'oggetto è generalmente name, minuscolo, ma i nomi delle colonne non fanno distinzione tra maiuscole e minuscole. MyBatis ignorerà il caso dei nomi delle colonne e troverà in modo intelligente i nomi degli attributi dell'oggetto corrispondenti T_NAME AS NaMe, MyBatis può ancora funzionare normalmente.

Dopo aver ottenuto la relazione di mappatura tra i nomi delle colonne e i nomi degli attributi, MyBatis crea oggetti tramite la riflessione e utilizza la riflessione per assegnare valori uno per uno alle proprietà dell'oggetto e restituirli per quelle proprietà che non riescono a trovare la relazione di mappatura , l'incarico non può essere completato.

30.Oltre ai comuni tag select |. insert |. delete |, quali altri tag sono presenti nel file di mappatura Xml?

Ci sono molti altri tag, <resultMap><parameterMap><sql><include><selectKey>, oltre a SQL dinamico 9 9 9 tag:trimwheresetforeachifchoosewhenotherwisebind Aspettare.In<sql> Per i tag di frammento SQL, passare<include> I tag introducono frammenti SQL,<selectKey> Genera etichette di policy per le chiavi primarie che non supportano l'incremento automatico.

31. Nel file di mappatura MyBatis, se il tag A fa riferimento al contenuto del tag B tramite include, il tag B può essere definito dopo il tag A o deve essere definito prima del tag A?

Sebbene MyBatis analizzi il file di mappatura Xml in ordine, il tag B di riferimento può comunque essere definito ovunque e MyBatis può identificarlo correttamente.

Il principio è che MyBatis analizza il tag A e rileva che il tag A fa riferimento al tag B, ma il tag B non è stato analizzato e non esiste ancora. A questo punto, MyBatis contrassegnerà il tag A come non risolto, quindi continuerà per analizzare i tag rimanenti, inclusi i tag B., dopo che tutti i tag sono stati analizzati, MyBatis analizzerà nuovamente i tag contrassegnati come non risolti Quando si analizza il tag A, il tag B esiste già e il tag A può essere analizzato normalmente.

32. MyBatis può eseguire query di contatto uno-a-molti e uno-a-uno. Quali sono i metodi di implementazione?

Può, non solo può Uno a molti, uno a uno,Abbastanza bene Molti a molti, molti a uno . Ciò si ottiene come segue:

  • Invia un SQL separato per interrogare l'oggetto correlato, assegnarlo all'oggetto principale e quindi restituire l'oggetto principale.
  • Utilizzando query nidificate, simili alle query JOIN, una parte è il valore dell'attributo dell'oggetto A e l'altra parte è il valore dell'attributo dell'oggetto B associato. Il vantaggio è che finché viene inviato un valore dell'attributo, l'oggetto principale e il è possibile trovare l'oggetto associato.
  • sottoquery

33.MyBatis può mappare la classe di enumerazione Enum?

MyBatis può mappare le classi di enumerazione Non solo può mappare le classi di enumerazione, MyBatis può mappare qualsiasi oggetto a una colonna della tabella.Il metodo di mappatura è personalizzatoTypeHandler,compiere TypeHandler DisetParameter() EgetResult() metodi di interfaccia.

TypeHandler Ha due funzioni, una è completare il filejavaType AjdbcType La conversione, la seconda, è completatajdbcType AjavaType La conversione si riflette comesetParameter() EgetResult() I due metodi rappresentano rispettivamente l'impostazione dei parametri del segnaposto del punto interrogativo SQL e l'ottenimento dei risultati della query di colonna.

34.Cosa fa l'SQL dinamico MyBatis? Che tipo di SQL dinamico esistono? Puoi descrivere brevemente il principio di esecuzione dell'SQL dinamico?

MyBatis Dynamic SQL ci consente di scrivere SQL dinamico sotto forma di tag nel file di mappatura Xml per completare le funzioni di giudizio logico e splicing dinamico di SQL fornite da MyBatis 9 9 9 Tag SQL dinamici:trimwheresetforeachifchoosewhenotherwisebind

Il suo principio di esecuzione è utilizzare OGNL Calcolare il valore dell'espressione dall'oggetto parametro SQL e unire dinamicamente SQL in base al valore dell'espressione per completare la funzione di SQL dinamico.

35.In che modo MyBatis esegue il cercapersone? Qual è il principio del plug-in di paging?

MyBatis utilizza RowBounds L'oggetto è impaginato, è perResultSet Il paging della memoria eseguito dal set di risultati non è il paging fisico. È possibile scrivere direttamente i parametri con il paging fisico in SQL per completare la funzione di paging fisico oppure è possibile utilizzare un plug-in di paging per completare il paging fisico.

Il principio di base del plug-in di paging è utilizzare l'interfaccia plug-in fornita da MyBatis per implementare un plug-in personalizzato, intercettare l'SQL da eseguire nel metodo di intercettazione del plug-in e quindi riscrivere l'SQL in base A dialect Dialetto, aggiungi istruzioni di paginazione fisica corrispondenti e parametri di paginazione fisica.

Esempio:

select * from student
  • 1

Dopo aver intercettato l'SQL, riscrivilo come:

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

36. Descrivi brevemente il principio di funzionamento del plug-in MyBatis e come scrivere un plug-in?

MyBatis può scrivere solo per ParameterHandlerResultSetHandlerStatementHandlerExecutor Questo 4 4 4 Una sorta di plug-in di interfaccia, MyBatis utilizza il proxy dinamico di JDK per generare oggetti proxy per le interfacce che devono essere intercettate per implementare la funzione di intercettazione del metodo dell'interfaccia Ogni volta che viene eseguita,. 4 4 4 metodo di un oggetto interfaccia, entrerà nel metodo di intercettazione, in particolareInvocationHandler Diinvoke() I metodi, ovviamente, intercetteranno solo i metodi specificati per l'intercettazione.

Implementa MyBatis Interceptor Interfaccia e overrideintercept() Method, quindi scrivi le annotazioni per il plug-in e specifica quali metodi di quale interfaccia vuoi intercettare. Ricorda, non dimenticare di configurare il plug-in che hai scritto nel file di configurazione.

37. Cache di primo e secondo livello di MyBatis

  • Cache di livello 1: basata su PerpetualCache Cache locale HashMap, il suo ambito di archiviazione è Session, quando Sessionflush Oclose Successivamente, tutte le cache della sessione verranno cancellate e la cache di primo livello verrà attivata per impostazione predefinita.
  • La cache di secondo livello ha lo stesso meccanismo della cache di primo livello e viene utilizzata anch'essa per impostazione predefinita. PerpetualCache, Archiviazione HashMap, la differenza è che il suo ambito di archiviazione è MapperNamespace) e la fonte di archiviazione può essere personalizzata, ad esempio Ehcache .La cache di secondo livello non è abilitata per impostazione predefinita. Per abilitare la cache di secondo livello, è necessario implementare la classe dell'attributo della cache di secondo livello.Serializable Interfaccia di serializzazione (può essere utilizzata per salvare lo stato di un oggetto), configurabile nel suo file di mappatura<cache/>
  • Per il meccanismo di aggiornamento dei dati della cache, quando un determinato ambito (sessione cache di primo livello/spazio dei nomi cache di secondo livello) è C / U / D Dopo l'operazione, per impostazione predefinita tutti i file in questo ambitoselect La cache saràclear