Compartilhamento de tecnologia

[MyBatis] Teoria MyBatis 40 questões (2)

2024-07-12

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

Teoria MyBatis 40 questões》Contém os 2 artigos a seguir:


Teoria MyBatis 40 questões (2)

21. Como obter a chave primária gerada?

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
  • 2
  • 3
  • 4

22.QuandoClasse de entidadeO que devo fazer se os nomes dos atributos forem diferentes dos nomes dos campos na tabela?

(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>
  • 1
  • 2
  • 3
  • 4

(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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

23.Quais são as formas de escrever o Mapper?

(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.

  • existir sqlMapConfig.xml Configuração médiamapper.xml posição.
<mappers>
	<mapper resource="mapper.xml 文件的地址" />
	<mapper resource="mapper.xml 文件的地址" />
</mappers>
  • 1
  • 2
  • 3
  • 4
  • definição mapper interface.
  • Implementar integração de classe SqlSessionDaoSupportmapper 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>
  • 1
  • 2
  • 3

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

  • existir 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.
  • definição mapper interface.
<mappers>
	<mapper resource="mapper.xml 文件的地址" />
	<mapper resource="mapper.xml 文件的地址" />
</mappers>
  • 1
  • 2
  • 3
  • 4
  • 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>
  • 1
  • 2
  • 3
  • 4

(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;
    • Se mapper.xml emapper Se o nome da interface permanecer consistente, não há necessidade desqlMapConfig.xml Configurar em .
  • definição mapper interface.Percebermapper.xml nome do arquivo emapper Os nomes das interfaces devem ser consistentes e colocados no mesmo diretório.
  • Configuração 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
  • Depois de usar o scanner de spring Obter do contêinermapper objeto de implementação.

24.O que é MeuBatis ligação de interface? Quais são os métodos 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:

  • Vincular por meio de anotações é adicionar @Select@Update Aguarde as anotações, que contêm instruções SQL para vincular;
  • passar 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.

25. Quais são os requisitos para fazer chamadas usando a interface mapeadora do MyBatis?

  • Nome do método de interface do mapeador e mapper.xml de cada sql definido emid mesmo.
  • Os tipos de parâmetros de entrada dos métodos de interface do Mapper e mapper.xml de cada sql definido emparameterType do mesmo tipo.
  • Os tipos de parâmetros de saída dos métodos de interface do Mapper e mapper.xml de cada sql definido emresultType do mesmo tipo.
  • Mapper.xml no arquivonamespace Esse é o caminho de classe da interface do Mapper.

26. Como funciona esta interface Dao? Se o método na interface Dao tiver parâmetros diferentes, o método pode ser sobrecarregado?

  • O princípio de funcionamento da interface Dao é o proxy dinâmico JDK. MyBatis usará o proxy dinâmico JDK para gerar um proxy para a interface Dao durante a execução. 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.
  • Os métodos na interface Dao não podem ser sobrecarregados porque Nome totalmente qualificado + nome do método Economizando e encontrando estratégias.

27. No arquivo de mapeamento Xml do MyBatis, o id pode ser repetido em diferentes arquivos de mapeamento Xml?

  • Diferentes arquivos de mapeamento XML, se configurados 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.
  • A razão é namespace + id é tão Mapa &lt; S string , instrução M apped S &gt; 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.

28. Descreva resumidamente o relacionamento de mapeamento entre o arquivo de mapeamento Xml do MyBatis e a estrutura de dados interna do MyBatis.

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.

29.Como o MyBatis encapsula os resultados da execução SQL em objetos de destino e os retorna? Quais são os formulários de mapeamento?

  • A primeira é usar <resultMap> As tags definem o relacionamento de mapeamento entre nomes de colunas e nomes de atributos de objetos, um por um.
  • A segunda é usar a função de alias da coluna SQL e escrever o alias da coluna como o nome do atributo do objeto, como 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.

30.Além das tags comuns select | insert | delete |, quais outras tags existem no arquivo de mapeamento XML?

Existem muitas outras tags, <resultMap><parameterMap><sql><include><selectKey>, além de SQL dinâmico 9 9 9 Tag:trimwheresetforeachifchoosewhenotherwisebind 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.

31. No arquivo de mapeamento MyBatis, se a tag A referenciar o conteúdo da tag B por meio de inclusão, a tag B pode ser definida após a tag A ou deve ser definida na frente da tag A?

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.

32. O MyBatis pode realizar consultas de contato um para muitos e um para um? Quais são os métodos de implementação?

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:

  • Envie um SQL separado para consultar o objeto relacionado, atribua-o ao objeto principal e, em seguida, retorne o objeto principal.
  • Usando consultas aninhadas, semelhantes às consultas JOIN, uma parte é o valor do atributo do objeto A e a outra parte é o valor do atributo do objeto B associado. A vantagem é que, desde que um valor de atributo seja enviado, o objeto principal e o objeto associado pode ser encontrado.
  • subconsulta

33.O MyBatis pode mapear a classe de enumeração Enum?

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.

34.O que o SQL dinâmico MyBatis faz? Que tipo de SQL dinâmico existe? Você pode descrever brevemente o princípio de execução do SQL dinâmico?

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:trimwheresetforeachifchoosewhenotherwisebind

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.

35.Como o MyBatis realiza a paginação? Qual é o princípio do plug-in de paginação?

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
  • 1

Após interceptar o SQL, reescreva-o como:

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

36. Descreva resumidamente o princípio operacional do plug-in MyBatis e como escrever um plug-in?

MyBatis só pode escrever para ParameterHandlerResultSetHandlerStatementHandlerExecutor 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.

37. Cache de primeiro e segundo nível do MyBatis

  • Cache de nível 1: baseado em 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.
  • O cache de segundo nível possui o mesmo mecanismo do cache de primeiro nível e também é usado por padrão. PerpetualCache, Armazenamento HashMap, a diferença é que seu escopo de armazenamento é MapperNamespace), 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/>
  • Para o mecanismo de atualização de dados de cache, quando um determinado escopo (Sessão de cache de primeiro nível / Namespace de cache de segundo nível) é C / U / D Após a operação, por padrão, todos os arquivos neste escoposelect O cache em seráclear