le mie informazioni di contatto
Posta[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
《Teoria MyBatis 40 domande》Contiene i seguenti 2 articoli:
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) 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>
(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) 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.
sqlMapConfig.xml
Configurazione mediamapper.xml
posizione.<mappers>
<mapper resource="mapper.xml 文件的地址" />
<mapper resource="mapper.xml 文件的地址" />
</mappers>
mapper
interfaccia.SqlSessionDaoSupport
。mapper
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>
(2) Utilizzo org.mybatis.spring.mapper.MapperFactoryBean
。
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.mapper
interfaccia.<mappers>
<mapper resource="mapper.xml 文件的地址" />
<mapper resource="mapper.xml 文件的地址" />
</mappers>
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>
(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;mapper.xml
Emapper
Se il nome dell'interfaccia rimane coerente, non è necessario farlosqlMapConfig.xml
Configura in .mapper
interfaccia.Avvisomapper.xml
nome del file emapper
I nomi delle interfacce devono essere coerenti e posizionati nella stessa directory.mapper
scanner.<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="mapper 接口包地址"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
spring
Prendi dal contenitoremapper
oggetto di implementazione.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:
@Select
、@Update
Attendi le annotazioni che contengono istruzioni SQL da associare;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.mapper.xml
di ogni sql definito inid
Stesso.mapper.xml
di ogni sql definito inparameterType
dello stesso tipo.mapper.xml
di ogni sql definito inresultType
dello stesso tipo.Mapper.xml
nel fascicolonamespace
Questo è il percorso della classe dell'interfaccia Mapper.proxy
oggetto, oggetto proxyproxy
I metodi di interfaccia verranno invece intercettati ed eseguitiMappedStatement
rappresenta l'SQL e quindi restituisce i risultati dell'esecuzione SQL.namespace
,COSÌ id
Può essere ripetuto; se non configuratonamespace
,COSÌ id
non può essere ripetuto;namespace
Non obbligatorio, solo best practice.namespace + id
é come M ap < S string , M apped S tatement > 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.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.
<resultMap>
I tag definiscono la relazione di mappatura tra i nomi delle colonne e i nomi degli attributi dell'oggetto uno per uno.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.
Ci sono molti altri tag, <resultMap>
、<parameterMap>
、<sql>
、<include>
、<selectKey>
, oltre a SQL dinamico
9
9
9 tag:trim
、where
、set
、foreach
、if
、choose
、when
、otherwise
、bind
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.
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.
Può, non solo può Uno a molti, uno a uno,Abbastanza bene Molti a molti, molti a uno . Ciò si ottiene come segue:
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.
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:trim
、where
、set
、foreach
、if
、choose
、when
、otherwise
、bind
。
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.
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
Dopo aver intercettato l'SQL, riscrivilo come:
select t.* from (select * from student) t limit 0, 10
MyBatis può scrivere solo per ParameterHandler
、ResultSetHandler
、StatementHandler
、Executor
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.
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.PerpetualCache
, Archiviazione HashMap, la differenza è che il suo ambito di archiviazione è Mapper
(Namespace
) 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/>
。C
/ U
/ D
Dopo l'operazione, per impostazione predefinita tutti i file in questo ambitoselect
La cache saràclear
。