minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
《Teoria MyBatis 40 questões》Contém os 2 artigos a seguir:
Adicione uma nova tag:keyProperty=“ID”
É isso.
<insert id="insert" useGeneratedKeys="true" keyProperty="userId" >
insert into user(user_name, user_password, create_time)
values(#{userName}, #{userPassword} , #{createTime, jdbcType=TIMESTAMP})
</insert>
(1) Consultando SQL Defina o alias do nome do campo na instrução para tornar o alias do nome do campo consistente com o nome do atributo da classe de entidade.
<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) Passe <resultMap>
Mapear a correspondência um-para-um entre nomes de campos e nomes de atributos de classes de entidade.
<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) Herança de classe de implementação de interface SqlSessionDaoSupport
: Para usar este método, você precisa escrever mapper
interface,mapper
Classe de implementação de interface,mapper.xml
documento.
sqlMapConfig.xml
Configuração médiamapper.xml
posição.<mappers>
<mapper resource="mapper.xml 文件的地址" />
<mapper resource="mapper.xml 文件的地址" />
</mappers>
mapper
interface.SqlSessionDaoSupport
。mapper
Pode ser usado em métodosthis.getSqlSession()
Execute adição, exclusão, modificação e verificação de dados.spring
configuração.<bean id=" " class="mapper 接口的实现">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
(2) Uso org.mybatis.spring.mapper.MapperFactoryBean
。
sqlMapConfig.xml
Configuração médiamapper.xml
posição semapper.xml
emapper
As interfaces têm o mesmo nome e estão no mesmo diretório, portanto nenhuma configuração é necessária aqui.mapper
interface.<mappers>
<mapper resource="mapper.xml 文件的地址" />
<mapper resource="mapper.xml 文件的地址" />
</mappers>
mapper.xml
meionamespace
paramapper
O endereço da interface.mapper
O nome do método na interface emapper.xml
definido emstatement
deid
ser consistente.Spring
definido em.<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="mapper 接口地址" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
(3) Uso mapper
scanner.
mapper.xml
Redação de documentos.mapper.xml
meionamespace
paramapper
O endereço da interface;mapper
O nome do método na interface emapper.xml
definido emstatement
deid
ser consistente;mapper.xml
emapper
Se o nome da interface permanecer consistente, não há necessidade desqlMapConfig.xml
Configurar em .mapper
interface.Percebermapper.xml
nome do arquivo emapper
Os nomes das interfaces devem ser consistentes e colocados no mesmo diretório.mapper
scanner.<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="mapper 接口包地址"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
spring
Obter do contêinermapper
objeto de implementação.A ligação de interface consiste em definir uma interface arbitrariamente em MyBatis e, em seguida, combinar os métodos na interface com SQL declaraçãoVinculação, podemos chamar diretamente o método de interface, então comparado com o original SqlSession
Os métodos fornecidos nos permitem ter escolhas e configurações mais flexíveis.
Existem duas maneiras de implementar a ligação de interface:
@Select
、@Update
Aguarde as anotações, que contêm instruções SQL para vincular;xml
Escreva SQL dentro para vincular. Nesse caso, você precisa especificar.xml
no arquivo de mapeamentonamespace
Deve ser o caminho completo da interface.Quando a instrução SQL for relativamente simples, use ligação de anotação. Quando a instrução SQL for relativamente complexa, use.xml
Encadernação, uso geralxml
Existem mais ligações.mapper.xml
de cada sql definido emid
mesmo.mapper.xml
de cada sql definido emparameterType
do mesmo tipo.mapper.xml
de cada sql definido emresultType
do mesmo tipo.Mapper.xml
no arquivonamespace
Esse é o caminho de classe da interface do Mapper.proxy
objeto, objeto proxyproxy
Os métodos de interface serão interceptados e executadosMappedStatement
representa o SQL e, em seguida, retorna os resultados da execução do SQL.namespace
,Então id
Pode ser repetido se não estiver configurado;namespace
,Então id
afinal, não pode ser repetido;namespace
Não é obrigatório, apenas as melhores práticas.namespace + id
é tão Mapa < S string , instrução M apped S > Mapa<String, MappedStatement>Map<Sãoremg,MappeeSãoaparaeeuenãopara> A chave a ser usada, se nenhumanamespace
, apenas o restante id
,Então,id
A duplicação pode fazer com que os dados se sobrescrevam.Entendinamespace
,natureza id
Você pode repetir,namespace
diferente,namespace + id
Naturalmente é diferente.MyBatis encapsula todas as informações de configuração Xml em objetos pesados All-In-One Configuration
interno. No arquivo de mapeamento XML,<parameterMap>
A tag será analisada comoParameterMap
objeto, cada um de seus elementos filhos será analisado comoParameterMapping
objeto.<resultMap>
A tag será analisada comoResultMap
objeto, cada um de seus elementos filhos será analisado comoResultMapping
objeto.Todo<select>
、<insert>
、<update>
、<delete>
As tags serão analisadas comoMappedStatement
Object, o SQL na tag será analisado comoBoundSql
objeto.
<resultMap>
As tags definem o relacionamento de mapeamento entre nomes de colunas e nomes de atributos de objetos, um por um.T_NAME AS NAME
, o nome do atributo do objeto geralmente é name
, minúsculas, mas os nomes das colunas não diferenciam maiúsculas de minúsculas. MyBatis ignorará as maiúsculas e minúsculas dos nomes das colunas e encontrará de forma inteligente os nomes dos atributos dos objetos correspondentes. T_NAME AS NaMe
, MyBatis ainda pode funcionar normalmente.Depois de ter o relacionamento de mapeamento entre nomes de colunas e nomes de atributos, MyBatis cria objetos por meio de reflexão e usa reflexão para atribuir valores um por um às propriedades do objeto e retorná-los para aquelas propriedades que não conseguem encontrar o relacionamento de mapeamento. , a tarefa não poderá ser concluída.
Existem muitas outras tags, <resultMap>
、<parameterMap>
、<sql>
、<include>
、<selectKey>
, além de SQL dinâmico
9
9
9 Tag:trim
、where
、set
、foreach
、if
、choose
、when
、otherwise
、bind
espere.em<sql>
Para tags de fragmentos SQL, passe<include>
Tags introduzem fragmentos SQL,<selectKey>
Gere rótulos de política para chaves primárias que não suportam incremento automático.
Embora MyBatis analise o arquivo de mapeamento XML em ordem, a tag B referenciada ainda pode ser definida em qualquer lugar e MyBatis pode identificá-la corretamente.
O princípio é que MyBatis analisa a tag A e descobre que a tag A faz referência à tag B, mas a tag B não foi analisada e ainda não existe. Neste momento, MyBatis marcará a tag A como não resolvida e continuará. para analisar as tags restantes, incluindo as tags B., depois que todas as tags forem analisadas, MyBatis analisará novamente as tags marcadas como não resolvidas. Ao analisar a tag A, a tag B já existe e a tag A pode ser analisada normalmente.
Pode, não só pode Um para muitos, um para um,Bem o suficiente Muitos para muitos, muitos para um . Isto é alcançado como se segue:
MyBatis pode mapear classes de enumeração. Além de mapear classes de enumeração, MyBatis pode mapear qualquer objeto para uma coluna da tabela.O método de mapeamento é personalizadoTypeHandler
,concluir TypeHandler
desetParameter()
egetResult()
métodos de interface.
TypeHandler
Tem duas funções, uma é completar ojavaType
parajdbcType
A conversão, a segunda está concluídajdbcType
parajavaType
A conversão é refletida comosetParameter()
egetResult()
Os dois métodos representam a definição dos parâmetros do espaço reservado do ponto de interrogação sql e a obtenção dos resultados da consulta da coluna, respectivamente.
O SQL dinâmico do MyBatis nos permite escrever SQL dinâmico na forma de tags no arquivo de mapeamento Xml para completar as funções de julgamento lógico e emenda dinâmica do SQL fornecido pelo MyBatis.
9
9
9 Tags SQL dinâmicas:trim
、where
、set
、foreach
、if
、choose
、when
、otherwise
、bind
。
Seu princípio de execução é usar OGNL
Calcule o valor da expressão do objeto de parâmetro SQL e divida SQL dinamicamente de acordo com o valor da expressão para completar a função de SQL dinâmico.
MyBatis usa RowBounds
O objeto é paginado, é paraResultSet
A paginação de memória executada pelo conjunto de resultados não é paginação física. Você pode escrever parâmetros diretamente com paginação física no SQL para concluir a função de paginação física ou pode usar um plug-in de paginação para concluir a paginação física.
O princípio básico do plug-in de paginação é usar a interface do plug-in fornecida pelo MyBatis para implementar um plug-in personalizado, interceptar o SQL a ser executado no método de interceptação do plug-in e, em seguida, reescrever o SQL de acordo para dialect
Dialeto, adicione instruções de paginação física e parâmetros de paginação física correspondentes.
Exemplo:
select * from student
Após interceptar o SQL, reescreva-o como:
select t.* from (select * from student) t limit 0, 10
MyBatis só pode escrever para ParameterHandler
、ResultSetHandler
、StatementHandler
、Executor
esse
4
4
4 Uma espécie de plug-in de interface, MyBatis usa o proxy dinâmico do JDK para gerar objetos proxy para as interfaces que precisam ser interceptadas para implementar a função de interceptação do método de interface.
4
4
4 método de um objeto de interface, ele entrará no método de interceptação, especificamenteInvocationHandler
deinvoke()
Os métodos, é claro, interceptarão apenas os métodos que você especificar para interceptar.
Implementar MyBatis Interceptor
Interface e substituiçãointercept()
Método, então escreva anotações para o plug-in e especifique quais métodos de qual interface você deseja interceptar. Lembre-se, não se esqueça de configurar o plug-in que você escreveu no arquivo de configuração.
PerpetualCache
Cache local HashMap, seu escopo de armazenamento é Sessão, quando Sessãoflush
ouclose
Depois disso, todos os caches da sessão serão limpos e o cache de primeiro nível será ativado por padrão.PerpetualCache
, Armazenamento HashMap, a diferença é que seu escopo de armazenamento é Mapper
(Namespace
), e a fonte de armazenamento pode ser personalizada, como Ehcache
.O cache de segundo nível não está habilitado por padrão. Para habilitar o cache de segundo nível, a classe de atributos de cache de segundo nível precisa ser implementada.Serializable
Interface de serialização (pode ser usada para salvar o estado de um objeto), configurável em seu arquivo de mapeamento<cache/>
。C
/ U
/ D
Após a operação, por padrão, todos os arquivos neste escoposelect
O cache em seráclear
。